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)
基准
如果我们使用稍大的数据集并使用 reshape2
和 data.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 应该足够快。
我喜欢 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)
基准
如果我们使用稍大的数据集并使用 reshape2
和 data.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 应该足够快。