R:强制data.table计算所有交互

Rem*_*i.b 7 combinations interaction r combinatorics data.table

这是一个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)]
Run Code Online (Sandbox Code Playgroud)

dat2,仅存在dat$var2et的现有相互作用dat$var3.我怎么能强迫dat2包含所有9个可能的交互(而不是7行的结果dat2为)var2var3?如果没有data.table的直接解决方案,解决此问题的最简单方法是什么?

table(dat$var2, dat$var3)

     1  2  3
  a 20 10 10
  b 20 20  0
  c  0 30 10
Run Code Online (Sandbox Code Playgroud)

当然,对于不存在数据的交互dat,dat2应该在resp中包含NA.

Sim*_*lon 7

您可以设置的key,然后做使用交叉连接CJi是这样的...

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
Run Code Online (Sandbox Code Playgroud)

并通过解释的方式,CJ()创建一个data.tableix(在这种情况下dat)加入上.它是作为提供的载体的交叉产物而形成的CJ(),恰好正是您所寻找的!