#r #data.table
#r #data.table
Вопрос:
Я хочу использовать несколько выражений в by
of data.table (не только имена столбцов) динамическим способом
Это то, что я хочу сделать:
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
DT[, mean(y), by = .(over4 = v > 4)]
Я думал, что смогу передать символьный вектор с выражениями, но это не работает:
by_expression = c("over4" = "v > 4")
DT[, mean(y), by = by_expression]
Есть ли способ передавать выражения динамическим способом?
У меня есть эта работа, но это небольшая работа, если есть несколько условий by, а затем требуется привести в порядок после выполнения операции by позже
DT[, condition := v > 4, ]
DT[, mean(y), by = condition]
Комментарии:
1. Вы всегда можете использовать кавычки и eval. Очевидно, что вы должны передать фактическое выражение (созданное с помощью кавычек) вместо символьного вектора.
2. Да, я знаю о подходе eval (цитата), но это немного запутанно. Мне интересно, есть ли более простой способ в синтаксисе data.table, который я упустил из виду…
3. Кажется, это работает без
eval
. Не выглядит беспорядочно, не так ли?by_expression = quote(list(over4 = v > 4)) ; DT[, mean(y), by = by_expression]
4. Или
quote(.(over4 = v > 4))
(то же самое)5. это здорово — следует указать это как ответ и плохо проголосовать
Ответ №1:
Передача quote
общего выражения:
by_expression = quote(.(over4 = v > 4))
DT[, mean(y), by = by_expression]
# over4 V1
# 1: FALSE 2.75
# 2: TRUE 3.80
Ответ №2:
by_expression <- c("over4" = "v > 4",
"over2" = "v > 2")
lapply(by_expression, function(ex) DT[, mean(y), by = .(eval(parse(text = ex)))])
Результат:
$over4
parse V1
1: FALSE 2.75
2: TRUE 3.80
$over2
parse V1
1: FALSE 2.000000
2: TRUE 3.714286