R 数据表评估中的转换
我试图在datatable中使用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
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][