使用多个“by”合并/连接两个数据帧?

时间:2015-03-25 12:40:23

标签: r dplyr

假设我有两个数据框,如下所示:

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

有更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:2)

您可以在不连接密钥的情况下使用data.table,可以通过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