在data.table中的j表达式中使用..col

时间:2017-05-12 19:00:30

标签: r data.table

当我想使用列范围中的变量查询列时,我无法从最新版本的..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

但是我想通过引用来调用列,使用调用范围中的变量valAvalB。要简单地访问变量,..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欢呼),但我也试图更多地了解为什么这不起作用。至少,我对语法的理解没有让我明白为什么不应该这样做。

1 个答案:

答案 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