2016-05-27 13 views
1

統計を計算する必要がある変数をsetDTに渡す方法はありますか?r - setDTに渡される変数の統計を計算する

以下の例は私の問題を示しています。 Aだけが望ましい結果をもたらします。 varをベクトルに変更し、その要素をループを介してsetDTに渡したいので、Aはオプションではありません。

sqldfも使用しないことをお勧めします。

col1 <- c('Group 1','Group 1','Group 2','Group 2') 
col2 <- c(0.2,0.3,0.5,0.6) 
col3 <- c(0.1,0.2,0.3,0.4) 
X  <- data.frame(col1,col2,col3) 
var <- "col2" 
A  <- setDT(X)[, list(nbrObs = .N, average = mean(col2)), by = .(col1)] 
B  <- setDT(X)[, list(nbrObs = .N, average = mean(X[[var]])), by = .(col1)] 
C  <- setDT(X)[, list(nbrObs = .N, average = mean(var)), by = .(col1)] 

答えて

3

我々は.SDcolsでそれを指定することにより、変数に渡し、その後Data.table(.SD)のサブセットに関数を適用することができます。複数の変数がある場合は、lapply(.SD, mean)のように.SDをループするようにしてください。

setDT(X)[, list(nbrObs = .N, average = mean(.SD[[1L]])), by = .(col1), .SDcols= var] 

それとも別のオプションは、as.nameまたはas.symbolsymbolに変換し、それを評価することになる(eval)。

setDT(X)[, list(nbrObs = .N, average = mean(eval(as.name(var)))), by = .(col1)] 

か、まだ別のオプションは、値を返すようにgetを使用しています。

setDT(X)[, list(nbrObs = .N, average = mean(get(var))), by = .(col1)] 
+1

ありがとうございました。あなたは私の問題を解決しました。 – koteletje