1 Autor


Álvaro Alonso Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)
Visita mi Web de R



2 Tabla Sencilla


Vamos a crear una tabla sencilla en la que incluiremos una columna con países, otra su capital, otra con la población y otra si presentan o no mar. Para ello utilizaremos la librería knitr. Knitr es una librería de R que compila documentos escritos en Rmarkdown y que combinan texto y análisis hacia otros formatos.

# Cargar librería para tablas
library(knitr)

# Crear una tabla sencilla
paises <- data.frame(
  Pais = c("Argentina", "Suiza", "Egipto", "Australia", "Mongolia", "Japón"),
  Capital = c("Buenos Aires", "Berna", "El Cairo", "Canberra", "Ulán Bator", "Tokio"),
  Poblacion_millones = c(45, 8.7, 109, 25.7, 3.3, 126),
  Tiene_mar = c("Sí", "No", "Sí", "Sí", "No", "Sí")
)

Ahora mostraremos el resultado

# Mostrar la tabla en formato markdown
kable(paises, col.names = c("País", "Capital", "Población (millones)", "¿Tiene acceso al mar?"))
País Capital Población (millones) ¿Tiene acceso al mar?
Argentina Buenos Aires 45.0
Suiza Berna 8.7 No
Egipto El Cairo 109.0
Australia Canberra 25.7
Mongolia Ulán Bator 3.3 No
Japón Tokio 126.0

3 Tabla más compleja

Ahora podemos añadir algunos colores y hacer la tabla un poco más atractiva visualmente. Para ello utilizaremos la librería kableExtraademás de knitr

Cargamos las librerías.

# Cargar librerías necesarias
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.1

Generamos nuestros datos para la tabla.

# Crear la tabla de datos
paises <- data.frame(
  Pais = c("Argentina", "Suiza", "Egipto", "Australia", "Mongolia", "Japón"),
  Capital = c("Buenos Aires", "Berna", "El Cairo", "Canberra", "Ulán Bator", "Tokio"),
  Poblacion_millones = c(45, 8.7, 109, 25.7, 3.3, 126),
  Tiene_mar = c("Sí", "No", "Sí", "Sí", "No", "Sí")
)

y ahora representamos la tabla

# Crear la tabla con formato estético
kable(paises, col.names = c("País", "Capital", "Población (millones)", "¿Tiene acceso al mar?"), align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), 
                full_width = F, 
                position = "center") %>%
  row_spec(0, bold = TRUE, color = "white", background = "#4CAF50") %>%  # Encabezado en verde
  row_spec(1:6, background = c("#f2f2f2", "white")) %>%  # Alternar colores en las filas
  column_spec(3, bold = TRUE, color = "#D9534F") %>%  # Columna de población en negrita y rojo
  column_spec(4, background = ifelse(paises$Tiene_mar == "Sí", "#DFF0D8", "#F2DEDE")) %>%  # Colores según acceso al mar
  add_header_above(c(" " = 0, "Table 1. Países del mundo con sus capitales y población en millones de habitantes y acceso al mar" = 4))  # Encabezado extra
Table 1. Países del mundo con sus capitales y población en millones de habitantes y acceso al mar
País Capital Población (millones) ¿Tiene acceso al mar?
Argentina Buenos Aires 45.0
Suiza Berna 8.7 No
Egipto El Cairo 109.0
Australia Canberra 25.7
Mongolia Ulán Bator 3.3 No
Japón Tokio 126.0

4 Tabla para ANOVA

Ahora vamos a generar una tabla con los resultados de un test ANOVA. Para ello lo primero generaremos unos datos para utilizarlos como ejemplo.

# Generamos los datos simulados
set.seed(123)  
grupo <- rep(c("Grupo1", "Grupo2", "Grupo3"), each = 20)
valor <- c(rnorm(20, mean = 5.5, sd = 1),   # Grupo 1 
           rnorm(20, mean = 6, sd = 1.2), # Grupo 2 
           rnorm(20, mean = 6.5, sd = 1.1)) # Grupo 3 
datos <- data.frame(grupo, valor)
head(datos)
##    grupo    valor
## 1 Grupo1 4.939524
## 2 Grupo1 5.269823
## 3 Grupo1 7.058708
## 4 Grupo1 5.570508
## 5 Grupo1 5.629288
## 6 Grupo1 7.215065

Ahora hacemos el test ANOVA para comparar los tres grupos generados anteriormente.

# Modelo ANOVA
anova_model <- aov(valor ~ grupo, data = datos)

# Resumen del mocdelo ANOVA
summary(anova_model)
##             Df Sum Sq Mean Sq F value Pr(>F)  
## grupo        2  10.00   5.001   4.924 0.0107 *
## Residuals   57  57.89   1.016                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Los resultados del modelo los extraemos a una tabla y redondeamos a dos decimales los resultados del modelo.

# Extraer los resultados del ANOVA en una tabla
anova_results <- summary(anova_model)[[1]]

# Redondear los valores numéricos a 2 decimales
anova_results_rounded <- as.data.frame(anova_results)
anova_results_rounded <- round(anova_results_rounded, 2)

Y ahora creamos nuestra tabla con los resultados resumen del modelo ANOVA

# Crear una tabla con los resultados del ANOVA
library(knitr)
library(kableExtra)

kable(anova_results_rounded, col.names = c("Fuente de variación", "Suma de cuadrados", "Grados de libertad", "Cuadrados medios", "F-Valor", "Valor-p"), 
      caption = "Tabla de resultados del ANOVA (redondeado a dos decimales)", digits = 2, align = "c") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                full_width = F, 
                position = "center")
Tabla de resultados del ANOVA (redondeado a dos decimales)
Fuente de variación Suma de cuadrados Grados de libertad Cuadrados medios F-Valor Valor-p
grupo 2 10.00 5.00 4.92 0.01
Residuals 57 57.89 1.02 NA NA

5 Tabla dinámica

En la tabla dinámica vamos a poder seleccionar grupos de datos por cada columna. Necesitamos la librería ‘DT’. Lo primero será generar una tabla de ejemplo de la siguiente forma:

# Cargar la librería DT
library(DT)
## Warning: package 'DT' was built under R version 4.4.1
# Crear un data frame de ejemplo
data <- data.frame(
  Zona = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
  Alturas = c(150, 160, 170, 155, 165, 175, 158, 168, 178),
  Hecho = c("Sí", "No", "Sí", "No", "Sí", "No", "Sí", "No", "Sí")
)

Ahora generamos la tabla dinámica, en la que podremos buscar datos, seleccionar filas por un criterio, etc. Muy útil para grandes bases con mucha información.

# Mostrar la tabla interactiva con filtros
datatable(data, 
          options = list(pageLength = 10, autoWidth = TRUE), 
          filter = "top")

6 Tabla con gráficos en celdas

Cargamos las librerías necesarias y creamos un data frame de prueba para hacer la tabla con un columna que incluya una barra del resultados altura.

# Cargar las librerías necesarias
library(ggplot2)
library(gt)
## Warning: package 'gt' was built under R version 4.4.1
library(purrr)

# Crear un data frame de ejemplo
data <- data.frame(
  Zona = c("A", "B", "C", "A", "B", "C"),
  Altura = c(15, 160, 170, 255, 16, 175),
  Hecho = c("Sí", "No", "Sí", "No", "Sí", "No")
)

Ahora creamos la gráfica de las alturas y con ggplot seleccionamos el gráfico correspondiente. Ese gráfico se guarda como imagen temporal.

# Función para crear gráficos de barras
crear_barras <- function(altura) {
  # Crear un gráfico de barras sencillo
  p <- ggplot(data.frame(x = "Altura", y = altura), aes(x, y)) +
    geom_bar(stat = "identity", fill = "skyblue") +
    ylim(0, 300) +  # Ajustar el límite superior para hacer más visibles las diferencias
    theme_minimal() +  # Usar un tema sencillo
    theme(axis.text = element_blank(),  # Ocultar etiquetas de los ejes
          axis.title = element_blank(), # Ocultar títulos de los ejes
          panel.grid = element_blank()) # Eliminar la cuadrícula
  
  # Guardar el gráfico como una imagen temporal
  temp_img <- tempfile(fileext = ".png")
  ggsave(temp_img, plot = p, width = 4, height = 1, dpi = 150) # Ajustar tamaño y resolución
  
  return(temp_img) # Devolver la ruta de la imagen temporal
}

Ahora en cada fila incluímos el gráfico de las alturas.

# Aplicar la función para crear gráficos para cada fila
data$Barras <- map(data$Altura, crear_barras)

# Crear la tabla usando gt e incluir los gráficos
tabla_gt <- gt(data) %>%
  text_transform(
    locations = cells_body(vars(Barras)),
    fn = function(x) {
      web_image(x, height = px(50)) # Ajustar la altura de las imágenes
    }
  ) %>%
  cols_label(
    Zona = "Zona",
    Altura = "Altura",
    Hecho = "Hecho",
    Barras = "Gráfico de Barras"
  )
## Warning: Since gt v0.3.0, `columns = vars(...)` has been deprecated.
## • Please use `columns = c(...)` instead.

Representamos la tabla con la figura.

# Mostrar la tabla
tabla_gt
Zona Altura Hecho Gráfico de Barras
A 15
B 160 No
C 170
A 255 No
B 16
C 175 No

7 Tabla con gráficos en celdas más compleja

Ahora vamos a hacer la misma tabla pero con tres valores en la figura de barras. Para ello cargamos los paquetes necesarios y creamos el dataframe.

# Cargar las librerías necesarias
library(ggplot2)
library(gt)
library(purrr)

# Crear un data frame de ejemplo con tres alturas
data <- data.frame(
  Zona = c("A", "B", "C", "A", "B", "C"),
  Altura = c(250, 160, 170, 155, 165, 175),
  Altura2 = c(120, 130, 140, 145, 135, 155),  # Nueva columna de Alturas
  Altura3 = c(100, 110, 115, 125, 120, 130),  # Otra nueva columna de Alturas
  Hecho = c("Sí", "No", "Sí", "No", "Sí", "No")
)

Creamos un dataframe con los valores que contendrá el gráfico de barras.

# Función para crear gráficos de barras con tres columnas de colores
crear_barras <- function(altura, altura2, altura3) {
  # Crear un data frame con las tres alturas
  df <- data.frame(
    Tipo = c("Altura", "Altura2", "Altura3"),
    Valores = c(altura, altura2, altura3)
  )

  
#y creamos el gráfico de barras que lo guardaremos como una imagen temporal.
  
   
  # Crear el gráfico de barras
  p <- ggplot(df, aes(x = Tipo, y = Valores, fill = Tipo)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.6) +  # Barras agrupadas
    scale_fill_manual(values = c("Altura" = "skyblue", "Altura2" = "orange", "Altura3" = "green")) +  # Colores personalizados
    ylim(0, 300) +  # Ajustar el límite superior
    theme_minimal() +  # Usar un tema sencillo
    theme(axis.text = element_blank(),  # Ocultar etiquetas de los ejes
          axis.title = element_blank(), # Ocultar títulos de los ejes
          panel.grid = element_blank(), # Eliminar la cuadrícula
          legend.position = "none")  # Ocultar la leyenda
  
  # Guardar el gráfico como una imagen temporal
  temp_img <- tempfile(fileext = ".png")
  ggsave(temp_img, plot = p, width = 4, height = 1.5, dpi = 150)  # Ajustar el tamaño
  
  return(temp_img)  # Devolver la ruta de la imagen temporal
}

Finalmente aplicamos la función para crear el gráfico y creamos la tabla con la función ‘gt’.

# Aplicar la función para crear gráficos para cada fila
data$Barras <- pmap(list(data$Altura, data$Altura2, data$Altura3), crear_barras)

# Crear la tabla usando gt e incluir los gráficos
tabla_gt <- gt(data) %>%
  text_transform(
    locations = cells_body(vars(Barras)),
    fn = function(x) {
      web_image(x, height = px(50))  # Ajustar la altura de las imágenes
    }
  ) %>%
  cols_label(
    Zona = "Zona",
    Altura = "Altura",
    Altura2 = "Altura 2",
    Altura3 = "Altura 3",
    Hecho = "Hecho",
    Barras = "Gráfico de Barras"
  )
## Warning: Since gt v0.3.0, `columns = vars(...)` has been deprecated.
## • Please use `columns = c(...)` instead.

Para terminar mostramos el resultado.

# Mostrar la tabla
tabla_gt
Zona Altura Altura 2 Altura 3 Hecho Gráfico de Barras
A 250 120 100
B 160 130 110 No
C 170 140 115
A 155 145 125 No
B 165 135 120
C 175 155 130 No

8 CRÉDITOS

Álvaro Alonso Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)