按组有条件地子集 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")
处理滞后值。在这种情况下,每个组的第一行的默认 shift
是 NA
,这是行不通的,因此我们使用 fill=0
来模拟有一个非 1 的前置事件。
我有以下 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")
处理滞后值。在这种情况下,每个组的第一行的默认 shift
是 NA
,这是行不通的,因此我们使用 fill=0
来模拟有一个非 1 的前置事件。