首页 > 解决方案 > 强制相邻事件 data.table 之间的最小间隔

问题描述

我有一个包含参与者评估和日期的数据集。参与者在每次活动结束后的一段时间内都不会被评估,因此我需要忽略在此期间的额外评估。

目前我已经通过一些 hacky 循环实现了这一点,但是有循环和比较,我的实际数据集有数十万行。我想知道是否有人可以想出一个更“纯”的 data.table 解决方案。

library(data.table)
exclusionPeriod = 5

dt = data.table(id = c('a','a','a','a','b','b','b','c','c','c','c'),
                start = c(1, 2, 7, 9, 1, 8, 12, 2, 4, 5, 8))

modelOut = data.table(id = c('a','a','b','b','c','c'),
                      start = c(1, 7, 1, 8, 2, 8))

print(dt)
print(modelOut)

dt[,diff := c(0, diff(start)), by = id]    
dt[,csum := cumsum(diff), by = id]

maxIts = 100
its = 0
while (nrow(dt[csum>exclusionPeriod]) & its < maxIts) {
  dt[csum>exclusionPeriod, diff := c(0, diff(start)), by = id]   
  dt[csum>exclusionPeriod, csum := cumsum(diff), by = id]
  its = its+1
}

out = dt[csum==0,.(id,start)]
print(out)
print(all.equal(modelOut,out))

标签: rdata.table

解决方案


推荐阅读