我的一个常见任务是过滤(子集)data.tables格式的数据集。我想以多种列特定的布尔条件以一种复杂的方式对i中的行进行子集化。当我得到一个新的数据集时,它将具有相同的列类型,并且我想以相同的方式对所有数据集进行过滤。
为了说明我的任务,让我首先创建一个示例数据表。
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。
答案 0 :(得分: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