R获取当前列的下一个值

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() 向您的代码读者明确说明这一意图。

Mic*_*ico 5

看起来您正在编写data.table代码,所以您很幸运!该shift功能是您所追求的:

DT[ , ColumnB := shift(ColumnA, type = 'lead')]
Run Code Online (Sandbox Code Playgroud)

既然你做了一些分析shift,一定要还看到了其他相关功能data.table所提供的:nafillfrollsum/ 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,我们得到了正确的数字。