我试图获得连续行之间的差异,例如:
dt_in <- data.table(
Game = c(1,1,2,2,3,3,4,4),
ID = c(1,2,3,4,5,6,7,8),
weight = c(150,120,151,160,190,170,170,170)
)
Run Code Online (Sandbox Code Playgroud)
我想计算每个ID,他们有多少或多少重量比他们的其他ID Game.到目前为止我所做的是:
dt_in[, d1 := diff(weight), by = list(Game)]
Run Code Online (Sandbox Code Playgroud)
这使:
> dt_in
Game ID weight d1
1: 1 1 150 -30
2: 1 2 120 -30
3: 2 3 151 9
4: 2 4 160 9
5: 3 5 190 -20
6: 3 6 170 -20
7: 4 7 170 0
8: 4 8 170 0
Run Code Online (Sandbox Code Playgroud)
但我想要的是:
> dt_in
Game ID weight d1 want
1: 1 1 150 -30 30
2: 1 2 120 -30 -30
3: 2 3 151 9 -9
4: 2 4 160 9 9
5: 3 5 190 -20 20
6: 3 6 170 -20 -20
7: 4 7 170 0 0
8: 4 8 170 0 0
Run Code Online (Sandbox Code Playgroud)
我们可以diff通过'Game'将'weight'分组,乘以-1并连接两个值.
dt_in[, want := {v1 <- diff(weight); list(c(-v1, v1))} , by = Game]
dt_in
# Game ID weight want
#1: 1 1 150 30
#2: 1 2 120 -30
#3: 2 3 151 -9
#4: 2 4 160 9
#5: 3 5 190 20
#6: 3 6 170 -20
#7: 4 7 170 0
#8: 4 8 170 0
Run Code Online (Sandbox Code Playgroud)
或@Frank的紧凑选项
dt_in[, want := c(-1,1)*diff(weight), by=Game]
Run Code Online (Sandbox Code Playgroud)