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应该足够快.