计算R中data.table列(带.SD)的值间差异

时间:2017-11-08 23:29:12

标签: r data.table

我需要计算列值相对于第N个值的相对变化。请参阅以下代码:

library(data.table)
df <- data.table(K=c(rep(1,5),rep(2,5)), X=(1:10)^2, Y=2^(1:10))

df[, d.X1:= X - shift(X,fill=0,type="lag"),keyby=K]  # WORKS
df[, d.X0:= X - .SD[3,X],keyby=K] # WORKS

cols <- 2:3; 
cols.d1 = paste0("d1.", names(df)[cols]);  cols.d0 = paste0("d0.", names(df)[cols])
df[, (cols.d1) := .SD - shift(.SD,fill=0,type="lag"),keyby=K, .SDcols=cols]  # WORKS
df[, (cols.d0) := .SD - .SD[3,names(.SD)[cols]], keyby=K, .SDcols=cols]  # <=== DOESN'T WORK

如上面的代码所示:
- 我知道如何使用shift() - 使用.SD /.SDcols计算单个和多个列的相邻行值之间的差异。
- 我也知道如何计算单个列的第N个元素的差异(在本例中N = 3)。

这是输出

    K   X    Y d.X1 d.X0 d.X d.Y
 1: 1   1    2    1   -8   1   2
 2: 1   4    4    3   -5   3   2
 3: 1   9    8    5    0   5   4
 4: 1  16   16    7    7   7   8
 5: 1  25   32    9   16   9  16
 6: 2  36   64   36  -28  36  64
 7: 2  49  128   13  -15  13  64
 8: 2  64  256   15    0  15 128
 9: 2  81  512   17   17  17 256
10: 2 100 1024   19   36  19 512

但是,我无法弄清楚如何计算多列相对于第N个元素的差异(参见上面代码中的最后一行)。请帮忙

1 个答案:

答案 0 :(得分:0)

感谢Frank上面的评论:

两者

df[, (cols.d0) := .SD-.SD[rep(3,.N)] , keyby=K, .SDcols=cols] 

{{1}}

的工作。