yan*_*nci 2 r data.table rolling-computation
我有一个data.table喜欢:
DT = data.table(ColumnA = c(1.51, 1.86, 3.54, 3.79, 7.7))
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建ColumnB它的下一个值ColumnA:
columnA ColumnB
1.51 1.86
1.86 3.54
3.54 3.79
3.79 7.70
7.70
Run Code Online (Sandbox Code Playgroud)
我尝试了以下操作并且它正在工作,但是现在它不起作用:
``` DT[, ColumnB:=c(NA,ColumnA[.I + 2]) ]```
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
.Call() 中的错误:提供了 18391 个项目以分配给“ColumnB”列的 18390 个项目。如果您希望“回收” RHS,请使用 rep() 向您的代码读者明确说明这一意图。
看起来您正在编写data.table代码,所以您很幸运!该shift功能是您所追求的:
DT[ , ColumnB := shift(ColumnA, type = 'lead')]
Run Code Online (Sandbox Code Playgroud)
既然你做了一些分析shift,一定要还看到了其他相关功能data.table所提供的:nafill,frollsum/ frollmean/froll等
至于为什么您的代码不起作用:
c(NA, ColumnA[.I + 2])
Run Code Online (Sandbox Code Playgroud)
第一个元素是NA; 下一个是ColumnAat 索引的向量子集.I+2。.I + 2是 的所有元素.I,上移了2。.I具有相同的长度ColumnA,所以ColumnA[.I + 2]也将具有相同的长度ColumnA-因此c(NA, ColumnA[.I + 2])具有多于一个元素ColumnA。
这就是为什么您会在错误中看到逐一注释的原因:
提供 18391 件物品,分配给 18390 件物品
如果你想做一个子集方法(这会更慢),你可以这样做:
DT[ , ColumnA := c(NA, ColumnA[-1L])]
Run Code Online (Sandbox Code Playgroud)
ColumnA[-1L]is ColumnA,减去第一个元素,因此元素比 in 少一个ColumnA,当我们与 结合时NA,我们得到了正确的数字。