dplyr добавление метки к группе столбцов в таблице

При создании отчета R markdown в Rstudio я хотел бы сделать свои таблицы более понятными. Я просмотрел kable() и xtable(), но не нашел того, что искал (или, возможно, не понял, что нашел). Вот пример таблицы, которую я мог бы включить:

library(dplyr)
library(tidyr)
library(knitr)

mtcars %>% 
 group_by(gear,cyl) %>%
 summarize(count = n()) %>%
 spread(cyl,count) %>%
 kable()

Вот (консольный) результат:

| gear|  4|  6|  8|
|----:|--:|--:|--:|
|    3|  1|  2| 12|
|    4|  8|  4| NA|
|    5|  2|  1|  2|

В отчете я хотел бы включить название столбца «Цилиндр» (или еще лучше «Цилиндр») над 4/6/8. В противном случае в сложных таблицах может быть неясно, что представляют эти значения.

В частности: как я могу добавить строку в начало этой таблицы, которая отображает «Цилиндр» над последними тремя столбцами?

Спасибо за помощь!


person Kyle Ward    schedule 21.03.2015    source источник
comment
Разделение строк и столбцов не поддерживается уценкой Pandoc, поэтому вкратце: вы не можете сделать это без грязных хаков, таких как реализация CrossTable pander, например. pander(with(mtcars, descr::CrossTable(gear, cyl))) - это обходной путь для охвата строк. Вам нужен colspan здесь.   -  person daroczig    schedule 22.03.2015


Ответы (2)


При использовании HTML в качестве вывода пакет htmlTable обеспечивает группировку столбцов:

library(dplyr)
library(tidyr)
library(htmlTable)

test <- mtcars %>% 
 group_by(gear,cyl) %>% 
 summarize(count = n()) %>%
 spread(cyl,count)

htmlTable(
    test[,-1], # data.frame
    cgroup = c("Cylinders"), # Column group labels
    n.cgroup = c(3), # Number of columns per group
    rnames = test[[1]], # Row labels
    rowlabel = "Gears" # Column header for row labels
)

Цилиндры и шестерни

Для вывода PDF Hmisc::latex предоставляет аналогичный синтаксис (который я, к сожалению, не могу проверить из-за отсутствия LaTeX на машине, над которой я сейчас работаю):

library(Hmisc)

latex(
    test[,-1], # data.frame
    cgroup = c("Cylinders"), # Column group labels
    n.cgroup = c(3), # Number of columns per group
    rowname = test[[1]], # Row labels
    rowlabel = "Gears" # Column header for row labels
)

Если вы хотите вывести MS Word, вам не повезло, насколько я вижу на данный момент.

person hugovdberg    schedule 28.12.2016

Это не совсем то, что я искал, но я решил просто изменить имя каждого отдельного столбца. Это просто, но для тех, кто заглянет сюда в будущем, мой код теперь выглядит так:

library(dplyr)
library(tidyr)
library(knitr)

test <- mtcars %>% 
 group_by(gear,cyl) %>% 
 summarize(count = n()) %>%
 spread(cyl,count)

colnames(test)[2:4] <- paste(c(4,6,8),"Cylinder",sep=" ")

test %>% kable()

Полученная таблица выглядит в консоли следующим образом:

| gear| 4 Cylinder| 6 Cylinder| 8 Cylinder|
|----:|----------:|----------:|----------:|
|    3|          1|          2|         12|
|    4|          8|          4|         NA|
|    5|          2|          1|          2|
person Kyle Ward    schedule 23.03.2015