3-d 数据格式很好 table (kable)

3-d data to nicely formatted table (kable)

我有一个问题,概括起来可能很有趣。如果您的数据本质上是三维的,但其中一个维度的长度仅为 2,则可以在 table 中非常好地显示此数据。本题答案显示some examples of how to do that in latex。我认为这可能是呈现汇总统计数据的常见问题。

现在有非常好的方法可以通过 knitr 和 kableExtra 在 R 中格式化 tables,但我不知道如何优雅地实现这种特殊情况。这是一个简化的例子:

   library(dplyr)
   ms <- iris %>% 
   group_by(Species) %>%
   summarize(mean_petal_width=mean(Petal.Width),
   mean_sepal_width=mean(Sepal.Width))

   sds <- iris %>% 
   group_by(Species) %>%
   summarize(sd_petal_width=sd(Petal.Width),
   sd_sepal_width=sd(Sepal.Width))

   knitr::kable(ms)
   knitr::kable(sds)

是否有一种优雅的方法可以将这两个单独的数据帧转换为 table 格式,如某些 the answers to this question

基地 R 来救援!基本 R 函数 ftable 是为此目的量身定制的。我相信 "f" 适合 "flatten"。只是 assemble 两个 data.frames 以所谓的半长形式在一起,xtab 将它们转换成三维数组,然后 ftable 将显示:

结束游戏:

ftable( aperm(tgrp, c(3,1,2)), row.vars=c('Species', 'stat') )
#----------------                    
                    petal_width sepal_width
Species    stat                            
setosa     mean       0.2460000   3.4280000
           std_dev    0.1053856   0.3790644
versicolor mean       1.3260000   2.7700000
           std_dev    0.1977527   0.3137983
virginica  mean       2.0260000   2.9740000
           std_dev    0.2746501   0.3224966

准备:

首先分配相同的列名,这样它们就可以是 "rbound":

library(dplyr)
    ms <- iris %>% 
    group_by(Species) %>%
    summarize(petal_width=mean(Petal.Width),
    sepal_width=mean(Sepal.Width))

    sds <- iris %>% 
    group_by(Species) %>%
    summarize(petal_width=sd(Petal.Width),
    sepal_width=sd(Sepal.Width))

grouped <- rbind( cbind(stat="mean", ms), cbind(stat="std_dev", sds) )
tgrp <- xtabs( cbind(petal_width, sepal_width) ~ stat+Species, grouped)