2017-03-17 12 views
0

Ich habe eine R Datenrahmen df_bigverschmelzenden R Datenrahmen auf mulitple Spalten

Candidate Status 
A   1 
B   10 
C   12 
D   15 
E   25 

usw.

I habe einen zweiten Datenrahmen df_small

Candidate_1 Candidate_2 
A    C 
B    E  
C    D 

I df_small und df_big zusammenführen will get df_final, die aussieht wie

Candidate_1 Candidate_2  Status_1  Status_2 
A    C     1   12 
B    E     10   25 
C    D     12   15 

Ich habe versucht, etwas in der Art

df_small_1 = merge(x=df_small,y = df_big,by.x = "Candidate_1",by.y="Candidate") 

df_small_2 = merge(x=df_small,y = df_big,by.x = "Candidate_2",by.y="Candidate") 

aber ich weiß nicht, wie zu kombinieren df_small_1 und df_small_2 zu df_small

+0

so etwas wie 'df_final = merge (x = merge (x = df_small, y = df_big, by.x = "Candidate_2", by.y = "Candidate"), y = df_big, by.x = "Candidate_1", by.y = "Candidate") ' – HubertL

+0

Es ist einfacher, einfach zuerst in eine lange Form umzuformen:' library (tidyverse); df_small%>% sammeln (var, Candidate)%>% left_join (df_big) ' – alistaire

Antwort

1

Sie müssen zweimal verbinden, einmal für jede der beiden Kandidaten-Status :

df_result <- merge(x=df_small, y=df_big, by.x="Candidate_1", by.y="Candidate") 
df_result <- merge(x=df_result, y=df_big, by.x="Candidate_2", by.y="Candidate") 
0

Zusammenführen ist eine teure Operation. Sie können dies besser tun, ohne dass eine Zusammenführungsoperation erforderlich ist, die eine Kombination aus diesen Funktionen und der Indizierung verwendet. Ich habe Benchmarks für die Merge- und Non-Merge-Lösung durchgeführt. Die Antwort gibt auch die Reihenfolge der Spalten genau nach Bedarf.

doit <- function(df_small, df_big) 
{ 

    # Which elements do we need to copy 
    indx1 <- df_big[["Candidate"]] %in% df_small[["Candidate_1"]] 

    indx2 <- df_big[["Candidate"]] %in% df_small[["Candidate_2"]] 

    # Copy them 
    df_needed <- data.frame(Candiate_1 = df_big[indx1, "Candidate"], Candiate_2 = df_big[indx2, "Candidate"], 
          Status_1 = df_big[indx1, "Status"], Status_2 = df_big[indx2, "Status"]) 

} 

#merge two times 
doit_merge <- function(df_small, df_big) 
{ 
    df_result <- merge(x=df_small, y=df_big, by.x="Candidate_1", by.y="Candidate") 
    df_result <- merge(x=df_result, y=df_big, by.x="Candidate_2", by.y="Candidate") 
} 

library(microbenchmark) 

# benchmark results 
microbenchmark(
    doit(df_small, df_big) , 
    doit_merge(df_small, df_big) 
) 

ERGEBNISSE

Unit: microseconds 
expr        min  lq  mean median  uq  max neval cld 
doit(df_small, df_big)  676.570 758.472 1077.203 834.0115 978.9315 4591.473 100 a 
doit_merge(df_small, df_big) 1329.327 1449.205 1986.995 1612.3940 2021.9070 5966.780 100 b 
Verwandte Themen