2015-01-24 16 views
12

Wie zwei Tabellen mit * _join() von dplyr beizutreten, wenn die Join-Variablennamen anders sind und in einer anderen Variablen gespeichert?R: Standardauswertung für * _join (dplyr)

z.B.

df1 = data_frame(x1 = 1:10,y1 = 21:30) 
df2 = data_frame(x2 = 6:15,y2 = 26:35) 
df3 = data_frame(x1 = 6:15,y2 = 26:35) 

var1 = "x1" 
var2 = "x2" 

df1 %>% left_join(df3,by=c(var1)) # #1 works 

aber das gibt Fehler -

df1 %>% left_join(df2,by=c(var1 = var2)) # #2 doesn't work 
Error: cannot join on columns 'x2' x 'var1': index out of bounds 

überraschend, das funktioniert -

df1 %>% left_join(df2,by=c("x1" = var2)) # #3 works 

Antwort

17

Das Problem hierbei ist, dass Sie einen benannten Vektor zu liefern, wenn die gemeinsame Spalte unterschiedliche Namen hat in den data.frames. Sehen Sie, was in Ihrem Beispiel passiert:

Es funktioniert, wenn Sie die Namen direkt beliefern:

df1 %>% left_join(df2, by = c("x1" = "x2")) 
#Source: local data frame [10 x 3] 
# 
# x1 y1 y2 
#1 1 21 NA 
#2 2 22 NA 
#3 3 23 NA 
#4 4 24 NA 
#5 5 25 NA 
#6 6 26 26 
#7 7 27 27 
#8 8 28 28 
#9 9 29 29 
#10 10 30 30 

Und der genannten Vektor Sie liefern ist:

c("x1" = "x2") 
# x1 
#"x2" 

Nun, wenn Sie Zeichenvektoren verwenden, die Vektor namens Änderungen an:

var1 = "x1" 
var2 = "x2" 

c(var1 = var2) 
#var1    # <~~ this is why it doesn't work 
#"x2" 

ich weiß nicht, ob es eine „saubere“ Art und Weise, dies zu lösen in DPLY momentan. Eine Abhilfe ist die folgende zwicken den benannten Vektor zu konstruieren, wie erforderlich:

df1 %>% left_join(df2, by = setNames(var2, var1)) 
#Source: local data frame [10 x 3] 
# 
# x1 y1 y2 
#1 1 21 NA 
#2 2 22 NA 
#3 3 23 NA 
#4 4 24 NA 
#5 5 25 NA 
#6 6 26 26 
#7 7 27 27 
#8 8 28 28 
#9 9 29 29 
#10 10 30 30 

Das funktioniert, weil:

setNames(var2, var1) 
# x1 
#"x2" 

Hoffe, es hilft.


Hinweis: Sie könnten das gleiche tun mit names<- wie so:

df1 %>% left_join(df2, by = `names<-`(var2, var1)) 

aber Hadley empfiehlt stattdessen den setNames Ansatz.

+0

Bitte verwenden Sie nicht die 'Namen <-' Gemeinheit -' setNames() 'ist viel besser – hadley

+0

Ich habe meine Antwort bearbeitet, um das zu reflektieren. –