gpt4 book ai didi

r - R中带有data.table的交叉表

转载 作者:行者123 更新时间:2023-12-04 02:04:49 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Faster ways to calculate frequencies and cast from long to wide

(4 个回答)


3年前关闭。




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

最佳答案

我们可以使用dcast来自 data.table (参见 project wikiCRAN project page 上的使用 data.tables 小插图进行高效 reshape )。

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

基准

如果我们使用稍大的数据集并使用 dcast 比较速度来自 reshape2data.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可以使用。

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

关于r - R中带有data.table的交叉表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32935041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com