?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
答案 0 :(得分:5)
确实,似乎没有像x.SD
或i.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发布的DT
和DT2
不同的数据。)
我刚刚注意到已经请求了此功能on GitHub。