我喜欢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中有许多分组操作,这对于快速和复杂的调查数据交叉表非常有用,但我还没有找到任何有关如何使用它的教程。谢谢你的帮助。
答案 0 :(得分:12)
我们可以使用dcast
中的data.table
(请参阅project wiki或CRAN project page上的高效重塑使用data.tables 小插图
dcast(dt, opinion~party, value.var='ID', length)
如果我们使用稍大的数据集并使用dcast
和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
第三种选择略胜一筹,但采用“长”格式。如果OP希望采用“广泛”格式,则可以使用data.table
dcast
。
注意:我使用的是devel版本,即v1.9.7
,但CRAN应该足够快。