Cargamos los paquetes

# Carga de paquetes
library(tidyverse)
library(knitr)

Cargamos las bases de datos

Utilizaremos la versiones en español de los sets de datos PlantGrowth e iris para facilitar la lectura de los informes:

PlantGrowth_es <- PlantGrowth %>%
  rename(peso = weight,
         tratamiento = group)

iris_es <- iris %>%
  rename(long_sepalo = Sepal.Length,
         ancho_sepalo = Sepal.Width,
         long_petalo = Petal.Length,
         ancho_petalo = Petal.Width,
         especie = Species)

Inserción de tablas

En R Markdown existen dos formas principales de incluir tablas en nuestro documento: escribiéndolas manualmente mediante la sintaxis de Markdown, o generándolas dinámicamente a partir de los resultados de nuestro análisis en R.

Tablas estáticas

Si necesitamos incluir una tabla de conceptos, un diseño empírico o datos fijos que no provienen de un código de R, podemos “dibujarla” directamente en el documento usando barras verticales (|) para separar columnas y guiones (-) para separar el encabezado.

El uso de los dos puntos (:) en la línea de guiones permite definir la alineación de la columna (izquierda, centro o derecha). Por ejemplo:

Tratamiento Descripción Dosis (L/ha)
T0 Control (agua) 0
T1 Dosis recomendada 2
T2 Dosis doble 4

Al renderizar el documento, R Markdown convertirá automáticamente este texto en una tabla estructurada, con líneas divisorias y el texto alineado tal como se indicó.

Tablas dinámicas

Cuando generamos cuadros resúmenes a partir de nuestros datos, podemos imprimir el objeto directamente. A continuación, construimos una tabla resumen a partir de estadísticas descriptivas del set de datos PlantGrowth_es:

resumen <- PlantGrowth_es %>%
  group_by(tratamiento) %>%
  summarise(
    n = n(),
    peso_promedio = round(mean(peso), 2),
    desvio = round(sd(peso), 2)
  )

# Imprimimos el resultado crudo
resumen
## # A tibble: 3 × 4
##   tratamiento     n peso_promedio desvio
##   <fct>       <int>         <dbl>  <dbl>
## 1 ctrl           10          5.03   0.58
## 2 trt1           10          4.66   0.79
## 3 trt2           10          5.53   0.44

Si renderizamos el documento en este punto, veremos que la salida de resumen es funcional, pero su aspecto visual es rústico y similar al de la consola de RStudio (sin líneas divisorias).

Para transformar esta salida en una tabla formal y profesional, utilizamos la función kable() del paquete knitr (que ya cargamos al inicio del capítulo). Esta función toma nuestros datos y les aplica automáticamente el formato de tabla adecuado para HTML o Word:

# Utilizamos kable para formatear la tabla
kable(resumen, 
      align = "c", # Centra el contenido de las columnas
      col.names = c("Tratamiento", "N", "Peso Prom. (g)", "Desvío"), # nombres de columnas en la tabla
      caption = "Tabla 1. Estadísticas descriptivas del peso por tratamiento.") # título de la tabla
Tabla 1. Estadísticas descriptivas del peso por tratamiento.
Tratamiento N Peso Prom. (g) Desvío
ctrl 10 5.03 0.58
trt1 10 4.66 0.79
trt2 10 5.53 0.44

Ejemplo integrador

A continuación se muestra un ejemplo que integra manipulación, visualización y una tabla en un único documento R Markdown, aplicado al dataset iris_es.

Primero, calculamos los promedios de las dimensiones de los pétalos para cada especie y presentamos el resultado en una tabla con formato:

# Calculamos los promedios por especie y guardamos el resumen en un objeto llamado "resumen_iris"
resumen_iris <- iris_es %>%
  group_by(especie) %>%
  summarise(
    long_petalo_prom = round(mean(long_petalo), 2),
    ancho_petalo_prom = round(mean(ancho_petalo), 2)
  )

# Imprimimos la tabla con formato kable
kable(resumen_iris, 
      align = "c", 
      col.names = c("Especie", "Long. pétalo prom. (cm)", "Ancho pétalo prom. (cm)"),
      caption = "Tabla 2. Promedios de longitud y ancho de pétalo por especie.")
Tabla 2. Promedios de longitud y ancho de pétalo por especie.
Especie Long. pétalo prom. (cm) Ancho pétalo prom. (cm)
setosa 1.46 0.25
versicolor 4.26 1.33
virginica 5.55 2.03

Luego, utilizamos el mismo conjunto de datos para generar un gráfico de dispersión que nos permita visualizar la relación entre estas dos variables, diferenciando por especie:

ggplot(iris_es, aes(x = especie, y = long_petalo, fill = especie)) +
  geom_boxplot(alpha = 0.7, width = 0.6, color = "black", outlier.shape = 21) + 
  # Visualización de la distribución y datos atípicos
  geom_jitter(width = 0.1, alpha = 0.5, size = 2, color = "black") +   
  # Puntos individuales para mostrar la densidad de los datos
  stat_summary(fun = mean, geom = "point", shape = 23, size = 4, fill = "yellow", color = "black") + 
  # Resaltado de la media aritmética
  scale_fill_brewer(palette = "Set2") + 
  # Escala fija de 0 a 8 para una comparación estandarizada
  scale_y_continuous(limits = c(0, 8), breaks = 0:8) + 
  labs(title = "Distribución de la longitud del pétalo por especie", 
       x = "Especie",
       y = "Longitud del pétalo (cm)",
       fill = "Especie") + 
  theme_classic() +   
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 14, face = "bold"),
    axis.text = element_text(size = 13, face = "bold"),
    axis.ticks.length = unit(0.5, "cm"),
    legend.position = "none", # Opcional: quitamos la leyenda porque ya están los nombres en el eje
    panel.grid.major.x = element_line(color = "grey90") # Guía visual para la escala
  ) + 
  coord_flip()