加入来自不同季节/年的两个数据集,与体育有关(例如,NHL,1991和1992年季节)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加入来自不同季节/年的两个数据集,与体育有关(例如,NHL,1991和1992年季节)相关的知识,希望对你有一定的参考价值。

在一定年限内,我有NHL团队的数据集。我想知道加入这些数据集的最佳方法。例如,我有1991年和1992年的芝加哥黑鹰队统计数据,包括游戏(GP),胜利(W),损失(L)等。

如何在不创建两个单独的列GP.x和GP.y的情况下将这些集合连接在一起?

我用dput()来获得前十个团队及其各自的统计数据:


# 1991 team stats - first ten teams

structure(list(Team = c("Chicago Blackhawks*", "St. Louis Blues*", 
   "Los Angeles Kings*", "Boston Bruins*", "Calgary Flames*", 
   "Montreal Canadiens*", "Pittsburgh Penguins*", "New York Rangers*", 
   "Washington Capitals*", "Buffalo Sabres*"), 
GP = c("80", "80", "80", "80", "80", "80", "80", "80", "80", "80"), 
W = c("49", "47", "46", "44", "46", "39", "41", "36", "37", "31"), 
L = c("23", "22", "24", "24", "26", "30", "33", "31", "36", "30"), 
T = c("8", "11", "10", "12", "8", "11", "6", "13", "7", "19"), 
Pts = c("106", "105", "102", "100", "100", "89", "88", "85", "81","81"), 
`Pts %` = c(".663", ".656", ".638", ".625", ".625", ".556", ".550", 
   ".531", ".506", ".506"), 
GF = c("284", "310", "340", "299", "344", "273", "342", "297", "258", 
   "292"), 
GA = c("211", "250", "254", "264", "263", "249", "305", "265", "258", 
   "278"), 
SRS = c("0.85", "0.70", "1.04", 
   "0.32", "0.98", "0.20", "0.42", "0.36", "0.00", "0.08"), 
SOS = c("-0.06", "-0.05", "-0.04", "-0.12", "-0.03", "-0.10", "-0.04", 
   "-0.04", "0.00", "-0.09"), 
`TG/G` = c("6.19", "7.00", "7.43", "7.04", "7.59", "6.53", "8.09", 
   "7.03", "6.45", "7.13"), 
EVGF = c("177", "230", "252", "214", "236", "201", "241", "197", "181", 
   "204"), 
EVGA = c("132", "177", "173", "192", "178", "185", "220", "182", "199", 
   "208"), 
PP = c("87", "70", "80", "74", "91", "66", "89", "91", "64", "73"), 
PPO = c("393", "348", "391", "351", "384", "357", "388", "389", "340", 
   "400"), 
`PP%` = c("22.14", "20.11", "20.46", "21.08", "23.70", "18.49", "22.94", 
   "23.39", "18.82", "18.25"), 
PPA = c("68", "55", "63", "64", "77", "54", "73", "73", "44", "62"), 
PPOA = c("425", "339", "370", "368", "420", "282", "351", "362", "314", 
   "368"), 
`PK%` = c("84.00", "83.78", "82.97", "82.61", "81.67", "80.85", "79.20", 
   "79.83", "85.99", "83.15"), 
SH = c("20", "10", "8", "11", "17", "6", "12", "9", "13", "15"), 
SHA = c("10", "18", "18", "8", "8", "10", "12", "10", "15", "8"), 
`PIM/G` = c("29.9", "24.6", "27.6", "20.8", "27.1", "17.6", "20.4", 
   "23.4", "22.8", "21.3"), 
`oPIM/G` = c("28.2", "25.3", "30.5", "23.3", "25.9", "19.5", "21.3", 
   "24.1", "25.3", "22.1"), 
S = c("2564", "2550", "2410", "2512", "2604", "2385", "2416", "2444", 
   "2370", "2410"), 
`S%` = c("11.1", "12.2", "14.1", "11.9", "13.2", "11.4", "14.2", "12.2", 
   "10.9", "12.1"), 
SA = c("2214", "2345", "2412", "2240", "2200", "2316", "2723", "2550", 
   "2112", "2432"), 
`SV%` = c(".905", ".893", ".895", ".882", ".880", ".892", 
   ".888", ".896", ".878", ".886"),
PDO = c("", "", "", "", "", "", "", "", "", "")), 
.Names = c("Team", "GP", "W", "L", "T", "Pts", "Pts %", "GF", "GA", 
   "SRS", "SOS", "TG/G", "EVGF", "EVGA", "PP", "PPO", "PP%", "PPA", 
   "PPOA", "PK%", "SH", "SHA", "PIM/G", "oPIM/G", "S", "S%", "SA", 
   "SV%", "PDO"), 
row.names = 2:11, class = "data.frame")

# 1992 team stats - first ten teams

structure(list(Team = c("New York Rangers*", "Washington Capitals*", 
   "Detroit Red Wings*", "Vancouver Canucks*", "Montreal Canadiens*", 
   "Pittsburgh Penguins*", "Chicago Blackhawks*", "New Jersey Devils*", 
   "Boston Bruins*", "Los Angeles Kings*"), 
GP = c("80", "80", "80", 
   "80", "80", "80", "80", "80", "80", "80"),
W = c("50", "45", "43", "42", "41", "39", "36", "38", "36", "35"),
L = c("25", "27", "25", "26", "28", "32", "29", "31", "32", "31"), 
T = c("5", "8", "12", "12", "11", "9", "15", "11", "12", "14"), 
Pts = c("105", "98", "98", "96", "93", "87", "87", "87", "84", "84"), 
`Pts %` = c(".656", ".613", ".613", ".600", ".581", ".544", ".544", 
   ".544", ".525", ".525"), 
GF = c("321", "330", "320", "285", "267", "343", "257", "289", "270", 
   "287"), 
GA = c("246", "275", "256", "250", 
   "207", "308", "236", "259", "275", "296"), 
SRS = c("1.02", "0.78", "0.74", "0.31", "0.64", "0.52", "0.22", "0.48", 
   "-0.09", "-0.19"), 
SOS = c("0.08", "0.09", "-0.06", "-0.13", "-0.12", "0.08", "-0.04", 
   "0.10", "-0.03", "-0.08"), 
`TG/G` = c("7.09", "7.56", "7.20", "6.69", "5.93", "8.14", "6.16", 
   "6.85", "6.81", "7.29"), 
EVGF = c("226", "224", "230", "188", "189", "235", "165", "215", "186", 
   "197"), 
EVGA = c("174", "200", "171", "167", "142", "217", "150", "181", "189", 
   "208"), 
PP = c("81", "92", "72", "85", "74", "92", "81", "59", "77", "79"), 
PPO = c("387", "412", "386", "439", "379", "423", "467", "338", "406", 
   "411"), 
`PP%` = c("20.93", "22.33", "18.65", "19.36", "19.53", "21.75", "17.34", 
   "17.46", "18.97", "19.22"), 
PPA = c("60", "60", "78", "76", "60", "77", "76", "68", "72", "76"), 
PPOA = c("395", "368", "419", "382", "320", "383", "482", "374", "363", 
   "417"), 
`PK%` = c("84.81", "83.70", "81.38", "80.10", "81.25", "79.90", 
   "84.23", "81.82", "80.17", "81.77"), 
SH = c("14", "14", "18", 
   "12", "4", "16", "11", "15", "7", "11"), 
SHA = c("12", "15", 
   "7", "7", "5", "14", "10", "10", "14", "12"), 
`PIM/G` = c("22.4", "21.8", "25.6", "25.7", "19.3", "23.7", "33.0", 
   "20.0", "21.8", "26.9"), 
`oPIM/G` = c("24.1", "24.2", "23.9", "28.4", "22.0", 
   "23.9", "31.8", "20.4", "23.7", "25.6"), 
S = c("2632", "2481", "2478", "2669", "2443", "2542", "2646", "2495", 
   "2664", "2419"), 
`S%` = c("12.2", "13.3", "12.9", "10.7", "10.9", "13.5", "9.7", 
   "11.6", "10.1", "11.9"), 
SA = c("2543", "2270", "2238", "2299", "2227", "2518", "2028", "2290", 
   "2339", "2663"), 
`SV%` = c(".903", ".879", ".886", ".891", ".907", ".878", ".884", 
   ".887", ".882", ".889"), 
PDO = c("", "", "", "", "", "", "", "", "", "")), 
.Names = c("Team", "GP", "W", "L", "T", "Pts", "Pts %", "GF", "GA", 
   "SRS", "SOS", "TG/G", "EVGF", "EVGA", "PP", "PPO", "PP%", "PPA", 
   "PPOA", "PK%", "SH", "SHA", "PIM/G", "oPIM/G", "S", "S%", "SA", 
   "SV%", "PDO"), 
row.names = 2:11, class = "data.frame")

我知道加入这些套装可能很难,但任何建议/想法都会很棒!谢谢!

答案

问题是尝试合并,连接或cbind两个具有相同列名的数据框将为您提供列表名称,如GP.x,您说您不想要,或者当您尝试创建多个列时会抛出错误同名。您可以验证两个数据框具有相同的列名称,如下所示:

names(df91) == names(df92)
#>  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
#> [15] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
#> [29] TRUE

例如,在单个列GP下观察所有的GP观察结果更合乎逻辑,其中观察与它们发生的年份划分,而不是两个GP列,并且没有明确的方式知道哪一年是哪一年。这也不会很好地扩展 - 如果你正在刮取得分数据,我猜你在某些方面你会想要的不仅仅是这两年。

你想要绑定行。您可以为每个数据框指定一年中的列,并使用基数R中的rbind将它们绑定到一个数据框中。

df91$year <- 1991
df92$year <- 1992

df_base <- rbind(df91, df92)
head(df_base)
#>                  Team GP  W  L  T Pts Pts %  GF  GA  SRS   SOS TG/G EVGF
#> 2 Chicago Blackhawks* 80 49 23  8 106  .663 284 211 0.85 -0.06 6.19  177
#> 3    St. Louis Blues* 80 47 22 11 105  .656 310 250 0.70 -0.05 7.00  230
#> 4  Los Angeles Kings* 80 46 24 10 102  .638 340 254 1.04 -0.04 7.43  252
#> 5      Boston Bruins* 80 44 24 12 100  .625 299 264 0.32 -0.12 7.04  214
#> 6     Calgary Flames* 80 46 26  8 100  .625 344 263 0.98 -0.03 7.59  236
#> 7 Montreal Canadiens* 80 39 30 11  89  .556 273 249 0.20 -0.10 6.53  201
#>   EVGA PP PPO   PP% PPA PPOA   PK% SH SHA PIM/G oPIM/G    S   S%   SA  SV%
#> 2  132 87 393 22.14  68  425 84.00 20  10  29.9   28.2 2564 11.1 2214 .905
#> 3  177 70 348 20.11  55  339 83.78 10  18  24.6   25.3 2550 12.2 2345 .893
#> 4  173 80 391 20.46  63  370 82.97  8  18  27.6   30.5 2410 14.1 2412 .895
#> 5  192 74 351 21.08  64  368 82.61 11   8  20.8   23.3 2512 11.9 2240 .882
#> 6  178 91 384 23.70  77  420 81.67 17   8  27.1   25.9 2604 13.2 2200 .880
#> 7  185 66 357 18.49  54  282 80.85  6  10  17.6   19.5 2385 11.4 2316 .892
#>   PDO year
#> 2     1991
#> 3     1991
#> 4     1991
#> 5     1991
#> 6     1991
#> 7     1991

或者你可以用dplyrbind_rowsmutate一步一步创建年份列。 bind_rows的优势还在于不限于2个参数,所以如果你有超过这两年的数据,你可以扩展它。

df_dplyr <- dplyr::bind_rows(
  dplyr::mutate(df91, year = 1991),
  dplyr::mutate(df92, year = 1992)
)
head(df_dplyr)
#>                  Team GP  W  L  T Pts Pts %  GF  GA  SRS   SOS TG/G EVGF
#> 1 Chicago Blackhawks* 80 49 23  8 106  .663 284 211 0.85 -0.06 6.19  177
#> 2    St. Louis Blues* 80 47 22 11 105  .656 310 250 0.70 -0.05 7.00  230
#> 3  Los Angeles Kings* 80 46 24 10 102  .638 340 254 1.04 -0.04 7.43  252
#> 4      Boston Bruins* 80 44 24 12 100  .625 299 264 0.32 -0.12 7.04  214
#> 5     Calgary Flames* 80 46 26  8 100  .625 344 263 0.98 -0.03 7.59  236
#> 6 Montreal Canadiens* 80 39 30 11  89  .556 273 249 0.20 -0.10 6.53  201
#>   EVGA PP PPO   PP% PPA PPOA   PK% SH SHA PIM/G oPIM/G    S   S%   SA  SV%
#> 1  132 87 393 22.14  68  425 84.00 20  10  29.9   28.2 2564 11.1 2214 .905
#> 2  177 70 348 20.11  55  339 83.78 10  18  24.6   25.3 2550 12.2 2345 .893
#> 3  173 80 391 20.46  63  370 82.97  8  18  27.6   30.5 2410 14.1 2412 .895
#> 4  192 74 351 21.08  64  368 82.61 11   8  20.8   23.3 2512 11.9 2240 .882
#> 5  178 91 384 23.70  77  420 81.67 17   8  27.1   25.9 2604 13.2 2200 .880
#> 6  185 66 357 18.49  54  282 80.85  6  10  17.6   19.5 2385 11.4 2316 .892
#>   PDO year
#> 1     1991
#> 2     1991
#> 3     1991
#> 4     1991
#> 5     1991
#> 6     1991

reprex package创建于2018-06-18(v0.2.0)。

以上是关于加入来自不同季节/年的两个数据集,与体育有关(例如,NHL,1991和1992年季节)的主要内容,如果未能解决你的问题,请参考以下文章

从特定季节提取滞后数据,但仅针对特定数据集,如 R 中的变量所示

C# LINQ 与两个不同数据集上的条件 where 子句连接

显示来自两个不同数据集的数据,其中一个数据集为空

s-s-rS 2008 使用来自同一数据集的不同总和在条形图顶部绘制折线图

当每个季节有不同的模型时预测价格

使用多个数据集创建 seaborn 散点图矩阵 (PairGrid)