使用与列同名的变量对data.table进行子集化

时间:2014-02-09 12:13:22

标签: r data.table subset

我希望使用与导致某些问题的列具有相同名称的变量对data.table进行子集化:

dt <- data.table(a=sample(c('a', 'b', 'c'), 20, replace=TRUE),
                 b=sample(c('a', 'b', 'c'), 20, replace=TRUE),
                 c=sample(20), key=c('a', 'b'))

evn <- environment()
a <- 'b'
dt[a == a]

#Expected Result
dt[a == 'b']

我遇到了this possible solution

env <- environment()
dt[a == get('a',env)]

但它和:

一样不方便
this.a = a
dt[a == this.a]

还有另一个优雅的解决方案吗?

2 个答案:

答案 0 :(得分:5)

目前,临时解决方案可能是,

`..` <- function (..., .env = globalenv())
{
  get(deparse(substitute(...)), env = .env)
}

..(a)
## [1] "b"

dt[a==..(a)]
##    a b  c
## 1: b a 15
## 2: b a 11
## 3: b b  8
## 4: b b  4
## 5: b c  5
## 6: b c 12

虽然这看起来很优雅,但我仍然在等待这种范围问题的更强大的解决方案。

根据@ mnel的建议编辑,

`..` <- function (..., .env = sys.parent(2))
{
  get(deparse(substitute(...)), env = .env)
}

答案 1 :(得分:3)

现在很简单(因为data.table中引入了theano.scan语法):

..()

或在您的特定情况下更简单(因为dt[eval(dt[, a %in% ..a])] 是第一列):

a