merge/join两个数据帧使用多个"by"?
merge/join two data frames using more than one "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")
有没有更好的方法?
谢谢!
您可以在不连接键的情况下使用 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
默认情况下,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")
。
假设我有如下两个数据框:
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")
有没有更好的方法?
谢谢!
您可以在不连接键的情况下使用 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
默认情况下,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")
。