2015-03-25 70 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