我需要计算列值相对于第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个元素的差异(参见上面代码中的最后一行)。请帮忙
答案 0 :(得分:0)
感谢Frank上面的评论:
两者
df[, (cols.d0) := .SD-.SD[rep(3,.N)] , keyby=K, .SDcols=cols]
和
{{1}}
的工作。