根据另一个数据框中的值计算一个数据框中的观测数量

时间:2017-08-02 03:14:59

标签: r dataframe count aggregate

我有两个非常大的数据框架(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列可能不同。

2 个答案:

答案 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