评估 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
匹配,并在向前滚动一个后放弃。
如何使用同一列的值评估 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
匹配,并在向前滚动一个后放弃。