在data.table

时间:2017-10-25 21:57:58

标签: r data.table

?data.table使用x[i,j] i data.table时,i可以使用i.column j来访问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 1}}。 我的问题是如何一次访问所有列?

示例:

B

现在说我想将DT的{​​{1}}列与B的{​​{1}}相乘,以匹配DT2列的每个匹配值。 也就是说

A

我可以执行以下操作,但仅仅因为我知道这些列名为0.82122120 * 1.3586796 0.59390132 * 1.3586796 ... B,因为我足够耐心地编写所有列。

我怎么能用100列做类似的事情呢?

C

1 个答案:

答案 0 :(得分:5)

确实,似乎没有像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

(请注意,这些数字与OP不同,因为使用set.seed(1L)我确实得到了与OP发布的DTDT2不同的数据。)

编辑:GitHub上的功能请求

我刚刚注意到已经请求了此功能on GitHub