R:Force data.table计算所有交互
这是一个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的
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
etdat$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
更合适。