38

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を使用して複数の列を割り当てます

4

3 に答える 3

32

から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
于 2012-07-31T17:45:32.167 に答える
17

式はbquoteで構成できます。

cn <- "blah"
expr <- bquote(.(as.name(cn)):=mean(a))
test_dtb[,eval(expr), by=id]
于 2012-08-01T21:22:04.423 に答える
1

setnames(DT, c(col.names))私は最も読みやすいコードを生み出すと信じています

于 2020-10-04T17:51:49.830 に答える