Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:Force data.table计算所有交互_R_Combinations_Data.table_Combinatorics_Interaction - Fatal编程技术网

R:Force data.table计算所有交互

R:Force data.table计算所有交互,r,combinations,data.table,combinatorics,interaction,R,Combinations,Data.table,Combinatorics,Interaction,这是一个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)] 在dat2中,仅存在dat$var2etdat$var3的现有交互。如何强制dat2包含var2和var3的所有9个可能交互(而不是dat2的

这是一个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)]
dat2
中,仅存在
dat$var2
et
dat$var3
的现有交互。如何强制
dat2
包含
var2
var3
的所有9个可能交互(而不是
dat2
的7行)的结果?如果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

您可以设置
,然后使用
i
中的
CJ
进行交叉连接,就像这样

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

作为解释,
CJ()
x
i
中创建一个
data.table
(在本例中为
dat
)以加入。它是作为提供给
CJ()
的向量的叉积形成的,这恰好是您要查找的

为什么不直接做
data.table(…)
而不是
as.data.table(data.frame(…)
?没有理由,那是愚蠢的!我修好了!谢谢我同意
CJ
版本比我下面建议的
expand.grid
版本更有意义。但对于普遍性,我仍然认为
dat[CJ(unique(var2),unique(var3)),mean(var1)]
比明确使用
字母[1:3]
1:3
更合适。