Обычной моей задачей является фильтрация (подмножество) наборов данных в формате 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
, и применить этот фильтр ко всем таблицам данных.
Если его нужно применить к другому набору данных, 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)]
Вам нужно
i1 <- dt[, b != 'd' & c < 4 & a < 6]; dt[i1]