给定一个包含三个字段
我正在使用Cartesian product with filter data.table中建议的方法。
我需要运行的实例有超过300万条记录,并且需要超过5分钟才能运行。是否有一种重新编写或新的data.table函数的方法,使其运行更快?
member_id
,provider_id
和srvc_dt
的data.table
。我需要计算一对提供者看到的不同成员数。如果访问发生在180天内,则认为成员已经访问了两个提供者。这用于使用访问阈值构建无向图并查找连接组件。我正在使用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)]
...Join results in 2009362 rows; more than 2000000 = nrow(x)+nrow(i)...
。另一种方法的优点是它的内存效率更高(请参见@Arun帖子中的最后一行)。 - ironvallow.cartesian=T
,但只要有足够的内存,这种方式仍然很快。 - webbdata.dt[, if (.N >= 2) .SD, by = member_id]
开始(当然这取决于数据)。 - eddi