如何按组按顺序更新行

use*_*546 2 r sequential data.table rolling-computation

我有一个 dt:

library(data.table)

DT <- data.table(a = c(1,2,3,4,5), b = c(4,5,6,7,8), c = c("X","X","X","Y","Y") ) 
Run Code Online (Sandbox Code Playgroud)

我想在每组 C 列中添加一列 d:

  • 第一行值应与b[i]
  • 每个组中的倒数第二行应该是 d[i-1] + 2*b[i]

预期结果:

   a b c d
1: 1 4 X 4
2: 2 5 X 14
3: 3 6 X 26
4: 4 7 Y 7
5: 5 8 Y 23
Run Code Online (Sandbox Code Playgroud)

我尝试使用诸如 shift 之类的函数,但我很难在这里动态更新行(可以这么说),想知道是否有任何优雅的 data.table 样式解决方案?

M--*_*M-- 6

我们可以使用cumsum和减去第一行[1]

DT[, d := cumsum(2 * b) - b[1], .(c)][]

#>    a b c  d
#> 1: 1 4 X  4
#> 2: 2 5 X 14
#> 3: 3 6 X 26
#> 4: 4 7 Y  7
#> 5: 5 8 Y 23
Run Code Online (Sandbox Code Playgroud)