R 中 data.table 的交叉表

Crosstabs with data.table in R

我喜欢 R 中的 data.table 包,我认为它可以帮助我执行复杂的交叉制表任务,但还没有弄清楚如何使用该包来完成类似于 [=13= 的任务].

这是一些复制调查数据:

opinion <- c("gov", "market", "gov", "gov")
ID <- c("resp1", "resp2", "resp3", "resp4")
party <- c("GOP", "GOP", "democrat", "GOP")

df <- data.frame(ID, opinion, party)

在表格中,按党派统计意见数量就像table(df$opinion, df$party).

一样简单

我已经设法在 data.table 中做了类似的事情,但结果很笨重,它添加了一个单独的列。

dt <- data.table(df)
dt[, .N, by="party"]

data.table 中有许多分组操作可能非常适合快速和复杂的调查数据交叉表,但我还没有找到任何关于如何操作的教程。感谢您的帮助。

我们可以使用 data.table 中的 dcast(请参阅 project wiki or on the CRAN project page 上的 Efficient reshaping using data.tables 小插图)。

dcast(dt, opinion~party, value.var='ID', length)

基准

如果我们使用稍大的数据集并使用 reshape2data.table

中的 dcast 比较速度
set.seed(24)
df <- data.frame(ID=1:1e6, opinion=sample(letters, 1e6, replace=TRUE),
  party= sample(1:9, 1e6, replace=TRUE))
system.time(dcast(df, opinion ~ party, value.var='ID', length))
#   user  system elapsed 
#  0.278   0.013   0.293 
system.time(dcast(setDT(df), opinion ~ party, value.var='ID', length))
#   user  system elapsed 
# 0.022   0.000   0.023 

system.time(setDT(df)[, .N, by = .(opinion, party)])
#  user  system elapsed 
# 0.018   0.001   0.018 

第三个选项稍微好一点,但它是 'long' 格式。如果 OP 想要 'wide' 格式,可以使用 data.table dcast

注意:我使用的是开发版本,即 v1.9.7,但 CRAN 应该足够快。