Трехмерные данные в красиво отформатированную таблицу (kable) - PullRequest
0 голосов
/ 07 мая 2018

У меня есть проблема, которую может быть интересно обобщить. Если у вас есть данные, которые по существу являются трехмерными, но одно из этих измерений имеет длину всего 2, то эти данные можно очень хорошо показать в таблице. Ответы на этот вопрос показывают некоторые примеры того, как это сделать в латексе . Я думаю, что это может быть распространенной проблемой для представления сводной статистики.

В настоящее время есть действительно хорошие подходы к форматированию таблиц в R с помощью knitr и kableExtra, но я не могу понять, как элегантно добраться до этого конкретного случая. Вот упрощенный пример:

   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)

Есть ли элегантный способ получить из этих двух отдельных фреймов данных таблицу, отформатированную как некоторые из ответов на этот вопрос ?

1 Ответ

0 голосов
/ 07 мая 2018

База R на помощь! Основная функция R ftable специально разработана для этой цели. Я считаю, что "F" для "сгладить". Просто соберите два 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)
...