Альтернатива для моего медленного вложенного цикла с оператором if? - PullRequest
0 голосов
/ 10 апреля 2019

Я получил два больших фрейма данных (df с 7038 строками и df2 с 14076 строками).Я хочу сравнить их и добавить значения, если определенные поля совпадают.

Я пробовал вложенный цикл for с оператором if, но его выполнение занимает несколько часов.

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.Кто-нибудь знает хорошую, более быструю альтернативу?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Похоже, проблема слияния. Вы можете объединить два набора данных по дате, а затем по команде. Если вы знакомы с SQL, вы также можете использовать пакет RSQLite, это еще быстрее.

0 голосов
/ 10 апреля 2019

Предлагаю заглянуть в команду merge .

...