Por defecto, la forma en que R Markdown muestra tablas es bastante feo porque muestra lo que verías si corrieras el código en la consola.
library(dplyr)
paises <- readr::read_csv("datos/paises.csv")
paises_seleccion <- paises %>%
filter(pais %in% c("Argentina", "Uruguay", "Chile")) %>%
filter(anio %in% c(2007, 2002)) %>%
select(-continente)
paises_seleccion
## # A tibble: 6 x 5
## pais anio esperanza_de_vida poblacion pib_per_capita
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Argentina 2002 74.3 38331121 8798.
## 2 Argentina 2007 75.3 40301927 12779.
## 3 Chile 2002 77.9 15497046 10779.
## 4 Chile 2007 78.6 16284741 13172.
## 5 Uruguay 2002 75.3 3363085 7727.
## 6 Uruguay 2007 76.4 3447496 10611.
kable
Existen varios paquetes para mostrar tablas lindas pero una forma simple y sin vueltas es usando la función kable
del paquete {knitr}. Sólo usando esta función ya devuelve una tabla más que razonable:
pais | anio | esperanza_de_vida | poblacion | pib_per_capita |
---|---|---|---|---|
Argentina | 2002 | 74.340 | 38331121 | 8797.641 |
Argentina | 2007 | 75.320 | 40301927 | 12779.380 |
Chile | 2002 | 77.860 | 15497046 | 10778.784 |
Chile | 2007 | 78.553 | 16284741 | 13171.639 |
Uruguay | 2002 | 75.307 | 3363085 | 7727.002 |
Uruguay | 2007 | 76.384 | 3447496 | 10611.463 |
La mayoría de las veces, el nombre de las columnas que queremos mostrar no va a ser igual que el nombre de las columnas en R. En la tabla paises
, los nombres están en minúscula, sin espacios y sin “caracteres especiales” como “ñ” o “í”. Esto es útil para comunicarse con R, pero no está bueno para comunicados a seres humanos. El argumento col.names
permite especificar el nombre de las columnas para mostrar:
kable(paises_seleccion,
col.names = c("País", "Año", "Esperanza de vida", "Población", "PBI per cápita"))
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74.340 | 38331121 | 8797.641 |
Argentina | 2007 | 75.320 | 40301927 | 12779.380 |
Chile | 2002 | 77.860 | 15497046 | 10778.784 |
Chile | 2007 | 78.553 | 16284741 | 13171.639 |
Uruguay | 2002 | 75.307 | 3363085 | 7727.002 |
Uruguay | 2007 | 76.384 | 3447496 | 10611.463 |
En Español, en general usamos la coma para separar los decimales y el punto como separador de miles. Para eso, hay que modificar el argumento format.args
de esta manera:
kable(paises_seleccion,
col.names = c("País", "Año", "Esperanza de vida", "Población", "PBI per cápita"),
format.args = list(decimal.mark = ",", big.mark = "."))
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2.002 | 74,340 | 38.331.121 | 8.797,641 |
Argentina | 2.007 | 75,320 | 40.301.927 | 12.779,380 |
Chile | 2.002 | 77,860 | 15.497.046 | 10.778,784 |
Chile | 2.007 | 78,553 | 16.284.741 | 13.171,639 |
Uruguay | 2.002 | 75,307 | 3.363.085 | 7.727,002 |
Uruguay | 2.007 | 76,384 | 3.447.496 | 10.611,463 |
Uff… pero ponerle el punto de miles a los años queda raro. La solución es convertir la columna anio
en caracter. De esta manera, no se ve afectada por el formato numérico.
paises_seleccion %>%
mutate(anio = as.character(anio)) %>%
kable(col.names = c("País", "Año", "Esperanza de vida", "Población", "PBI per cápita"),
format.args = list(decimal.mark = ",", big.mark = "."))
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74,340 | 38.331.121 | 8.797,641 |
Argentina | 2007 | 75,320 | 40.301.927 | 12.779,380 |
Chile | 2002 | 77,860 | 15.497.046 | 10.778,784 |
Chile | 2007 | 78,553 | 16.284.741 | 13.171,639 |
Uruguay | 2002 | 75,307 | 3.363.085 | 7.727,002 |
Uruguay | 2007 | 76,384 | 3.447.496 | 10.611,463 |
hacer kable
, que es una función diseñada para ser simple y hacer pocas cosas. Para hacer cosas un poco mas complicadas está el paquete {kableExtra}.
El paquete {kableExtra}, como su nombre lo indica, nació para extender el poder de la función kable
.
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
paises_tabla <- paises_seleccion %>%
mutate(anio = as.character(anio)) %>%
kable(col.names = c("País", "Año", "Esperanza de vida", "Población", "PBI per cápita"),
format.args = list(decimal.mark = ",", big.mark = "."))
La primera columna de la tabla de arriba es un tanto redundante. Sería mejor agrupar las filas según el país. Esto se consigue con la función collapse_rows
:
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74,340 | 38.331.121 | 8.797,641 |
2007 | 75,320 | 40.301.927 | 12.779,380 | |
Chile | 2002 | 77,860 | 15.497.046 | 10.778,784 |
2007 | 78,553 | 16.284.741 | 13.171,639 | |
Uruguay | 2002 | 75,307 | 3.363.085 | 7.727,002 |
2007 | 76,384 | 3.447.496 | 10.611,463 |
El primer argumento es el número de la columna que queremos agrupar. En este caso, la columna pais
es la primera. El segundo argumento es la alineación vertical. Por defecto, collapse_rows
pone las etiquetas en el centro, pero la convención más general es ponerlas arriba.
¿Qué es esa kable_styling()
? {kableExtra} permite cambiar el estilo de las tablas muy fácilmente. kable_styling
es el estilo por defecto, que es igual al que produce kable
, pero tiene muchos otros. Si viste tablas hechas en LaTeX, quizás este estilo te resulte familiar:
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74,340 | 38.331.121 | 8.797,641 |
2007 | 75,320 | 40.301.927 | 12.779,380 | |
Chile | 2002 | 77,860 | 15.497.046 | 10.778,784 |
2007 | 78,553 | 16.284.741 | 13.171,639 | |
Uruguay | 2002 | 75,307 | 3.363.085 | 7.727,002 |
2007 | 76,384 | 3.447.496 | 10.611,463 |
La función column_spec
permite cambiar los parámetros gráficos de una o más columnas. En este caso cambiamos la primera columna (column = 1
) para que las palabras aparezcan italizadas (italic = TRUE
):
paises_tabla %>%
column_spec(column = 1, italic = TRUE) %>%
collapse_rows(columns = 1, valign = "top") %>%
kable_styling()
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74,340 | 38.331.121 | 8.797,641 |
2007 | 75,320 | 40.301.927 | 12.779,380 | |
Chile | 2002 | 77,860 | 15.497.046 | 10.778,784 |
2007 | 78,553 | 16.284.741 | 13.171,639 | |
Uruguay | 2002 | 75,307 | 3.363.085 | 7.727,002 |
2007 | 76,384 | 3.447.496 | 10.611,463 |
Lo notable de column_spec
es que en sus argumentos se pueden poner vectores de manera de generar formato condicional. Para resaltar con negrita únicamente el país “Argentina”:
paises_tabla %>%
column_spec(column = 1, bold = (paises_seleccion$pais == "Argentina")) %>%
collapse_rows(columns = 1, valign = "top") %>%
kable_styling()
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74,340 | 38.331.121 | 8.797,641 |
2007 | 75,320 | 40.301.927 | 12.779,380 | |
Chile | 2002 | 77,860 | 15.497.046 | 10.778,784 |
2007 | 78,553 | 16.284.741 | 13.171,639 | |
Uruguay | 2002 | 75,307 | 3.363.085 | 7.727,002 |
2007 | 76,384 | 3.447.496 | 10.611,463 |
Conviene detenerse para mirar un poco con detalle el código. La llamada a column_spec
está cambiando el formato de la columna 1. En particular, va a determinar si el texto es en negrita (bold) o no. Y la forma para determinarlo es el vector paises$pais == "Argentina"
. ¿Qué es ese vector?
## [1] TRUE TRUE FALSE FALSE FALSE FALSE
Por lo tanto, column_spec(column = 1, bold = (paises$pais == "Argentina"))
va a hacer que las dos primera filas de la columna uno estén en negrita, y las demás no. Luego, collapse_rows
colapsa las filas según el país y entonces esas dos primeras filas se transforman en una.
Esto da un montón de flexibilidad en el estilo del texto. Por ejemplo, se puede hacer que el color del texto cambie según el valor usando column_spec
y spec_color
.
paises_tabla %>%
column_spec(3, color = spec_color(paises_seleccion$esperanza_de_vida)) %>%
collapse_rows(columns = 1, valign = "top") %>%
kable_styling()
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74,340 | 38.331.121 | 8.797,641 |
2007 | 75,320 | 40.301.927 | 12.779,380 | |
Chile | 2002 | 77,860 | 15.497.046 | 10.778,784 |
2007 | 78,553 | 16.284.741 | 13.171,639 | |
Uruguay | 2002 | 75,307 | 3.363.085 | 7.727,002 |
2007 | 76,384 | 3.447.496 | 10.611,463 |
La función nueva, spec_color
genera colores a partir de un vector. Podés ver cómo funciona en esta linea:
## [1] "#440154FF" "#3D4D8AFF" "#90D743FF" "#FDE725FF" "#3D4D8AFF" "#228D8DFF"
Esos números son representaciones en hexadecimal de los colores que ves en la tabla. Podés pasarle cualquier serie de colores, no sólo la creada con spec_color
.
Así como se puede cambiar el estilo de las columnas con column_spec
, se puede cambiar el estilo de las filas con row_spec
. Por ejemplo, se puede resaltar cada 2 líneas con este código:
paises_tabla %>%
row_spec(row = seq(2, nrow(paises_seleccion), by = 2), background = "azure") %>%
collapse_rows(columns = 1, valign = "top") %>%
kable_styling()
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74,340 | 38.331.121 | 8.797,641 |
2007 | 75,320 | 40.301.927 | 12.779,380 | |
Chile | 2002 | 77,860 | 15.497.046 | 10.778,784 |
2007 | 78,553 | 16.284.741 | 13.171,639 | |
Uruguay | 2002 | 75,307 | 3.363.085 | 7.727,002 |
2007 | 76,384 | 3.447.496 | 10.611,463 |
row_spec
está cambiando el fondo (background) al color “azure” (que es ese celestito) a las filas indicadas por seq(2, nrow(paises_seleccion), by = 2)
. ¿Qué es eso? seq
genera una secuencia (de sequence) de números empezando en 2, terminando en la cantidad de filas de paises_seleccion
y saltando de a dos. En resumen:
## [1] 2 4 6
Como caso especial, se puede usar row = 0
en row_spec
para cambiar el formato del encabezado.
paises_tabla %>%
row_spec(row = 0, underline = TRUE) %>%
collapse_rows(columns = 1, valign = "top") %>%
kable_styling()
País | Año | Esperanza de vida | Población | PBI per cápita |
---|---|---|---|---|
Argentina | 2002 | 74,340 | 38.331.121 | 8.797,641 |
2007 | 75,320 | 40.301.927 | 12.779,380 | |
Chile | 2002 | 77,860 | 15.497.046 | 10.778,784 |
2007 | 78,553 | 16.284.741 | 13.171,639 | |
Uruguay | 2002 | 75,307 | 3.363.085 | 7.727,002 |
2007 | 76,384 | 3.447.496 | 10.611,463 |
Esto es sólo una mínima parte de lo que se puede hacer con el paquete {kableExtra}. Para ejemplos mucho más detallados, te recomendamos leer la viñeta completa