名前が動的なdata.table
に列を追加しようとしています。さらに、これらの列を追加するときにby
引数を使用する必要があります。例えば:
test_dtb <- data.table(a = sample(1:100, 100), b = sample(1:100, 100), id = rep(1:10,10))
cn <- parse(text = "blah")
test_dtb[ , eval(cn) := mean(a), by = id]
# Error in `[.data.table`(test_dtb, , `:=`(eval(cn), mean(a)), by = id) :
# LHS of := must be a single column name when with=TRUE. When with=FALSE the LHS may be a vector of column names or positions.
別の試み:
cn <- "blah"
test_dtb[ , cn := mean(a), by = id, with = FALSE]
# Error in `[.data.table`(test_dtb, , `:=`(cn, mean(a)), by = id, with = FALSE) : 'with' must be TRUE when 'by' or 'keyby' is provided
マシューからの更新:
これはR-Forgeのv1.8.3で機能するようになりました。ハイライトありがとうございます!
新しい例については、この同様の質問を参照してください:
_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
_
_?:=
_のDetailsを参照してください:
DT[i, (colvector) := val]
[...]現在の推奨[...]構文。括弧は、LHSがシンボルであることを止めるのに十分です。
c(colvector)
と同じ
元の回答:
あなたはまさに正しい軌道に乗っていました:_[.data.table
_の呼び出し内で評価される式を構築することは、この種のことを行うdata.tableの方法です。さらに少し進んで、entirej
引数(その左側だけではなく)に評価される式を作成してみませんか?
このような何かがうまくいくはずです:
_## 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
_
式はbquoteで構築できます。
cn <- "blah"
expr <- bquote(.(as.name(cn)):=mean(a))
test_dtb[,eval(expr), by=id]