2017-08-04 1 views
2

Ich möchte dplyrs left_join verwenden, um Werte ("neu") von einem DF zu einem anderen zu übertragen.dplyr: Wie Join Spalten nach Name auswählen?

Wie kann ich das tun, wenn ich den Namen des Schlüssels nicht weiß, aber nur weiß, dass es die erste Variable im Datensatz ist?

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]=" 
+0

Dies ist ein verwandtes Q & A: https://stackoverflow.com/questions/28125816/r-standard-evalation-for- join-dplyr –

Antwort

2

Sie könnten den Namen Vektor im Voraus erstellen und dann kommen Sie wie folgt vor:

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

oder in einer Zeile:

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

oder alternativ, wie von Artem vorgeschlagen:

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

Hoffe das er lps!

+0

Verwenden Sie 'setNames (a, b)' als Kurzform für 'structure (a, names = b)'. –

+0

Danke, hinzugefügt, dass als eine Option. Was ist der Vorteil von setNames gegenüber der Struktur hier? – Florian

+0

"setNames" ist nicht nur weniger typisierend, sondern auch effizienter für lange Vektoren. –

3

Eine Alternative ist, die beiden Schlüsselspalten den gleichen Namen zu machen:

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> 
Verwandte Themen