【问题标题】:Alternative for my slow nested loop with if-statement?使用 if 语句替代我的慢速嵌套循环?
【发布时间】: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 %&gt;% left_join(df2, by = c('HomeTeam' = 'Team')) %&gt;% mutate(GoalScoreHome = GoalScore5.2) %&gt;% select(Date, HomeTeam, AwayTeam, FTR, GoalScoreHome, GoalScoreAway) %&gt;% left_join(df2, by = c('AwayTeam' = 'Team')) %&gt;% mutate(GoalScoreHome = GoalScore5.2)
  • 我同意@C.Braun,但我会在left_join 上将“日期”添加到by,因为“团队”和“日期”的组合用作唯一标识符。
  • @C.Braun 如果没有第二个 left_join 并且像 Recle Vibal 建议的那样添加日期,这可以完美地工作。谢谢!

标签: r if-statement nested-loops


【解决方案1】:

我建议查看merge 命令。

【讨论】:

    【解决方案2】:

    似乎是一个合并问题。您可以先按日期合并两个数据集,然后按团队合并。如果你熟悉 SQL,也可以使用 RSQLite 包来做,速度更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      相关资源
      最近更新 更多