R 数据表评估中的转换

R 数据表评估中的转换,r,data.table,R,Data.table,我试图在datatable中使用shift,如下所示: DT <- data.table(a = c(1,2,3,4,5,6,7), b = c("A","A","A","B","B","B","B")) DT[!is.na(shift(a, 1)), xy := shift(a, 1), by = b] DT您在第二行中得到一个NA-值的原因是因为您用过滤掉了第一行!is.na(移位(a,1)),请参见: > DT[, !is.na(shift(a, n = 1))] [1] F

我试图在datatable中使用
shift
,如下所示:

DT <- data.table(a = c(1,2,3,4,5,6,7), b = c("A","A","A","B","B","B","B"))
DT[!is.na(shift(a, 1)), xy := shift(a, 1), by = b]

DT您在第二行中得到一个
NA
-值的原因是因为您用
过滤掉了第一行!is.na(移位(a,1))
,请参见:

> DT[, !is.na(shift(a, n = 1))]
[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
这不包括在
by
-操作中,因为
i
中的过滤是在分组之前完成的


因此,
xy:=shift(a,1)
将只查看第2行到第7行。

谢谢,这是可行的,但是为什么我必须在那里指定
填充值,而不是在
j
中?现在您也更改了解决方案。为什么?第一种方法同样有效。请再解释一下你在做什么。我以前从未见过在
j
中使用乘法器。我想知道它是否适用于更大的例子。比如说,
a
偏移2也必须是非na。“那么我们就把所有的东西都乘起来?”塔利克3233补充道:“谢谢,我明白了。”。但现在您将解决方案删除为well@Talik3233这是故意的。如果要先按组应用筛选器,然后创建新变量,可以执行以下操作:
DT[,.SD[!is.na(shift(a,1))],by=b][,xy:=shift(a,n=1),by=b][