R:*_join (dplyr) 的标准评估
R: Standard evaluation for *_join (dplyr)
当连接变量名称不同并存储在另一个变量中时,如何使用 dplyr 中的 *_join() 连接 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"
我不知道目前 dplyr 中是否有 "clean" 方法可以解决这个问题。解决方法是根据需要进行以下调整以构建命名向量:
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
方法。
当连接变量名称不同并存储在另一个变量中时,如何使用 dplyr 中的 *_join() 连接 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"
我不知道目前 dplyr 中是否有 "clean" 方法可以解决这个问题。解决方法是根据需要进行以下调整以构建命名向量:
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
方法。