Ответ 1
Из data.table 1.9.4
вы можете просто сделать это:
## A parenthesized symbol, `(cn)`, gets evaluated to "blah" before `:=` is carried out
test_dtb[, (cn) := mean(a), by = id]
head(test_dtb, 4)
# a b id blah
# 1: 41 19 1 54.2
# 2: 4 99 2 50.0
# 3: 49 85 3 46.7
# 4: 61 4 4 57.1
См. Детали в ?:=
:
DT[i, (colvector) := val]
[...] СЕЙЧАС ПРЕДПОЧИТАТЬ [...] синтаксис. Парнов достаточно, чтобы LHS был символом; так же, как
c(colvector)
Оригинальный ответ:
Вы были на правильном пути: построение выражения, которое должно быть оценено в вызове [.data.table
, - это data.table способ сделать это. Идя чуть дальше, почему бы не построить выражение, которое оценивает весь аргумент j
(а не только его левую сторону)?
Что-то вроде этого должно сделать трюк:
## Your code so far
library(data.table)
test_dtb <- data.table(a=sample(1:100, 100),b=sample(1:100, 100),id=rep(1:10,10))
cn <- "blah"
## One solution
expr <- parse(text = paste0(cn, ":=mean(a)"))
test_dtb[,eval(expr), by=id]
## Checking the result
head(test_dtb, 4)
# a b id blah
# 1: 30 26 1 38.4
# 2: 83 82 2 47.4
# 3: 47 66 3 39.5
# 4: 87 23 4 65.2