¿Qué es?

Es un procesador de texto que ofrece además la posibilidad de incluir trozos de código desde R (u otros formatos). El principal beneficio de esta herramienta es que permite trabajar en un sólo documento tanto la redacción del contenido narrativo de reportes de investigación, como también la construcción y presentación formal de resultados de análisis estadísticos. (https://bookdown.org/gboccardo/manual-ED-UCH/)

Aquí el cheatsheet: https://www.rstudio.com/wp-content/uploads/2015/02/rmarkdown-cheatsheet.pdf

El paquete Knitr integra en un sólo archivo markdown el texto ingresado en formato RMarkdown y los resultados de la ejecución de los códigos construidos mediante R.

Elementos del Rmarkdown

El encabezado, ese lo modificamos desde que abrimos el archivo y se escribe automáticamente en el código.

El texto, es lo que escribimos.

El primer título se pone con un signo de numeral

Título 1

Subtítulo 1

Subtítulo 1.1

Subtítulo 2

Subtítulo 2.1

También hay varias opciones para resaltar el texto.

negrita

cursiva

subrayado

superindice2

subindice2

Podemos también hacer listas

  • Elemento 1
  • Elemento 2
    1. Sub elemento 1
    2. Sub elemento 2

El código, insertamos los “chunks”. Aprovechemos para instalar los paquetes de hoy.

library(pacman)
p_load(dplyr, ggplot2, haven, janitor, flextable, plotly)

echo = FALSE significa que no se desplegará la sintaxis en el reporte, pero sí se ejecutará la operación y mostrarán los resultados.

message = FALSE indica que no se mostrarán los mensajes de información en el informe final.

warning = FALSE no nos mostrará advertencias generadas por el código.

También, vamos a cargar las bases de datos para hoy.

setwd("~/Desktop/R con MONICA/Materiales sesión 4-20251023")
load("~/Desktop/R con MONICA/Materiales sesión 4-20251023/Datos_sesion4.RData")

Tabla

Primero recodifiquemos las variables.

Percepción de la economía.

lapop_2023 <- lapop_2023 %>% 
  mutate(soct2 = as.numeric(soct2)) %>% 
  mutate(soct2=case_when(soct2==1~"Mejor",
                         soct2==2~"Igual",
                         soct2==3~"Peor"),
         soct2=factor(soct2, levels=c("Peor", "Igual", "Mejor")))

Ahora la aprobación presidencial.

lapop_2023 <- lapop_2023 %>%
    mutate(m1 = as.numeric(m1)) %>% 
  mutate(m1=case_when(m1 %in% c(1,2)~"Bueno",
                      m1==3~"Regular",
                      m1 %in% c(4,5)~"Malo"),
         m1=factor(m1, levels = c("Malo", "Regular", "Bueno")))

Hagamos una tabla bivariada.

tabla_cruzada <- lapop_2023 %>%
  # Filtra valores perdidos
  filter(!is.na(soct2), !is.na(m1)) %>%
  # Crea tabla de frecuencias
  tabyl(soct2, m1) %>%
  adorn_totals("row") %>% 
  # Convierte a porcentajes por columna
  adorn_percentages("col") %>%
  # Formatea porcentajes con 1 decimal
  adorn_pct_formatting(digits = 1) %>%
  # Agrega N total en cada celda 
  adorn_ns()

tabla_cruzada
##  soct2         Malo      Regular        Bueno
##   Peor  75.4% (141)  58.8% (292)  37.3% (304)
##  Igual  18.7%  (35)  31.2% (155)  29.4% (240)
##  Mejor   5.9%  (11)  10.1%  (50)  33.3% (271)
##  Total 100.0% (187) 100.0% (497) 100.0% (815)

Formateamos con flextable.

tabla_flex <- tabla_cruzada %>%
  select(-any_of("NA")) %>%  # Remover columna NA si existe
  flextable() %>%
  set_caption("Percepción de la situación económica según aprobación presidencial") %>%
  theme_vanilla() %>%
  set_header_labels(
    soct2 = "Situación Económica"
  ) %>%
  add_header_row(
    values = c("", "Aprobación Presidencial"), 
    colwidths = c(1, ncol(tabla_cruzada) - 1)
  ) %>%
  bold(part = "header") %>%
  align(align = "center", part = "header") %>%
  align(j = -1, align = "center", part = "body") %>%
  align(j = 1, align = "left", part = "body") %>%
  width(j = 1, width = 2.0) %>%
  width(j = -1, width = 1.3) %>%
  # Colorear filas alternadas (si soct2 tiene categorías específicas)
  bg(i = seq(1, nrow(tabla_cruzada)-1, 2), bg = "#f8f9fa") %>%
  bg(i = seq(2, nrow(tabla_cruzada)-1, 2), bg = "#ffffff") %>%
  # Resaltar fila de totales
  bg(i = nrow(tabla_cruzada), bg = "#e9ecef") %>%
  bold(i = nrow(tabla_cruzada), part = "body") %>%
  add_footer_lines("Elaboración propia con datos de LAPOP 2023")

# Mostrar la tabla
tabla_flex
Percepción de la situación económica según aprobación presidencial

Aprobación Presidencial

Situación Económica

Malo

Regular

Bueno

Peor

75.4% (141)

58.8% (292)

37.3% (304)

Igual

18.7% (35)

31.2% (155)

29.4% (240)

Mejor

5.9% (11)

10.1% (50)

33.3% (271)

Total

100.0% (187)

100.0% (497)

100.0% (815)

Elaboración propia con datos de LAPOP 2023

Gráfico

Vamos a hacer los dos gráficos que hicimos.

Calculamos porcentajes:

datos_porcentajes <- lapop_2023 %>%
  count(m1) %>%
  mutate(porcentaje = n / sum(n) * 100)

Hacemos el gráfico.

grafico1 <- datos_porcentajes %>% 
  filter(!is.na(m1)) %>% 
  ggplot(aes(x = m1, y = porcentaje, fill = m1)) + 
  geom_col(
    color = "black",         
    alpha = 0.7,             
    width = 0.6) +
  geom_text(aes(label = paste0(round(porcentaje, 1), "%")), 
            vjust = -0.5, size = 4, fontface = "bold") + 
  scale_y_continuous(expand = c(0, 0),
                     limits = c(0, 100)) +
scale_fill_manual(values = c("Malo" = "#E74C3C",      
                             "Regular" = "#95A5A6",   
                             "Bueno" = "#16A085"))  +
  labs(
    title="Aprobación presidencial de Rodrigo Chaves 2023",
    subtitle="Hablando en general acerca del gobierno actual, ¿diría usted que el trabajo que está realizando el presidente...?:",
    x="Aprobación",
    y="Frecuencia",
    caption="Fuente: elaboración propia con datos de LAPOP 2023"
  ) +
  theme_minimal()+
  theme(
    # Sin leyenda
    legend.position = "none",
    
    # Título: centrado, negrita, tamaño 14
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    
    # Subtítulo: centrado, cursiva, tamaño 12
    plot.subtitle = element_text(hjust = 0.5, face = "italic", size = 12),
    
    # Fuente (caption): centrada, tamaño 10
    plot.caption = element_text(hjust = 0.5, size = 10),
    
    # Títulos de los ejes: tamaño 8, color gris
    axis.title.x = element_text(size = 8, color = "gray40"),
    axis.title.y = element_text(size = 8, color = "gray40"),
    
    # Texto de los ejes (números): tamaño 8, color gris
    axis.text.x = element_text(size = 8, color = "gray40"),
    axis.text.y = element_text(size = 8, color = "gray40")
  )

grafico1

Podemos hacerlo interactivo.

ggplotly(grafico1)

Ahora el de dispersión.

grafico2 <- subset_vdem %>% 
  filter(año=="2024") %>% 
  ggplot(aes(x=violencia_politica, y=electoral))+ 
  geom_point(color = "#3498DB",  # Color azul
             size = 3,            # Tamaño de los puntos
             alpha = 0.7,         # Transparencia
             shape = 19) +         # Forma del punto (19 = círculo sólido) 
  labs(title = "Relación entre violencia política y democracia electoral",
       subtitle = "Países de América Latina, 2024",
       x = "Índice de Violencia Política",
       y = "Índice de Democracia Electoral",
       caption = "Fuente: V-Dem Dataset 2024")+  
  theme_minimal()+
  theme(
    # Título: centrado, negrita, tamaño 14
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    
    # Subtítulo: centrado, cursiva, tamaño 12
    plot.subtitle = element_text(hjust = 0.5, face = "italic", size = 12),
    
    # Caption (fuente): centrado, tamaño 10
    plot.caption = element_text(hjust = 0.5, size = 10),
    
    # Títulos de los ejes: tamaño 8, color gris
    axis.title.x = element_text(size = 8, color = "grey50"),
    axis.title.y = element_text(size = 8, color = "grey50"),
    
    # Texto de los ejes: tamaño 8, color gris
    axis.text.x = element_text(size = 8, color = "grey50"),
    axis.text.y = element_text(size = 8, color = "grey50")
  )
grafico2

Interactivo:

ggplotly(grafico2)