我有两个非常大的数据框(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, sex = 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
这是我目前正在做的事情,它适用于小数据,但不适用于大数据。对于这种情况,即使在几个小时后它也没有返回任何结果。
注意:我已经浏览了这个线程,它没有解决规模问题
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 列可以不同。
这是我将通过使用解决此问题的方法 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句