【发布时间】:2021-08-19 08:40:05
【问题描述】:
我需要根据一个非常大的data.table中另一列的条件值来获取一列的梯度。
> require(data.table)
> DT = data.table( ID = c(rep('A', 8), rep('B', 6)),
Condition = c(0,1,0,0,1,1,0,1,0,0,1,0,0,1),
Value = c(4,3,2,1,4,3,2,1,4,3,2,1,4,3))
我想按 ID 获取“值”列的滚动梯度,仅适用于 Condition == 1 的行。
> desired_output
ID Condition Value Gradient
1: A 0 4 NA # condition isn't met so no gradient
2: A 1 3 0 # condition is met but there is no predecessor. Gradient set to 0
3: A 0 2 NA # condition isn't met so no gradient
4: A 0 1 NA # condition isn't met so no gradient
5: A 1 4 1 # condition is met and gradient is 4-3=1
6: A 1 3 -1 # condition is met and gradient is 3-4=-1
7: A 0 2 NA # condition isn't met so no gradient
8: A 1 1 -2 # condition is met and gradient is 1-3=-2
9: B 0 4 NA
10: B 0 3 NA
11: B 1 2 0
12: B 0 1 NA
13: B 0 4 NA
14: B 1 3 1
如果可能的话,我更喜欢原生 data.table 解决方案。
请注意:可以通过子设置 DT[Condition == 1] 然后重新加入结果来做到这一点。如果可能,我想避免子设置和重新加入。
【问题讨论】:
标签: r data.table conditional-statements gradient