2013-12-13 5 views
6

を計算するがdata.tableある:dat2R:強制data.tableここですべての相互作用

dat = data.table(var1=rnorm(120), var2=rep(c('a','b','c'),40), var3=rep(c(1,2,3,2,1,2,1,2,2,3,1,2),10)) 

dat2 = dat[,list(resp = mean(var1)),by=list(var2, var3)] 

dat$var2dat$var3の唯一の既存の相互作用が存在します。 dat2に、var2var3の7つの行(dat2の7行ではなく)の9つのすべてのインタラクションの結果を強制的に含めるにはどうすればよいですか? data.tableで直接解決策がない場合、この問題を解決する最も簡単な方法は何ですか?

table(dat$var2, dat$var3) 

    1 2 3 
    a 20 10 10 
    b 20 20 0 
    c 0 30 10 

もちろん、何もデータがdatに存在しないの相互作用のために、dat2はRESPでNAが含まれている必要があります。

+0

なぜas.data.table(data.frame(...))の代わりに 'data.table(...)'を実行するのはなぜですか? – Arun

+0

理由はありませんでした。それを私が直した!ありがとうございます –

答えて

6

あなたはこのケースでは(keyを設定し、そう...

setkey(dat , var2 , var3) 

# Thanks to @Shadow for pointing out to use unique() in the cross join 
dat[ CJ(unique(var2) , unique(var3)) , mean(var1) ] 
# var2 var3   V1 
#1: a 1 -0.25771923 
#2: a 2 0.04143057 
#3: a 3 0.28878451 
#4: b 1 0.18865887 
#5: b 2 0.53632552 
#6: b 3   NA 
#7: c 1   NA 
#8: c 2 0.38015021 
#9: c 3 0.49809159 

や説明の仕方によって同じようiCJを使用してCROSSJOINを行い、CJ()xidata.tableを作成することができdat)に参加してください。これは、CJ()に供給されたベクトルの外積として形成され、正確にあなたが探しているものです!

+1

私は 'CJ'のバージョンが私が以下に提案した' expand.grid'よりも意味があることに同意します。しかし、一般化可能性については、 'letters {1:3}'と '1:3'を明示的に使用するよりも、CJ(一意的(var2)、一意的(var3) 。 – shadow

+0

@shadowええ、あなたはまったく正しい、良いコールだと確信しています。 –

関連する問題