使用R中的数据表的连续行组之间的差异

dim*_*r91 3 r data.table

我试图获得连续行之间的差异,例如:

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)

akr*_*run 7

我们可以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)