Tablas con kableExtra

Objetivos

En este módulo vamos a utilizar el paquete kableExtra para diseñar vistosas tablas con los datos que pueden ser incorporadas a nuestros informes, tesis y demás trabajos de investigación.

 

 

El objetivo de kableExtra es construir tablas complejas y manipular estilos de tablas. Este paquete utiliza la sintaxis pipes >%> y verbaliza las funciones de forma que se pueden añadir capas, de una forma similar a ggplot.

Cuando no se especifique el formato, kableExtra genera una tabla markdown y deja que pandoc automáticamente realice la conversión de markdown a HTML/PDF.

Nota: Aunque no es necesario para este curso, si deseas conocer qué es pandoc sigue el siguiente enlace https://ull-esit-dsi-1617.github.io/estudiar-las-rutas-en-expressjs-alberto-diego/Diego/Pandoc/queespandoc.html

Para empezar, cargamos la librería kableExtra junto con knitr, que también es necesaria.

library(knitr)
library(kableExtra)

Vamos a crear el dataset cuya tabla será manipulada a lo largo de este módulo. Para ello, guarda en la variable subCO2 las 5 primeras filas y las 4 primeras columnas del dataset CO2.

subCO2 <- CO2[..., ...]
subCO2
subCO2 <- CO2[1:5,1:4]
subCO2

Estilos

Utiliza la función kable solo con la tabla subCO2 que acabas de crear, sin ningún argumento extra para observar el estilo básico html.

kable(...)
kable(subCO2)

Como puedes observar, es un estilo demasiado crudo y que no provoca interés al lector.

Para controlar el estilo se utiliza kable_styling()

kable_styling( kable( subCO2 ) )
Plant Type Treatment conc
Qn1 Quebec nonchilled 95
Qn1 Quebec nonchilled 175
Qn1 Quebec nonchilled 250
Qn1 Quebec nonchilled 350
Qn1 Quebec nonchilled 500

Escribe la anterior secuencia usando pipes. A partir de ahora todo se realizará con pipes.

... %>%
  kable() %>%
  ...
subCO2 %>%
  kable() %>%
  kable_styling()

Algunos de los argumentos de estilo son:

  • full_width: anchura completa (de tipo booleano: TRUE o FALSE)
  • position: lugar que ocupa en el documento (opciones: left, center, right, float_left and float_right)
  • font_size: tamaño de la fuente (número entero)

Personaliza tu tabla para que no tenga la anchura completa, que ocupe la posición izquierda y que su fuente sea 10.

subCO2 %>%
  kable() %>%
  kable_styling(full_width = ... , position = ... , font_size = ...)
subCO2 %>%
  kable() %>%
  kable_styling(full_width = F, position = "left", font_size = 7.5)

Nota: Hay más argumentos de estilo, se recomienda continuar con el argumento bootstrap_options e indagar en la ayuda de la función ?kable_stylig para más información.

Especificaciones en filas y columnas

Es posible también ajustar el ancho de las columnas y filas, darles color y customizarlas con las funciones column_spec y row_spec.

Por ejemplo, coloreamos de naranja la segunda columna de nuestra tabla y, además, le asignamos 3 cm de anchura con los siguientes argumentos column, width y background.

kable(subCO2) %>%
  kable_styling(full_width = F) %>%
  column_spec(column = 2, width = "3cm", background = "orange")
Plant Type Treatment conc
Qn1 Quebec nonchilled 95
Qn1 Quebec nonchilled 175
Qn1 Quebec nonchilled 250
Qn1 Quebec nonchilled 350
Qn1 Quebec nonchilled 500

Utiliza la ayuda ?column_spec para obtener la siguiente tabla:

Plant Type Treatment conc
Qn1 Quebec nonchilled 95
Qn1 Quebec nonchilled 175
Qn1 Quebec nonchilled 250
Qn1 Quebec nonchilled 350
Qn1 Quebec nonchilled 500
?column_spec
kable(subCO2) %>%
  kable_styling(full_width = F) %>%
  column_spec(column = 2, width = "3cm", background = ...) %>%
  ...
kable(subCO2) %>%
  kable_styling(full_width = F) %>%
  column_spec(column = 2, width = "3cm", background = "purple", color="pink", italic=F) %>%
  column_spec(column = 4, background = "yellow", color="black", strikeout = T)

Se puede realizar lo mismo para las filas con la función row_spec. Además, hay una funcionalidad extra. Las cabeceras o nombres de las variables se consideran la fila número 0 y también se pueden customizar.

Utiliza la ayuda ?row_spec para obtener la siguiente tabla:

Plant Type Treatment conc
Qn1 Quebec nonchilled 95
Qn1 Quebec nonchilled 175
Qn1 Quebec nonchilled 250
Qn1 Quebec nonchilled 350
Qn1 Quebec nonchilled 500
?row_spec
kable(subCO2) %>%
  kable_styling(full_width = F) %>%
  row_spec(row = 0, ...) %>%
  row_spec(row = 2, ...)
kable(subCO2) %>%
  kable_styling(full_width = F) %>%
  row_spec(row = 0,color="blue", angle=-15)%>%
  row_spec(row = 2, background="green", bold=T, color="white")

Agrupar filas y columnas

Agrupar columnas

Algunas tablas requieren múltiples cabeceras para mostrar subgrupos de los datos. Para ello, se puede utilizar add_header_above().

Tan solo hay que indicar los nuevos nombres de las columnas y cuántas columnas pertenecen a cada uno de ellos, por ejemplo se pueden crear 2 grupos de nombres A y B con 2 y 2 columnas respectivamente de la siguiente forma:

kable(subCO2) %>%
  kable_styling() %>%
  add_header_above(c("A" = 2, "B" = 2))
A
B
Plant Type Treatment conc
Qn1 Quebec nonchilled 95
Qn1 Quebec nonchilled 175
Qn1 Quebec nonchilled 250
Qn1 Quebec nonchilled 350
Qn1 Quebec nonchilled 500

Añade otra cabecera que agrupe las 3 primeras columnas por un lado y la última por otro:

kable(subCO2) %>%
  kable_styling() %>%
  add_header_above(c("A" = 2, "B" = 2)) %>%
  add_header_above(...)
kable(subCO2) %>%
  kable_styling() %>%
  add_header_above(c("A" = 2, "B" = 2)) %>%
  add_header_above(c("GR1" = 3, "GR2" = 1))

Agrupar filas mediante etiquetas

Si lo que se desea agrupar son las filas, se utiliza la función group_rows cuyos argumentos básicos por defecto son: el nombre que se quiere dar, la fila donde empieza el grupo y la fila donde termina, por ejemplo:

group_rows <- kableExtra::group_rows  # tanto en kableExtra como en dplyr está la función group_rowss

kable(CO2[1:10, 1:5]) %>%
  kable_styling(full_width = F) %>%
  group_rows(group_label="Grupo 1", start_row= 4, end_row=7) %>%
  group_rows("Grupo 2", 8, 10)
Plant Type Treatment conc uptake
Qn1 Quebec nonchilled 95 16.0
Qn1 Quebec nonchilled 175 30.4
Qn1 Quebec nonchilled 250 34.8
Grupo 1
Qn1 Quebec nonchilled 350 37.2
Qn1 Quebec nonchilled 500 35.3
Qn1 Quebec nonchilled 675 39.2
Qn1 Quebec nonchilled 1000 39.7
Grupo 2
Qn2 Quebec nonchilled 95 13.6
Qn2 Quebec nonchilled 175 27.3
Qn2 Quebec nonchilled 250 37.1

Nota: cuando la misma función se encuentra en 2 paquetes podemos especificar cuál queremos usar como se ha visto en el trozo de R anterior.

Otra forma de utilizar group_rows es hacerlo de forma similar a add_header_above() especificando el número de filas que pertenecen a cada grupo en el argumento index. Intenta usarla para reproducir la tabla anterior con esta sintaxis alternativa:

kable(CO2[1:10, 1:5]) %>%
  kable_styling(full_width = F) %>%
  group_rows(index = c(" " = ..., "Grupo 1" = ..., "Grupo 2" = ...))
kable(CO2[1:10, 1:5]) %>%
  kable_styling(full_width = F) %>%
  group_rows(index = c(" " = 3, "Grupo 1" = 4, "Grupo 2" = 3))

Agrupar filas mediante celdas múltiples

La función collapse_rows permite mostrar información de forma estructurada en múltiples filas. Veamoslo con un ejemplo. El siguiente conjunto de datos está en formato long, esto es, los datos de una fila pertenecen a un grupo que está especificando en alguna columna y ese grupo se repite varias veces. Además, una segunda columna indica el subgrupo:

collapse_rows_dt <- data.frame(C1 = c(rep("a", 4), rep("b", 3)),
                 C2 = c(rep("c", 1), rep("d", 3), rep("c", 2), rep("d", 1)),
                 C3 = 1:7,
                 C4 = sample(c(0,1), 7, replace = TRUE))

kable(collapse_rows_dt) %>%
  kable_styling(full_width = F) 
C1 C2 C3 C4
a c 1 1
a d 2 0
a d 3 0
a d 4 1
b c 5 1
b c 6 0
b d 7 1

Una forma en la que se puede querer mostrar la información es sin dichas repeticiones, juntando las columnas de acuerdo a los grupos o valores repetidos. Esto se puede llevar a cabo señalando como argumento cuáles de las columnas indican los grupos en la función collapse_rows:

kable(collapse_rows_dt) %>%
  kable_styling(full_width = F) %>%
  collapse_rows(columns = 1:2)
C1 C2 C3 C4
a c 1 1
d 2 0
3 0
4 1
b c 5 1
6 0
d 7 1

Utiliza la ayuda y haz pruebas para responder a la siguiente pregunta que busca el argumento que hay que modificar para conseguir llegar a esta salida, donde las etiquetas se encuentran en la parte de arriba de cada grupo y no en el centro como anteriormente.

C1 C2 C3 C4
a c 1 1
d 2 0
3 0
4 1
b c 5 1
6 0
d 7 1
?collapse_rows
kable(collapse_rows_dt) %>%
  kable_styling(full_width = F) %>%
  collapse_rows(columns = 1:2, ...)
kable(collapse_rows_dt) %>%
  kable_styling(full_width = F) %>%
  collapse_rows(columns = 1:2, valign="top")

Autoevaluación

Practica lo que has aprendido descargando el siguiente fichero Rmd, abriéndolo con Rstudio: y resolviendo las preguntas de autoevaluación.

Autoevaluación

Para descargar el Rmd de autoevaluación haz click derecho en el enlace anterior y "Guardar enlace como..." y selecciona dónde quieres guardarlo.

Si al abrirlo con Rstudio observas caracteres extraños, selecciona File/Reopen with encoding/UTF-8 y ya se debe ver bien.

Dónde seguir

Continuar con tabulaR

Una vez terminado este documento puede:



Última actualización: 20201116-1215 DOI

Volver a Mod 3: Tablas dinámicas