当使用data.table中的.EACHI时,我该如何访问所有列的“i”?

3
根据 ?data.table 的说明,在使用 x[i,j] 时,其中 i 是一个 data.table,可以通过 i.columnj 中访问 i 的列。
我的问题是如何一次性访问所有列?
例子:
library(data.table)
set.seed(1L)
DT <- data.table(A=c('a','a','b','b','c','c'),
                 B=rnorm(6L),
                 C=rnorm(6L),
                 key='A')
#   A           B           C
#1: a  0.82122120  0.61982575
#2: a  0.59390132 -0.05612874
#3: b  0.91897737 -0.15579551
#4: b  0.78213630 -1.47075238
#5: c  0.07456498 -0.47815006
#6: c -1.98935170  0.41794156

DT2 <- data.table(A=c('a','b','c'),
                  B=rnorm(3L),
                  C=rnorm(3L),
                  key='A')
#   A          B           C
#1: a  1.3586796 -0.05380504
#2: b -0.1027877 -1.37705956
#3: c  0.3876716 -0.41499456

现在,假设我想要将DT的列BDT2的列B相乘,对于每个匹配列A的值进行操作。

0.82122120 * 1.3586796
0.59390132 * 1.3586796
...

我可以做以下操作,但这仅因为我知道列名为BC,并且我足够耐心写出所有列。
那么如果有100个列怎么办呢?
DT[DT2,{print(as.matrix(.SD) %*% diag(c(i.B,i.C)))},by=.EACHI]
          [,1]         [,2]
[1,] 1.1157764 -0.033349750
[2,] 0.8069216  0.003020009
            [,1]      [,2]
[1,] -0.09445960 0.2145397
[2,] -0.08039401 2.0253136
            [,1]       [,2]
[1,]  0.02890673  0.1984297
[2,] -0.77121518 -0.1734435
1个回答

4

实际上,似乎没有像x.SDi.SD这样的特殊符号来指定所有列(除了在by = ...中使用的列)。

但是,可以使用mget()作为解决方法,返回预期的结果:

DT2_cols <- paste0("i.", setdiff(names(DT2), key(DT2)))
DT[DT2,{print(as.matrix(.SD) %*% diag(mget(DT2_cols)))},by=.EACHI]
           [,1]        [,2]
[1,]  0.3891785 -0.02190195
[2,] -0.1140867 -0.03317559
          [,1]         [,2]
[1,]  1.850667 -0.009322052
[2,] -3.533068  0.004944318
           [,1]      [,2]
[1,]  0.3706735 1.4268738
[2,] -0.9229703 0.3679482
Empty data.table (0 rows) of 3 cols: A,B,C

请注意,由于使用了set.seed(1L),所以数字与OP的不同,我得到的DTDT2与OP发布的不同。

编辑:在GitHub上的功能请求

我刚刚注意到,这个功能已经在GitHub上被请求。


是的,我明白了,我会打开一个功能请求,我认为这可能会很有用。 - statquant
是的,那可能会很有用。请贴上FR的链接。谢谢。 - Uwe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接