评估 r 中的同一列 data.table

Evaluating same column data.table in r

如何使用同一列的值评估 data.table 的列,每个值与接下来两个位置的值。以下示例说明了问题和期望的结果。

library(data.table)
dt <- data.table(a = c(2, 3, 2, 4))   
result <- data.table(a = c(2, 3, 2, 4), b = c(T, F, NA, NA))

我们可以使用 shift 通过指定 n= 1:2 基于 'a' 创建两个 lead 列。用 lapply 循环遍历列,检查它是否等于 'a',Reduce 它到 | 的单个逻辑向量并将其分配给 'b' 列

dt[, b := Reduce(`|`, lapply(shift(a, 1:2, type = 'lead'), `==`,  a))]
dt
#   a     b
#1: 2  TRUE
#2: 3 FALSE
#3: 2    NA
#4: 4    NA

正如@Mike H. 建议的那样,如果我们只比较下一个值,那么单独执行此操作可能会更好理解

dt[, b := (shift(a, 1, type = 'lead') == a) | (shift(a, 2, type = 'lead') ==a)]

您可以对行号进行滚动连接:

dt[, r := .I]
dt[head(1:.N, -2), found := 
  dt[.SD[, .(a = a, r = r + 1L)], on=.(a, r), roll=-1, .N, by=.EACHI]$N > 0L]

   a r found
1: 2 1  TRUE
2: 3 2 FALSE
3: 2 3    NA
4: 4 4    NA

要查看其工作原理,请将 .N 替换为 x.r:

dt[head(1:.N, -2), dt[.SD[, .(a = a, r = r + 1L)], on=.(a, r), roll=-1, x.r, by=.EACHI]]

   a r x.r
1: 2 2   3
2: 3 3  NA

我们的想法是,我们从 r+1 开始寻找最近的 a 匹配,并在向前滚动一个后放弃。