【问题标题】:How to compute inter-value differences in data.table columns (with .SD) by groups?如何按组计算 data.table 列(使用 .SD)中的值间差异?
【发布时间】: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


【解决方案1】:

感谢以上 Frank 的评论:

两个

 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] []

工作。以下是所需的输出:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 2013-12-30
    • 2023-03-19
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多