如何使用* _join()从dplyr中连接2个表,当连接变量名称不同并存储在另一个变量中时?
例如
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
但这会给出错误 –
df1 %>% left_join(df2,by=c(var1 = var2)) # #2 doesn't work Error: cannot join on columns 'x2' x 'var1': index out of bounds
令人惊讶的是,
df1 %>% left_join(df2,by=c("x1" = var2)) # #3 works
解决方法
这里的问题是,如果公用列在data.frames中具有不同的名称,则必须提供一个命名矢量.看看你的例子会发生什么:
当您直接提供名称时,它可以工作:
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
您提供的命名矢量是:
c("x1" = "x2") # x1 #"x2"
现在,如果您使用字符向量,则命名向量将更改为:
var1 = "x1" var2 = "x2" c(var1 = var2) #var1 # <~~ this is why it doesn't work #"x2"
目前我不知道是否有一个“干净”的方式来解决这个问题.解决方法是根据需要进行以下调整以构造命名向量:
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
这是因为:
setNames(var2,var1) # x1 #"x2"
希望它有帮助.
注意:您可以使用名称< - 像这样做一样:
df1 %>% left_join(df2,by = `names<-`(var2,var1))
但是Hadley建议使用setNames方法.