【问题标题】:Filtering rows by a criteria defined by variables按变量定义的条件过滤行
【发布时间】:2015-04-29 18:03:02
【问题描述】:

我有以下data.table

structure(list(val1 = c(1, 2, 1, 3, 4, 5, 3), val2 = c(4, 5, 6, 4, 2, 4, 5)), .Names = c("val1", "val2"), row.names = c(NA, -7L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0xedae28>)

我想做的是根据其他变量定义的标准过滤其中的行。例如,我可能想要所有具有val1 &gt;= 1 的行。这很容易做到

x[val1 > 1,]

但是,我希望能够将列名(即val1 或val2)指定为变量,并将过滤器值指定为变量。我试过了

cname = 'val1'
cutoff = 1
x[(cname >= cutoff),] # Try 1
x[(cname) >= (cutoff),] # Try 2
x[eval(cname > cutoff),] # Try 3

但它只是归还了原来的data.table。

【问题讨论】:

  • 相关问题列表,虽然所有答案都超长和/或不要使用get,最简单的是:stackoverflow.com/q/24833247/1191259
  • @Frank,你真的花时间阅读了那个链接的问题吗? :-)
  • @AnandaMahto 不完全是,但比我应该拥有的更多:) 我觉得这是一个骗局,但我比任何一个都更喜欢这个问答。这是我自己关于同一件事的问题:stackoverflow.com/q/19276194/1191259 我想每个人都曾在某个时候问过这个问题。

标签: r data.table subset


【解决方案1】:

听起来你在找get:

x[get(cname) > cutoff,]
#    val1 val2
# 1:    2    5
# 2:    3    4
# 3:    4    2
# 4:    5    4
# 5:    3    5

【讨论】:

    【解决方案2】:

    您可以将eval 与as.name 或as.symbol 一起使用

    x[eval(as.name(cname)) > cutoff]
    #    val1 val2
    #1:    2    5
    #2:    3    4
    #3:    4    2
    #4:    5    4
    #5:    3    5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多