【发布时间】:2017-11-08 23:29:11
【问题描述】:
我需要计算列值相对于第 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 d1.X d1.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 个元素的差异(这将产生 d0.X 和 d0.Y 列,如上述代码的最后一行所尝试的那样)。请帮忙
【问题讨论】:
-
那是什么语言/环境?
-
不知道你为什么要做
.SD[3, names(.SD)[cols]],也许你想要.SD[3]。另外我猜你有一个错字,分配给 cols.d 而不是 cols.d0 或 cols.d1? -
.SD[3] 返回整个第 3 行,从而产生错误(试试自己 - 我在 code.Tx 中修复了错字) - 有趣的是,我想要实现的是关键数据之一信号处理中的预处理步骤,当第 N 个测量值用作基线时,所有其他测量值都与基线信号相关。必须有一个简单的方法来做到这一点!
-
嗯,.SD 是过滤到您在 .SDcols 中包含的任何元素的行,即 cols,因此即使您使用正确的语法(@ 987654326@ 参数,请参阅
?data.table)。如果我理解正确,你可以试试lapply(.SD, function(z) z - z[3])。顺便说一句,我看到你提到的错误......一个笨拙的解决方法是.SD-.SD[rep(3,.N)] -
df[, (cols.d0) := lapply(.SD, function(z) z - z[3]) , keyby=K, .SDcols=cols]和df[, (cols.d0) := .SD-.SD[rep(3,.N)] , keyby=K, .SDcols=cols]都有效!整洁的。谢谢!如果您发布答案,我会接受。
标签: r data.table