2015-01-24 25 views
12

Birleştirme değişken adları farklı olduğunda ve başka bir değişkende saklandığında, dplyr'dan * _join() öğesini kullanarak 2 tablo nasıl birleştirilir?R: * _join (dplyr) için standart değerlendirme

örn.

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 

ama bu hata verir -

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

şaşırtıcı bu işleri -

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

cevap

17
Buradaki sorun, ortak sütun farklı adları varsa adlandırılmış vektörü tedarik olması

data.frames içinde.

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 

Ve tedarik adlı vektör:

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

Şimdi karakter vektörleri kullanırsanız, doğrudan isimleri tedarik zaman

Çalışıyor: sizin örnekte neler olduğunu öğrenin adlandırılmış vektör değişiklikleri: dPly bu sorunu gidermek için bir "temiz" yolu varsa

var1 = "x1" 
var2 = "x2" 

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

bilmiyorum Şu anda r.

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

Umarım yardımcı olur çünkü:

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 

Bu çalışır: Bir geçici çözüm gerektiği gibi adlandırılmış vektörü yapılandırmak için aşağıdaki çimdik olduğunu.


Not:

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

ama Hadley yerine setNames yaklaşımı kullanılmasını önerir: Eğer şöyle names<- ile aynı yapabilirdi.

+0

Lütfen isimleri kullanmayın <- 'nastiness -' setNames() 'çok daha iyi – hadley

+0

Bunu yanıtlamak için cevabımı düzenledim. –