Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr:如何按名称选择联接列?_R_Dplyr - Fatal编程技术网

dplyr:如何按名称选择联接列?

dplyr:如何按名称选择联接列?,r,dplyr,R,Dplyr,我想使用dplyr的left_join将值(“new”)从一个DF传输到另一个DF 如果我不知道键的名称,但只知道它是数据集中的第一个变量,我怎么做 require("dplyr") testData1 <- data.frame(idvar=c(1,2,3), b=c("a","b","c"), c=c("i","ii","iii")) testData2 <- data.frame(identif

我想使用dplyr的left_join将值(“new”)从一个DF传输到另一个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]="
require(“dplyr”)

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

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]))

希望这有帮助

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

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>
left\u连接(
testData1,
将_重命名为(testData2,1,~names(testData1)[1]),
by=名称(testData1)[1]
)
#idvar b.x c.x b.y c.y新
#1 a i a i var1
#2 b ii b NA var2
#3 c三

测试结果2考虑使用<代码> SENDATA(A,B)< /代码>作为<代码>结构(A,名称=B)< /代码>的一个缩写。谢谢,并将其作为一个选项。在这里,SETIDENT的优点是什么?除了需要更少的打字之外,<代码> SETNET/<代码>对于长向量也更有效率。这是一个相关的问答: