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

Posted

技术标签:

【中文标题】R:强制 data.table 计算所有交互【英文标题】:R: Force data.table to compute all interactions 【发布时间】:2014-01-01 04:58:54 【问题描述】:

这是一个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$var2dat$var3 的现有交互。如何强制dat2 包含var2var3 的所有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 应分别包含 NA。

【问题讨论】:

为什么不直接使用data.table(...) 而不是as.data.table(data.frame(...)) 没有理由,那是愚蠢的!我修好了它!谢谢 【参考方案1】:

您可以设置key,然后在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()xi 中创建一个data.table(在本例中为dat)以加入。它是提供给CJ() 的向量的叉积,这恰好是您正在寻找的!

【讨论】:

我同意CJ 版本比我在下面建议的expand.grid 更有意义。但为了概括性,我仍然认为dat[CJ(unique(var2),unique(var3)), mean(var1)] 比明确使用letters[1:3]1:3 更合适。

以上是关于R:强制 data.table 计算所有交互的主要内容,如果未能解决你的问题,请参考以下文章

R Data.table 用于计算跨多列的汇总统计信息

如何按 data.table 中的十分位组计算统计信息

我可以强制 R data.table %like% 使用“fixed = TRUE”吗?

计算R中的对

R data.table 滑动窗口

R语言进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics):使用R原生方法data.tabledplyr等方案计算滑动分组统计