Álvaro Alonso
Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)
Visita mi Web de
R
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 | Sí |
| Suiza | Berna | 8.7 | No |
| Egipto | El Cairo | 109.0 | Sí |
| Australia | Canberra | 25.7 | Sí |
| Mongolia | Ulán Bator | 3.3 | No |
| Japón | Tokio | 126.0 | Sí |
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
| País | Capital | Población (millones) | ¿Tiene acceso al mar? |
|---|---|---|---|
| Argentina | Buenos Aires | 45.0 | Sí |
| Suiza | Berna | 8.7 | No |
| Egipto | El Cairo | 109.0 | Sí |
| Australia | Canberra | 25.7 | Sí |
| Mongolia | Ulán Bator | 3.3 | No |
| Japón | Tokio | 126.0 | Sí |
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")
| 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 |
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")
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 | Sí | |
| B | 160 | No | |
| C | 170 | Sí | |
| A | 255 | No | |
| B | 16 | Sí | |
| C | 175 | No |
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 | Sí | |
| B | 160 | 130 | 110 | No | |
| C | 170 | 140 | 115 | Sí | |
| A | 155 | 145 | 125 | No | |
| B | 165 | 135 | 120 | Sí | |
| C | 175 | 155 | 130 | No |
Álvaro Alonso
Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)