【问题标题】:Filter data.table using inequalities and variable column names使用不等式和变量列名过滤 data.table
【发布时间】:2014-01-01 09:12:02
【问题描述】:

我有一个data.table,我想根据一些不等式标准进行过滤:

dt <- data.table(A=letters[1:3], B=2:4)
dt
#    A B
# 1: a 2
# 2: b 3
# 3: c 4

dt[B>2]
#    A B
# 1: b 3
# 2: c 4

以上作为矢量扫描解决方案效果很好。但我不知道如何将它与列的变量名结合起来:

mycol <- "B"
dt[mycol > 2]
#    A B      // Nothing has changed
# 1: a 2
# 2: b 3
# 3: c 4

我该如何解决这个问题?我知道我可以通过使用setkeyv(dt, mycol) 设置键来使用二进制搜索,但我看不到基于某些不等式标准进行二进制搜索的方法。

【问题讨论】:

  • get(mycol) 工作吗?
  • @CarlWitthoft 是的。那将是我缺少的功能...
  • 如果您愿意,您可以继续发布作为答案。
  • 这也可以dt[eval(parse(text=mycol)) &gt; 2]
  • @digEmAll 使用eval(parse()) 严格按照fortune(106) 禁止

标签: r data.table inequality


【解决方案1】:

好的,那么, 使用 get(mycol) 因为您希望 dt[ 的参数是对象 "mycol" 的内容。我相信dt[mycol ...]data.table 对象本身中寻找“mycol”东西,当然没有这样的动物。

【讨论】:

  • 这救了我。但即使你做dt['B' &gt; 2],你也必须做dt[get('B') &gt; 2]。有点烦人/似乎列引用应该作为字符串工作。
  • @wordsforthewise 感谢您的更正。我不得不承认在过去的 4 年里我没有研究过这个问题!
【解决方案2】:

为此提供了一个访问函数。 jX 的框架中进行评估,即您的data.table除非您指定with = FALSE。这将是这样做的规范方式。

dt[ , mycol , with = FALSE ]
   B
1: 2
2: 3
3: 4

返回列、逻辑比较、子集行...

dt[ c( dt[ , mycol , with = FALSE ] > 2 ) ]

【讨论】:

  • @Mattrition 查看更新。我不喜欢get,因为在某些嵌套调用环境中评估它时可能会遇到一些意外行为。我认为提供with = FALSE 是有原因的。
  • 好的,您的回答现在提供了不同的替代解决方案,谢谢。我发现的第三种选择是dt[dt[[mycol]] &gt; 2]
  • @Mattrition 这似乎是最明显的。你应该用那个回答你自己的问题。
  • 我真的不喜欢这个和[[ 替代品,因为它们更容易出错(因为你必须指定data.table 名称两次)
【解决方案3】:

另一种替代方法是使用]] 来检索 B 作为向量,并使用它作为子集:

dt[dt[[mycol]] > 2]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2018-02-12
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多