当我想使用列范围中的变量查询列时,我无法从最新版本的..j
中的data.table
语法中获取所需的行为,然后操纵该变量。举例来说,这是一个表格:
A <- data.table(myValA = c(6,23,7,2,5), myValB = c(43,12,7,89,2))
valA <- "myValA"
valB <- "myValB"
我想通过两列的元素产品获取元素:
A[, myValA * myValB]
[1] 258 276 49 178 10
但是我想通过引用来调用列,使用调用范围中的变量valA
和valB
。要简单地访问变量,..valA
语法可以正常工作。
A[, ..valA]
myValA
1: 6
2: 23
3: 7
4: 2
5: 5
,同样适用于..valB
。但是当我尝试将j
中的两列相乘时,使用旧的with=False
样式或新的..j
样式命令,我会收到错误:
A[, ..valA * ..valB]
Error in eval(jsub, SDenv, parent.frame()) : object '..valA' not found
A[, valA * valB, with = FALSE]
Error in valA * valB : non-numeric argument to binary operator
我在这里缺少什么?
更新
我已经掌握了解决这个问题的一些合适方法(下面给akrun欢呼),但我也试图更多地了解为什么这不起作用。至少,我对语法的理解没有让我明白为什么不应该这样做。
答案 0 :(得分:2)
我们可以在.SDcols
中指定,然后使用Reduce
进行元素乘法
A[, Reduce(`*`, .SD), .SDcols = c(valA, valB)]
#[1] 258 276 49 178 10
或者不是有两个对象,而是创建一个对象
v1 <- c(valA, valB)
A[, ..v1][, do.call(`*`, .SD)]
#[1] 258 276 49 178 10
或者我们可以单独评估并乘以
(A[, ..valA] * A[, ..valB])[[1]]
#[1] 258 276 49 178 10