我有一个关于将变量传递到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
感谢任何帮助。 谢谢
答案 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]