假设我有一个包含 a
天列表的 data.table(无需担心周末/工作日):
dt <- data.table(a = 1:10)
如果我想获得满足给定条件的前一天(即第 4 天的前一天),我可以简单地使用
dt[shift(a == 4, type = "lead")]
但是,如果我想要第 4 天前的两天,我不能使用
dt[any(shift(a == 4, 1:2, type = "lead"))]
因为这会引发错误。
确实,我设法做到这一点的唯一方法是使用
dt[apply(apply(dt[, shift(a,
1:2,
type = "lead")],
1, `==`, 4),
2, any) == TRUE]
这太不雅了,不可能是对的。
那么,这是怎么做到的呢?
更糟糕的是,我的最终目标是在多天之前获得 X 天。所以我希望做类似 dt[any(shift(a %in% c(4, 10), 1:2, type = "lead"))]
的事情,但是它(和类似的尝试,例如将 %in
测试从 shift
中排除)显然是行不通的。
为了清楚起见,使用上面的 data.table,如果我想要第 4 天和第 10 天之前的两天,我希望输出是:
a
1: 2
2: 3
3: 8
4: 9
最佳答案
一个选项是Reduce
。 shift
输出将是一个 list
列,这些列可以 Reduce
d 为单个逻辑 vector
dt[dt[, Reduce(`|`, shift(a==4, 1:2, type="lead"))]]
# a
#1: 2
#2: 3
注意:这也是矢量化的
关于r - 使用 'shift' 中的序列和条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58017779/