【发布时间】:2019-08-08 02:20:18
【问题描述】:
我正在处理这个篮球比赛数据,其中包含大约 50,000 行的数据框游戏。我正在尝试比较每支球队(A 和 B)在每场比赛中的统计数据。
我有另一个名为 teamStats 的数据框,其中有大约 3000 行,每行包含每个赛季的球队。
到目前为止,我已经组装了如下代码:
for (i in 1:nrow(games)) {
if (length(which(((teamStats$Year == games$Season[i])==1) & (teamStats$teamID == games$teamA[i]))) == 1) {
selectTeamA <- teamStats[which(((teamStats$Year == games$Season[i])==1) & (teamStats$teamID == games$teamA[i])),4:45]
} else {
selectTeamA <- as.numeric(rep(NA, ncol(differences)))
}
if (length(which(((teamStats$Year == games$Season[i])==1) & (teamStats$teamID == games$teamB[i]))) == 1) {
selectTeamB <- teamStats[which(((teamStats$Year == games$Season[i])==1) & (teamStats$teamID == games$teamB[i])),4:45]
} else {
selectTeamB <- as.numeric(rep(NA, ncol(differences)))
}
differences[i,] <- selectTeamA - selectTeamB
}
基本上,此代码在对正确的赛季进行子集化后,为每个团队 A 和 B 搜索正确的 teamID。由于每个赛季的每支球队都没有出现在球队统计中,所以我现在用 NA 填补了缺失的行。 “差异”数据框是一个空数据框,它将填充我在 for 循环中的团队 A 和 B 的统计数据差异。
为了让您了解数据:
游戏 - 前 6 行
Season teamA teamB winner scoreA scoreB
108123 2010 1143 1293 A 75 70
108124 2010 1198 1314 B 72 88
108125 2010 1108 1326 B 60 100
108126 2010 1107 1393 B 43 75
108127 2010 1143 1178 A 95 61
teamStats - 前 6 行和仅前 6 列用于空间 - 完整数据框中具有不同统计信息的大量列。代码为teamID找到正确的行,然后减去G W L等stat列
School Year teamID G W L
1 abilene christian 2018 1101 32 16 16
2 air force 2018 1102 31 12 19
3 akron 2018 1103 32 14 18
4 alabama a&m 2018 1105 31 3 28
5 alabama-birmingham 2018 1412 33 20 13
结束这篇很长的帖子,我的问题。我的 for 循环代码有效并填充了差异数据框。问题是运行此代码需要 20-30 分钟。我对处理这么多数据不是很有经验。有什么我不知道的技术吗?如何以更有效的方式重写此代码?
【问题讨论】:
标签: r performance dataframe for-loop bigdata