данные.таблица, передаваемая в выражении `by` неинтерактивным способом

#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