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

tom*_*tom 11 r crosstab data.table

我喜欢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)
Run Code Online (Sandbox Code Playgroud)

在表格中,通过聚会计算意见的数量非常简单 table(df$opinion, df$party).

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

dt <- data.table(df)
dt[, .N, by="party"]
Run Code Online (Sandbox Code Playgroud)

data.table中有许多分组操作,对于调查数据的快速和复杂的交叉表非常有用,但我还没有找到任何有关如何使用它的教程.谢谢你的帮助.

akr*_*run 12

我们可以使用dcastfrom data.table(参见项目维基CRAN项目页面上的使用data.tables插图的高效重塑).

dcast(dt, opinion~party, value.var='ID', length)
Run Code Online (Sandbox Code Playgroud)

基准

如果我们使用稍大的数据集并使用dcastfrom reshape2和来比较速度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 
Run Code Online (Sandbox Code Playgroud)

第三种选择略胜一筹,但它采用"长"格式.如果OP想要具有"宽"格式,则data.table dcast可以使用.

注意:我正在使用devel版本v1.9.7,但CRAN应该足够快.

  • @tom不,它不是把它当作`data.frame`.`dcast`来自`data.table`包而不是来自`reshape2`并且针对速度进行了优化. (6认同)