【发布时间】:2019-04-10 19:36:29
【问题描述】:
我有两个大数据框(df 有 7038 行,df2 有 14076 行)。 如果某些字段相同,我想比较它们并添加值。
我尝试了一个带有 if 语句的嵌套 for 循环,但它需要几个小时才能完成。
df:
Date HomeTeam AwayTeam FTR GoalScoreHome GoalScoreAway
<date> <chr> <chr> <chr> <chr> <chr>
1 1995-08-18 For Sittard PSV Eindhoven A NA NA
2 1995-08-19 Go Ahead Eagles Groningen D NA NA
3 1995-08-19 Roda JC Heerenveen D NA NA
4 1995-08-19 Willem II Sparta H NA NA
5 1995-08-20 Ajax Utrecht H NA NA
6 1995-08-20 Feyenoord Vitesse H NA NA
7 1995-08-20 Graafschap Nijmegen A NA NA
8 1995-08-20 Volendam Twente A NA NA
9 1995-08-20 Waalwijk NAC Breda D NA NA
10 1995-08-23 Groningen For Sittard H NA NA
df2:
Round Date Team GDPerGame PointsPerGame GoalScore5.2
1 1 1995-08-20 Ajax 4 3 NA
2 2 1995-08-25 Ajax 6 3 NA
3 3 1995-09-10 Ajax 4 3 NA
4 4 1995-09-17 Ajax 4 3 NA
5 5 1995-09-20 Ajax 4 3 NA
6 6 1995-09-24 Ajax 1 3 22
我正在使用以下循环:
for (i in 1:nrow(df)) {
for (j in 1:nrow(df2)) {
if(df$HomeTeam[i] == df2$Team[j] & df$Date[i] == df2$Date[j] ){
df$GoalScoreHome[i] = df2$GoalScore5.2[j]
}
else if(df$AwayTeam[i] == df2$Team[j] & df$Date[i] == df2$Date[j]){
df$GoalScoreAway[i] = df2$GoalScore5.2[j]
}
}
}
这按预期工作,但正如我之前所说的那样太慢了
我找到了一些嵌套循环的替代方案,但其中没有 if 语句。有谁知道更好、更快的替代方案?
【问题讨论】:
-
我建议你合并两个数据帧,然后对合并的数据帧进行计算。
-
尝试使用
dplyr。类似df %>% left_join(df2, by = c('HomeTeam' = 'Team')) %>% mutate(GoalScoreHome = GoalScore5.2) %>% select(Date, HomeTeam, AwayTeam, FTR, GoalScoreHome, GoalScoreAway) %>% left_join(df2, by = c('AwayTeam' = 'Team')) %>% mutate(GoalScoreHome = GoalScore5.2) -
我同意@C.Braun,但我会在
left_join上将“日期”添加到by,因为“团队”和“日期”的组合用作唯一标识符。 -
@C.Braun 如果没有第二个 left_join 并且像 Recle Vibal 建议的那样添加日期,这可以完美地工作。谢谢!
标签: r if-statement nested-loops