2016-11-14 5 views
0

Ich möchte meine Lösung in R. beschleunigenverschachtelte schneller für Schleife R

Ich habe bekam zwei Dataframes‘, sagen wir mal: df_one:

A | B | C | D | same 
1 | 3 | 2 | 4 | NA 
6 | 5 | 1 | 3 | NA 
5 | 3 | 7 | 3 | NA 
3 | 4 | 8 | 3 | NA 

Und df_two:

A | B 
1 | 3 
6 | 2 
5 | 3 

Wenn beide Instanzen in Spalte A und B identisch sind (oder in einer Sequenz von .5), möchte ich eine 1, sonst eine 0 in einer zusätzlichen Spalte in df_one (df_one $ same).

Ich tat dies mit dem folgenden Code:

df_one$same <- NA 

for (i in 1:nrow(df_one)) { 
    for (j in 1:nrow(df_two)) { 
    distance <- seq(df_two[j, 2]-.5, df_two[j, 2]+.5, by = .1) 
    print(i) 
    if ((df_one[i, 1] == df_two[j, 1]) & (df_one[i, 2] %in% df_two[i, 2])){ 
     df_one[i, 5] <- 1 
     break} 
    else{df_one[i, 5] <- 0} 
    } 
} 

mir jemand kann mit einer schnelleren Lösung helfen?

+1

eine 'merge' tun, und dann die Spalten vergleichen, wird es viel schneller als Schleifen verwenden. – ytk

+0

Ihr Code ist nicht reproduzierbar und Ihr gewünschtes Verhalten ist unklar. 'hour_df' ist nicht definiert, und es ist unklar, was Sie zu erreichen versuchen. Unter [hier] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) erfahren Sie mehr darüber, wie Sie eine gute R-Frage schreiben –

Antwort

4

Eine schnellere Lösung zu was ich denken Sie fragen, ist left_join von dplyr zu verwenden und überprüfen Sie explizit auf die Übereinstimmungen.

left_join(df_one, df_two, by = "A") %>% 
    mutate(same = B.x == B.y) 

gibt

A B.x C D same B.y 
1 1 3 2 4 TRUE 3 
2 6 5 1 3 FALSE 2 
3 5 3 7 3 TRUE 3 
4 3 4 8 3 NA NA