我有一个数据,分为高级别类别和低级别类别.数据的基本结构与此模拟类似:
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
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想在层次结构中创建一个包含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...
Run Code Online (Sandbox Code Playgroud)
我试过tabular()了这个tables包 - 它可以很好地创建一个基于更高级别分组的n,mean,sd等表.我也尝试使用各种分组方式进行汇总,group_by()但是在同一个表中使用2种分组方法无法做任何事情.
我在想,也许有一种方法可以在循环过程中逐行或逐块地进行,但我无法想象它是如何工作的.
有没有人见过这样的东西?
执行两次摘要统计,并将结果添加到一个表中.例如,用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
Run Code Online (Sandbox Code Playgroud)
结果:
> 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
Run Code Online (Sandbox Code Playgroud)