非等同加入和聚合

时间:2016-12-07 18:36:24

标签: r data.table

我正在尝试使用两种方法为下面显示的数据创建摘要统计信息。在每种情况下,我在合并和过滤后聚合数据。看一下非equi连接的其他一些例子(方法2),似乎我应该能够在合并和过滤的同时进行聚合。有人可以帮忙吗?此外,可以不显式创建变量indDt_3mo

require(data.table)

#member info
mem.dt <- data.table(data=c(
    "111|2/1/2015","125|3/15/2015","225|4/20/2015","300|5/1/2015"
))
mem.dt[, c("memId","indDt"):=tstrsplit(data, "|", fixed=TRUE)][, data:=NULL]
mem.dt[, ":="(memId=as.integer(memId),indDt=as.Date(indDt, format="%m/%d/%Y"))]

#claims
claims.dt <- data.table(data=c(
"111|var1|1/10/2015","111|var1|12/15/2014","111|var1|8/15/2014","225|var1|9/30/2014","225|var2|10/30/2014"
))
claims.dt[, c("memId","var","servDt"):=tstrsplit(data, "|", fixed=TRUE)][, data:=NULL]
claims.dt[, ":="(memId=as.integer(memId),servDt=as.Date(servDt, format="%m/%d/%Y"))]


#method 1 - filter & agg after merge
mem.dt[claims.dt, on="memId"][indDt-90<=servDt & servDt<=indDt][, 
    .(cnt=uniqueN(servDt)), .(memId,var)]


#method 2 - agg after merge & filter
mem.dt[, indDt_3mo:=indDt-90]
mem.dt[claims.dt, .(memId,var,servDt), on=.(memId, indDt>servDt, indDt_3mo<=servDt), nomatch=0L][,
    .(cnt=uniqueN(servDt)), .(memId,var)]

0 个答案:

没有答案