【问题标题】:how do i define a variable for subsetting multiple columns of a data.table in i?我如何定义一个变量来对 i 中的 data.table 的多个列进行子集化?
【发布时间】:2019-04-09 16:22:08
【问题描述】:

我的一个常见任务是以 data.tables 格式过滤(子集)数据集。我想使用多个特定于列的布尔条件以复杂的方式对 i 中的行进行子集化。当我获得一个新数据集时,它将具有相同类型的列,我希望以相同的方式对所有数据集进行过滤。

为了说明我的任务,让我首先创建一个示例 data.table。

library(data.table)

dt <- data.table(a = seq(1,6), b = letters[seq(1,6)], c = rep(c(4,3,2)))

这会产生

   a b c
1: 1 a 4
2: 2 b 3
3: 3 c 2
4: 4 d 4
5: 5 e 3
6: 6 f 2

。假设我想对列应用以下过滤条件:

 dt[b != 'd'][c < 4][a < 6]

屈服

 a b c
1: 2 b 3
2: 3 c 2
3: 5 e 3

。有没有办法将该过滤条件转换为变量,以便我可以将其标记到 data.table 的末尾?

我试过了

x <- [b != 'd'][c < 4][a < 6]
dt[x]

但这会引发错误

Error: unexpected '[' in "x <- ["

。这会很棒,因为我可以通过仅更改变量 x 来更新过滤策略,然后将此过滤器应用于所有 data.tables。

【问题讨论】:

  • 你需要i1 &lt;- dt[, b != 'd' &amp; c &lt; 4 &amp; a &lt; 6]; dt[i1]

标签: r data.table


【解决方案1】:

如果要应用于不同的数据集,quote 表达式并在每个数据集上评估它

i1 <- quote(b != 'd' & c < 4 & a < 6)
dt[dt[, eval(i1)]]
#   a b c
#1: 2 b 3
#2: 3 c 2
#3: 5 e 3

【讨论】:

  • 还有:dt[eval(i1)]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多