gpt4 book ai didi

r - 在 data.table 中使用 .EACHI 时如何访问 `i` 的所有列

转载 作者:行者123 更新时间:2023-12-04 12:51:13 25 4
gpt4 key购买 nike

根据 ?data.table 当使用 x[i,j]i 是一个 data.tablei的列可以用j中的i.column访问。我的问题是如何一次访问所有列?

例子:

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 的列 B 乘以 DT2 的数字 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

最佳答案

事实上,似乎没有像 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) 我得到的 DTDT2 与发布的不同OP。)

编辑:GitHub 上的功能请求

我刚刚注意到这个功能已经被请求了on GitHub .

关于r - 在 data.table 中使用 .EACHI 时如何访问 `i` 的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46942703/

25 4 0