2015-03-25 69 views
1

假設我有一個像下面的兩個數據幀:使用多個「by」合併/連接兩個數據幀?

df1 = data.frame(ssuid=c(916860000285, 916860000285, 916925451999, 404454000285, 404454000285), 
       epppnum=c(101,102,101,101,102), 
       esex=c("M","F","M","M","F")) 

df2 = data.frame(ssuid=c(916860000285, 916860000285, 916925451999, 404454000285, 404454000285), 
       epppnum=c(101,102,101,101,102), 
       erace=c(1,1,2,1,1)) 

我想將它們合併,而是一個獨特的ID是ssuid和epppnum組合。我現在的解決方案是創建一個新變量,然後用它來合併。

library(dplyr) 
df1 = df1 %>% mutate(uniqueID=paste(ssuid,epppnum,sep="/")) %>% 
    select(uniqueID, esex) 
df2 = df2 %>% mutate(uniqueID=paste(ssuid,epppnum,sep="/"))%>% 
    select(uniqueID, erace) 

df = left_join(df1,df2,by="uniqueID") 

有沒有更好的方法?

謝謝!

回答

4

默認情況下,left_join會選擇所有的公共變​​量:

left_join(df1,df2) 
Joining by: c("ssuid", "epppnum") 
     ssuid epppnum esex erace 
1 916860000285  101 M  1 
2 916860000285  102 F  1 
3 916925451999  101 M  2 
4 404454000285  101 M  1 
5 404454000285  102 F  1 

,你可以請參閱上面的消息,指定一個組合,使用c來組合它們,即by = c("ssuid", "epppnum")

2

您可以使用data.table無拼接鍵,連接將被mentionning鍵來完成與setkey

library(data.table) 

setDT(df1) 
setkey(df1, ssuid, epppnum)[setDT(df2)] 

#   ssuid epppnum esex erace 
#1: 916860000285  101 M  1 
#2: 916860000285  102 F  1 
#3: 916925451999  101 M  2 
#4: 404454000285  101 M  1 
#5: 404454000285  102 F  1