2016-06-17 3 views
1

これはthis questionのフォローアップです。この問題で.SDを使用する方法を考えるのはむしろ(この場合はY1とY2を別々に実行するのではなく、各変数ごとに計算を行うのではなく)どんな助力も高く評価されます。おかげでdata.table:次のコードの.SD

set.seed(12345) 
A <- rep(x=paste0("A", 1:2), each=6) 
B <- rep(x=paste0("B", 1:3), each=2, times=2) 
Rep <- rep(x=1:2, times=3) 
Y1 <- rnorm(n=12, mean = 50, sd = 5) 
Y2 <- rnorm(n=12, mean = 50, sd = 10) 

library(data.table) 
dt <- data.table(A, B, Rep, Y1, Y2) 

dt[, j = Eff1 := mean(Y1), .(A, B)][, j = Eff1 := Eff1 - mean(Y1), .(A)][, j = Eff1 := Eff1 - mean(Y1), .(B)][, j = Eff1 := Eff1 + mean(Y1)] 
dt[, j = Eff2 := mean(Y2), .(A, B)][, j = Eff2 := Eff2 - mean(Y2), .(A)][, j = Eff2 := Eff2 - mean(Y2), .(B)][, j = Eff2 := Eff2 + mean(Y2)] 

dt[, j = .(Eff1 = mean(Eff1), Eff2 = mean(Eff2)), by = .(A, B)] 
+1

私は質問を理解していません。どこで '.SD'を使いたいのですか?そして明示的な 'j =' ''をタイプしないことを強くお勧めします。 – eddi

+2

問題とその結果を自然言語で説明してください。 –

+0

あなたのコメントと提案に感謝します。より明確にするために私の編集を見て、これらの計算を実行するためのより効率的なアプローチを提案してください。 – MYaseen208

答えて

2

個人的に、私はaveを使用して、data.table構文の外に行く検討する:

my_cols = c("Y1", "Y2") 
tmp_cols = c("Eff1", "Eff2") 

dt[, (tmp_cols) := 
    lapply(.SD, function(x) mean(x) + ave(x, A, B) - ave(x, A) - ave(x, B)) 
, .SDcols = my_cols][, 
    lapply(.SD, mean)  
, by=A:B, .SDcols = tmp_cols] 

一つの長い道のりがある:

dtA = dt[, lapply(.SD, mean), by=A, .SDcols = my_cols] 
dtB = dt[, lapply(.SD, mean), by=B, .SDcols = my_cols] 
dtAB = dt[, lapply(.SD, mean), by=.(A,B), .SDcols = my_cols] 

dt[, (tmp_cols) := lapply(.SD, mean), .SDcols = my_cols] 
dt[dtAB,(tmp_cols) := Map(`+`, mget(tmp_cols), mget(paste0("i.", my_cols))), on=c("A","B")] 
dt[dtA, (tmp_cols) := Map(`-`, mget(tmp_cols), mget(paste0("i.", my_cols))), on="A"] 
dt[dtB, (tmp_cols) := Map(`-`, mget(tmp_cols), mget(paste0("i.", my_cols))), on="B"] 

dt[, lapply(.SD, mean), by=.(A,B), .SDcols=tmp_cols] 
+0

一見すると理解が難しいが、非常に簡潔で効率的である。どうもありがとう。 – MYaseen208