【问题标题】:Passing variables into data.table将变量传递到 data.table
【发布时间】:2018-07-05 10:04:21
【问题描述】:

我有一个关于将变量传递到 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

感谢任何帮助。 谢谢

【问题讨论】:

  • DT[.("b"), on=x, nomatch=0]
  • 太棒了。这行得通。

标签: r variables filter data.table subset


【解决方案1】:

对于相等匹配的情况,连接有效:

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

【讨论】:

    【解决方案2】:

    以这种方式使用“eval”(而不是“get”):

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

    有效!

    DT2[DT2[[eval(x)]]=="b",]
    Empty data.table (0 rows) of 3 cols: x2,y,v
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 2014-08-13
      • 1970-01-01
      • 2020-02-13
      • 2020-03-13
      • 2018-06-02
      相关资源
      最近更新 更多