我在最新版本的data.table中从..j语法中获取所需行为时遇到问题,当我想使用列范围中的变量查询列时,然后操纵该变量.举例来说,这是一个表:
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中的两列相乘时,使用old with = False样式或新的.j style命令,我得到错误:
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欢呼),但我也试图更多地了解为什么这不起作用.至少,我对语法的理解没有让我明白为什么不应该这样做.
最佳答案 我们可以在.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