我有两个非常大的数据框架(5000万和150万),其中两个中的一些变量是相同的。我需要对两者进行比较,并在一个数据帧中添加另一列,以便在另一个数据帧中计算匹配的观察值。
例如:DF1和DF2都包含id,date,age_grp和性别变量。我想在DF1中添加另一列(match_count),显示计数,其中DF1.id = DF2.id和DF1.date = DF2.date和DF1.age_grp = DF2.age_grp和DF1.gender = DF2.gender 注意
DF1
id date age_grp gender val
101 20140110 1 1 666
102 20150310 2 2 777
103 20160901 3 1 444
104 20160903 4 1 555
105 20010910 5 1 888
DF2
id date age_grp gender state
101 20140110 1 1 10
101 20140110 1 1 12
101 20140110 1 2 22
102 20150310 2 2 33
在上面的例子中,组合“id = 101,date = 20140110,age_grp = 1,gender = 1”在DF2中出现两次,因此计数2和组合“id = 102,date = 20150010,age_grp = 2 ,gender = 2“出现一次,因此计数为1。
以下是我正在寻找的结果数据框
结果
id date age_grp gender val match_count
101 20140110 1 1 666 2
102 20150310 2 2 777 1
103 20160901 3 1 444 0
104 20160903 4 1 555 0
105 20010910 5 1 888 0
这是我目前正在做的事情,它对于小数据非常有效,但对于大数据不能很好地扩展。对于这个例子,即使在几个小时后它也没有返回任何结果。
注意:我已经完成了this主题,并没有解决规模问题
with(DF1
, mapply(
function(arg_id,arg_agegrp, arg_gender, arg_date){
sum(arg_id == DF2$id
& agegrp == DF2$agegrp
& gender_bool == DF2$gender
& arg_date == DF2$date)
},
id, agegrp, gender, date)
)
更新
Id列不是唯一的,因此可能有两个观察值,其中id,date,agegrp和sex可能相同,只有val列可能不同。
答案 0 :(得分:3)
以下是使用dplyr
df2$state=NULL#noted you do not need column state
Name=names(df2)
df2=df2%>%group_by_(.dots=names(df2))%>%dplyr::summarise(match_count=n())
Target=merge(df1,df2,by.x=Name,by.y=Name,all.x=T)
Target[is.na(Target)]=0
Target
id date age_grp gender val match_count
1 101 20140110 1 1 666 2
2 102 20150310 2 2 777 1
3 103 20160901 3 1 444 0
4 104 20160903 4 1 555 0
5 105 20010910 5 1 888 0
答案 1 :(得分:3)
data.table
也可能对您有所帮助。按指定的变量汇总DF2
,然后将其加回DF1
。
library(data.table)
setDT(DF1)
setDT(DF2)
vars <- c("id","date","age_grp","gender")
DF1[DF2[, .N, by=vars], count := N, on=vars]
DF1
# id date age_grp gender val count
#1: 101 20140110 1 1 666 2
#2: 102 20150310 2 2 777 1
#3: 103 20160901 3 1 444 NA
#4: 104 20160903 4 1 555 NA
#5: 105 20010910 5 1 888 NA