将变量传递给data.table

时间:2018-01-26 02:35:22

标签: r variables filter data.table subset

我有一个关于将变量传递到data.table来过滤行的问题。 我在一个函数中使用它,其中data.table中的过滤器列的名称可能会更改。

只要参数名称与data.table列名称不同,我就会理解它是如何工作的。 但是,参数的名称很可能与data.table列名相同。如果发生这种情况,我的代码就会中断。有没有办法确保我的代码在任何一种情况发生时都不会破坏?

# Example:

DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
DT2 = data.table(x2=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)

# This works
x <- "x2"
DT2[get(x) == "b"]
DT2[DT2[[x]] == "b"]

# This doesn't work
x <- "x"
DT[get(x) == "b"]
DT[DT[[x]] == "b"]

# I can get x="x" to work if I use eval, but then it would break if x!="x"
x <- "x"
DT[eval(x) == "b"]     # Works
x <- "x2"
DT2[eval(x) == "b"]    # Doesn't work

感谢任何帮助。 谢谢

2 个答案:

答案 0 :(得分:1)

以这种方式使用“eval”(而非“获取”):

gem install sass

有效!

x <- "x"

DT[DT[,eval(x)]=="b",]
   x y v
1: b 1 1
2: b 3 2
3: b 6 3

在第二种情况下,您没有列“x”,但它仍然有用。

答案 1 :(得分:1)

对于此处相等匹配的情况,连接起作用:

DT[.("b"), on=x, nomatch=0]