【问题标题】:R: Standard evaluation for *_join (dplyr)R:*_join (dplyr) 的标准评估
【发布时间】:2015-03-23 10:21:09
【问题描述】:

当连接变量名称不同并存储在另一个变量中时,如何使用 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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这里的问题是,如果公共列在 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 中是否有一种“干净”的方法来解决这个问题。一种解决方法是根据需要进行以下调整以构造命名向量:

    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&lt;- 做同样的事情:

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

    但 Hadley 建议改用 setNames 方法。

    【讨论】:

    • 请不要使用names&lt;- 肮脏 - setNames() 更好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2017-10-27
    • 2020-09-17
    • 2019-03-23
    相关资源
    最近更新 更多