r - 使用 'shift' 中的序列和条件

标签 r data.table

假设我有一个包含 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

最佳答案

一个选项是Reduceshift 输出将是一个 list 列,这些列可以 Reduced 为单个逻辑 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/

相关文章:

r - 在 R 中使用 grep 以相反的方式过滤观察结果

R,数据表 : find all combinations of a list excluding each element paired with itself

r - 每行的 data.table 函数太慢

r - 通过变量列表执行滚动求和的优雅、快速方法

r - 如何为 r 中的转换变量创建汇总统计表

r - R 中的键值映射

在 R 中按模式重命名列

r - 在避免循环的同时计算 "smaller"行数比其他行数

r - 修改 R 因子?

带有 MAC 的 RODBC 不起作用。使用 unixODBC 和 Rstudio