在R中使用data.table的交叉表

时间:2015-10-04 15:18:20

标签: r data.table crosstab

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

以下是一些复制调查数据:

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中有许多分组操作,这对于快速和复杂的调查数据交叉表非常有用,但我还没有找到任何有关如何使用它的教程。谢谢你的帮助。

1 个答案:

答案 0 :(得分:12)

我们可以使用dcast中的data.table(请参阅project wikiCRAN project page上的高效重塑使用data.tables 小插图

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

基准

如果我们使用稍大的数据集并使用dcastreshape2中的data.table来比较速度

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 

第三种选择略胜一筹,但采用“长”格式。如果OP希望采用“广泛”格式,则可以使用data.table dcast

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