我有一个分为高级类别和低级类别的数据。数据的基本结构类似于这个模拟结构:
set.seed(21)
cat <- data.frame(Level1=c(rep("A",6),rep("B",6),rep("C",6)),
Level2=c(sample(c(1:3), 6, replace=TRUE),
sample(c(4:6), 6, replace=TRUE),
sample(c(7:9), 6, replace=TRUE)),
Type=rep(c(1,2),9),
Value=rnorm(18))
> table(cat$Level1,cat$Level2)
# 1 2 3 4 5 6 7 8 9
#A 1 3 2 0 0 0 0 0 0
#B 0 0 0 1 1 4 0 0 0
#C 0 0 0 0 0 0 1 4 1
如果可能,我想创建一个同时包含Level1和Level2的计数和均值(或其他汇总)的表,层次结构如下:
#Level1/2 Count Mean SD ... whatever
#A 6 0.15323278
# 1 1 -0.5821507
# 2 3 0.8603706
# 3 2 -0.5397822
#B 6 0.46460457
# 4 1 1.0136847
# 5 1 -0.3521069
# 6 4 0.5315124...
我尝试过tables
包中的tabular()
--它可以很好地根据更高级别的分组创建一个包含n、mean、sd等的表。我也尝试过使用group_by()
等不同的分组方式进行汇总,但是在同一个表中使用两种分组方式是行不通的。
我在想,也许有一种方法可以逐行或(逐块)在循环过程中完成,但我不能完全想象这将如何工作。
有没有人见过这样的东西?
发布于 2015-12-02 17:24:47
进行两次汇总统计,并将结果添加到一个表中。例如,使用data.table
。
require(data.table)
set.seed(21)
cat <- data.table(Level1=c(rep("A",6),rep("B",6),rep("C",6)),
Level2=c(sample(c(1:3), 6, replace=TRUE),
sample(c(4:6), 6, replace=TRUE),
sample(c(7:9), 6, replace=TRUE)),
Type=rep(c(1,2),9),
Value=rnorm(18))
cat
table(cat$Level1, cat$Level2)
# Statistics for Level1
tab1 <- cat[, .(Count = .N, Mean = mean(Value), SD = sd(Value)),
keyby = .(Level1)]
# Statistics for Level1 and Level2
tab2 <- cat[, .(Count = .N, Mean = mean(Value), SD = sd(Value)),
keyby = .(Level1, Level2)]
# Add in one table
tab <- rbindlist(list(tab2, tab1), fill = TRUE)
# Sort
setorder(tab, Level1, Level2)
# Print
tab
结果:
> tab
Level1 Level2 Count Mean SD
1: A NA 6 -0.2224609 1.1052424
2: A 1 2 -1.4125934 1.2221462
3: A 3 4 0.3726054 0.3487678
4: B NA 6 0.4125892 0.8841718
5: B 4 2 1.0854216 0.6030156
6: B 6 4 0.0761730 0.8538268
7: C NA 6 -0.2347908 0.7815174
8: C 7 4 -0.2805626 0.6948971
9: C 8 2 -0.1432472 1.2570046
发布于 2015-12-02 18:42:16
你有没有尝试过aggregate():
set.seed(21)
cat <- data.table(Level1=c(rep("A",6),rep("B",6),rep("C",6)),
Level2=c(sample(c(1:3), 6, replace=TRUE),
sample(c(4:6), 6, replace=TRUE),
sample(c(7:9), 6, replace=TRUE)),
Type=rep(c(1,2),9),
Value=rnorm(18))
aggregate(Value~Level1+Level2, data=cat, FUN=mean)
结果:
Level1 Level2 Value
1 A 1 -1.4125934
2 A 3 0.3726054
3 B 4 1.0854216
4 B 6 0.0761730
5 C 7 -0.2805626
6 C 8 -0.1432472
https://stackoverflow.com/questions/34038753
复制相似问题