如何按顺序逐行更新
How to update row by group in sequence
我有一个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") )
我想在每组 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
我尝试使用 shift 等函数,但我很难在这里动态更新行(可以这么说),
不知道有没有优雅的data.table风格的解决方案?
这里我们可以使用accumulate
library(purrr)
library(data.table)
DT[, d := accumulate(b, ~ .x + 2 *.y), by = c]
或者 Reduce
和 accumulate = TRUE
来自 base R
DT[, d := Reduce(function(x, y) x + 2 * y, b, accumulate = TRUE), by = c]
我们可以使用 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
我有一个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") )
我想在每组 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
我尝试使用 shift 等函数,但我很难在这里动态更新行(可以这么说), 不知道有没有优雅的data.table风格的解决方案?
这里我们可以使用accumulate
library(purrr)
library(data.table)
DT[, d := accumulate(b, ~ .x + 2 *.y), by = c]
或者 Reduce
和 accumulate = TRUE
来自 base R
DT[, d := Reduce(function(x, y) x + 2 * y, b, accumulate = TRUE), by = c]
我们可以使用 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