R: dplyr中*_join的标准评估

16
如何使用dplyr中的*_join()函数连接两个表格,当连接变量名称不同时且存储在另一个变量中?
例如:
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
1个回答

24
这里的问题在于,如果数据框中的公共列具有不同的名称,则必须提供一个命名向量。看看你的例子会发生什么:

当您直接提供名称时,它可以工作:

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"

我不知道目前在dplyr中是否有一种“清洁”的方式来解决这个问题。一个解决方法是对构建所需的命名向量进行以下调整:

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" 

希望这有所帮助。
注意:您可以像这样使用names<-
df1 %>% left_join(df2, by = `names<-`(var2, var1))

但是 Hadley 建议使用 setNames 方法。

1
请不要使用 names<- 的恶劣方式 - setNames() 更好。 - hadley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接