按组有条件地子集 data.table

Subset data.table conditionally by group

我有以下 data.table,

   id time event
1:  1    1     1
2:  1    2     0
3:  2    1     0
4:  2    2     1

# Generate data;
library(data.table)

data <- data.table(
    id = c(1,1,2,2),
    time = c(1,2,1,2),
    event = c(1,0,0,1)
)

我想保留 event == 1 之前的所有行,这样数据看起来像

   id time event
1:  1    1     1
2:  2    1     0
3:  2    2     1

我正在寻找 data.table 解决方案。

data[, .SD[cumsum(shift(event, type = "lag", fill = 0) > 0) < 1,], by = id]
#       id  time event
#    <num> <num> <num>
# 1:     1     1     1
# 2:     2     1     0
# 3:     2     2     1

cumsum(.) < 1的使用实际上是“保持直到结果为真”(因为真和为1+,所以all-false的累加和仍然为0)。但是,由于我们需要在第一次看到 event == 1 保持 当前行,因此我们需要使用 shift(event, type="lag") 处理滞后值。在这种情况下,每个组的第一行的默认 shiftNA,这是行不通的,因此我们使用 fill=0 来模拟有一个非 1 的前置事件。