【问题标题】:dplyr: How to select join columns by name?dplyr:如何按名称选择连接列?
【发布时间】:2017-08-04 12:37:09
【问题描述】:

我想使用 dplyr 的 left_join 将值(“新”)从一个 DF 传输到另一个。

如果我不知道键的名称,而只知道它是数据集中的第一个变量,我该怎么做?

require("dplyr")

testData1 <- data.frame(idvar=c(1,2,3),
                    b=c("a","b","c"),
                    c=c("i","ii","iii"))

testData2 <- data.frame(identification=c(1,2),
                    b=c("a","b"),
                    c=c("i","NA"),
                    new=c("var1","var2"))

# now do a left join to obtain values of the new variable in the old dataset


(testResult1 <- left_join(testData1,testData2))
# var2 is not in the results because of the "NA" in testData2!


(testResult2 <- left_join(testData1,testData2,
                         by=c("idvar"="identification"))) 
# works as expected! ... but we do not know the name of the idvar!


(testResult3 <- left_join(testData1,testData2,
                         by=c(names(testData1)[1]=names(testData2)[1]))) 
# Error: unexpected '=' in:
#   "testResult3 <- left_join(testData1,testData2,
#                             by=c(names(testData1)[1]="

【问题讨论】:

标签: r dplyr


【解决方案1】:

另一种方法是使两个键列具有相同的名称:

left_join(
    testData1,
    rename_at(testData2, 1, ~ names(testData1)[1]),
    by = names(testData1)[1]
)

#   idvar b.x c.x  b.y  c.y  new
# 1     1   a   i    a    i var1
# 2     2   b  ii    b   NA var2
# 3     3   c iii <NA> <NA> <NA>

# > (testResult2 <- left_join(testData1,testData2, by=c("idvar"="identification")))
#   idvar b.x c.x  b.y  c.y  new
# 1     1   a   i    a    i var1
# 2     2   b  ii    b   NA var2
# 3     3   c iii <NA> <NA> <NA>

【讨论】:

    【解决方案2】:

    您可以提前创建命名向量,然后按如下方式加入:

    join_by = colnames(testData2)[1]
    names(join_by)=colnames(testData1)[1]
    left_join(testData1,testData2, by=join_by)
    

    或一行:

    left_join(testData1,testData2, 
            by=structure(colnames(testData2)[1], names=colnames(testData1)[1]))
    

    或者,按照 Artem 的建议:

    left_join(testData1,testData2, 
                   by=setNames(colnames(testData2)[1], colnames(testData1)[1]))
    

    希望这会有所帮助!

    【讨论】:

    • 考虑使用setNames( a, b ) 作为structure( a, names = b ) 的简写。
    • 谢谢,作为选项添加。这里 setNames 相对于结构的优势是什么?
    • 除了需要更少的输入之外,setNames 对于长向量也更有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2023-01-31
    • 2021-07-19
    • 2020-08-23
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多