给定一个data.table,其中包含三个字段member_id,provider_id和srvc_dt.我需要计算一对提供者看到的不同成员的数量.据说,如果访问发生在180天内,则会员访问过两家提供商.这用于使用#visits的阈值构建无向图并查找连接的组件.
我使用的是Cartesian product with filter data.table中建议的方法.
我需要运行的实例有超过300万条记录,运行时间超过5分钟.有没有一种重写方式或新的data.table函数,以便它运行得更快?
require(data.table)
nmem <- 5000
data.dt <- data.table(member_id=sample(10000:1000000,nmem,replace=TRUE), provider_id=sample(1000:2000,nmem,replace=TRUE),
srvc_dt=sample(seq(as.Date('2014/01/01'), as.Date('2015/01/01'), by="day"), nmem, replace=TRUE))
setkey(data.dt, member_id)
prov_pair.dt <- data.dt[data.dt, {
idx = provider_id<i.provider_id & abs(srvc_dt-i.srvc_dt)<180
list(provider_id1 = provider_id[idx],
srvc_dt1 = srvc_dt[idx],
provider_id2 = i.provider_id[any(idx)],
srvc_dt2 = i.srvc_dt[any(idx)]
)
}, by=.EACHI, allow=TRUE]
prov_pair_agg.dt <- prov_pair.dt[, .(weight=length(unique(member_id))), .(provider_id1,provider_id2)]
最佳答案 简单的左连接然后过滤:
prov_pair.dt <- data.dt[data.dt,allow.cartesian=T][provider_id<i.provider_id &
abs(srvc_dt-i.srvc_dt)<180,]
provider_id< i.provider_id防止重复计算对x,y和y,x的相同访问次数. 另外,现在在计算prov_pair_agg.dt时使用provider_id和i.provider_id而不是provider_id1和provider_id2:
prov_pair_agg.dt <- prov_pair.dt[, .(weight=length(unique(member_id))),
.(provider_id,i.provider_id)]
在ngm = 1,000,000的16GB内存机器上,按当前方法,这需要1.487s和106.034s.