1. Introducción

La gestión de datos es una de las habilidades más importantes al trabajar con R. Permite transformar, limpiar y preparar los datos para su análisis. En esta guía aprenderás a usar funciones clave del paquete tidyverse y otras herramientas esenciales para gestionar tus datos.

El análisis de datos tiene como objetivo extraer información de ello. Por ello se requiere entre otras operaciones: Extraer las variables existentes en los conjuntos de datos, extraer las observaciones preexistentes, derivar nuevas variables sobre las ya existentes y cambiar las unidades de las variables:

El paquete tidyverse provee una serie de herramientas destinadas a facilitar estos procesos.

Tidyverse es una colección de paquetes disponibles en R y orientados a la gestión, importación, exploración de datos. Esta librería está compuesta por los siguientes librerías.

  • readr: Permite leer archivos de texto plano (como .csv, .tsv, .txt) de forma rápida, ordenada y sin alterar el formato de los datos.

  • dplyr: Es el corazón de la gestión de datos. Permite seleccionar, filtrar, agrupar, transformar y resumir datos de manera eficiente y legible.

  • ggplot2: Es una de las mejores herramientas para crear gráficos profesionales y altamente personalizables, basada en la gramática de los gráficos.

  • tibble: Es una versión mejorada de los data frames de R. Los tibbles no modifican los datos sin tu permiso y muestran la información de forma más limpia.

  • tidyr: Ayuda a ordenar y limpiar datos “sucios”, es decir, a transformarlos a un formato que sea fácil de analizar (“formato tidy”).

  • purr Extiende las funcionalidades de las listas y permite aplicar funciones de forma elegante y segura. Es una alternativa a los bucles for.

  • stringr: Facilita el trabajo con texto (cadenas de caracteres), como limpiar nombres, buscar patrones o modificar contenido textual.

  • forcats: Está especializada en el manejo de factores (variables categóricas). Permite ordenarlos, agrupar niveles o renombrarlos fácilmente.

2. Preparación del entorno

Instalación y carga de paquetes

# Instalar si no los tienes
# install.packages("tidyverse")

# Cargar librerías
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Toma nota acerca del mensaje de conflictos que se imprime cuando cargas el paquete tidyverse. Te indica que dplyr sobrescribe algunas funciones de R base. Si deseas usar la versión base de estas funciones después de cargar dplyr, necesitarás usar sus nombres completos: stats::filter(); ystats::lag(). .

Carga de datos

La función read_csv() del paquete readr se utiliza para cargar archivos .csv (Comma-Separated Values) en R de manera rápida, ordenada y con detección automática de tipos de datos.

# Cargar archivo CSV
# Cambia la ruta por la ubicación real de tu archivo
datos <- read_csv("actividad_vidasaludable.csv")
## Rows: 65528 Columns: 10
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (9): Tipo dcto, Sexo, Regimen, Actividad, Grupo Poblacional, Area, Comun...
## dbl (1): Edad
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

3. Exploración inicial

Una vez cargamos una base de datos en R, el primer paso fundamental es explorarla para entender su estructura, el tipo de información que contiene y detectar posibles errores o valores inusuales.

Este proceso se conoce como análisis exploratorio de datos (EDA, por sus siglas en inglés) y permite responder preguntas como:

*¿Qué columnas tiene la base?

*¿Qué tipo de variables hay (númericas, categóricas, fechas, etc.)?

*¿Existen valores faltantes o extremos?

*¿Cuál es el rango de cada variable?

names(datos)     # Nombres de columnas
##  [1] "Tipo dcto"              "Sexo"                   "Edad"                  
##  [4] "Regimen"                "Actividad"              "Grupo Poblacional"     
##  [7] "Area"                   "Comuna / Corregimiento" "Condiciones"           
## [10] "Etnias"
glimpse(datos)   # Vista general
## Rows: 65,528
## Columns: 10
## $ `Tipo dcto`              <chr> "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC…
## $ Sexo                     <chr> "M", "F", "F", "F", "F", "F", "F", "F", "F", …
## $ Edad                     <dbl> 38, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 3…
## $ Regimen                  <chr> "Sisben", "Sisben", "Sisben", "Sisben", "Sisb…
## $ Actividad                <chr> "Atención de personas que asisten a los gimna…
## $ `Grupo Poblacional`      <chr> "General", "General", "General", "General", "…
## $ Area                     <chr> "U", "U", "U", "U", "U", "U", "U", "U", "U", …
## $ `Comuna / Corregimiento` <chr> "Comuna san joaquín", "Comuna Villa Santana",…
## $ Condiciones              <chr> "Ninguna", "Desplazado", "Desplazado", "Despl…
## $ Etnias                   <chr> "Mestizo", "Negro(a) Mulato(a) Afrocolombiano…
summary(datos)   # Resumen estadístico
##   Tipo dcto             Sexo                Edad          Regimen         
##  Length:65528       Length:65528       Min.   : 18.00   Length:65528      
##  Class :character   Class :character   1st Qu.: 29.00   Class :character  
##  Mode  :character   Mode  :character   Median : 43.00   Mode  :character  
##                                        Mean   : 47.28                     
##                                        3rd Qu.: 66.00                     
##                                        Max.   :530.00                     
##   Actividad         Grupo Poblacional      Area          
##  Length:65528       Length:65528       Length:65528      
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
##  Comuna / Corregimiento Condiciones           Etnias         
##  Length:65528           Length:65528       Length:65528      
##  Class :character       Class :character   Class :character  
##  Mode  :character       Mode  :character   Mode  :character  
##                                                              
##                                                              
## 
head(datos,n=10)      # 10 Primeras filas
## # A tibble: 10 × 10
##    `Tipo dcto` Sexo   Edad Regimen Actividad           `Grupo Poblacional` Area 
##    <chr>       <chr> <dbl> <chr>   <chr>               <chr>               <chr>
##  1 CC          M        38 Sisben  Atención de person… General             U    
##  2 CC          F        33 Sisben  Atención de person… General             U    
##  3 CC          F        33 Sisben  Atención de person… General             U    
##  4 CC          F        33 Sisben  Atención de person… General             U    
##  5 CC          F        33 Sisben  Atención de person… General             U    
##  6 CC          F        33 Sisben  Atención de person… General             U    
##  7 CC          F        33 Sisben  Atención de person… General             U    
##  8 CC          F        33 Sisben  Atención de person… General             U    
##  9 CC          F        33 Sisben  Atención de person… General             U    
## 10 CC          F        33 Sisben  Atención de person… General             U    
## # ℹ 3 more variables: `Comuna / Corregimiento` <chr>, Condiciones <chr>,
## #   Etnias <chr>

En R, las variables categóricas pueden estar almacenadas como texto (character) o como factores (factor). Aunque ambas representan categorías, los factores son más eficientes para análisis estadísticos y visualizaciones, ya que internamente guardan los niveles de las categorías de forma ordenada.

Cuando importamos una base de datos, es común que las columnas con texto se carguen como character. Para transformarlas a factor, podemos usar la función mutate_if() del paquete dplyr.

nuevo <- datos %>% mutate_if(is.character, as.factor)
glimpse(nuevo)
## Rows: 65,528
## Columns: 10
## $ `Tipo dcto`              <fct> CC, CC, CC, CC, CC, CC, CC, CC, CC, CC, CC, C…
## $ Sexo                     <fct> M, F, F, F, F, F, F, F, F, F, F, F, F, F, F, …
## $ Edad                     <dbl> 38, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 3…
## $ Regimen                  <fct> Sisben, Sisben, Sisben, Sisben, Sisben, Sisbe…
## $ Actividad                <fct> Atención de personas que asisten a los gimnas…
## $ `Grupo Poblacional`      <fct> General, General, General, General, General, …
## $ Area                     <fct> U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, …
## $ `Comuna / Corregimiento` <fct> Comuna san joaquín, Comuna Villa Santana, Com…
## $ Condiciones              <fct> Ninguna, Desplazado, Desplazado, Desplazado, …
## $ Etnias                   <fct> Mestizo, Negro(a) Mulato(a) Afrocolombiano(a)…

Este código hace lo siguiente:

  • mutate_if(is.character, as.factor): Recorre todas las columnas y convierte aquellas que sean de tipo character en factor.

*glimpse(nuevo): Nos permite ver la nueva estructura de la base, confirmando que las variables fueron convertidas correctamente.

Nota: El símbolo %>%, conocido como pipe o tubería, es una herramienta clave en el ecosistema tidyverse. Este operador proviene del paquete magrittr (incluido en dplyr) y su función principal es encadenar operaciones de forma secuencial y legible. El operador %>% toma el resultado de una operación y lo pasa como entrada a la siguiente. Se lee como: “Toma esto… y luego haz esto otro con eso”.

4. Selección y filtrado

Una vez tenemos nuestros datos organizados, es común que no necesitemos trabajar con toda la base completa, sino solo con ciertas columnas o con filas que cumplan condiciones específicas. Para ello, el paquete dplyr nos ofrece funciones muy útiles como select() para elegir columnas, y filter() para quedarnos únicamente con las observaciones que nos interesan. A continuación, te mostramos cómo usar estas funciones junto al operador %>% para realizar estas tareas de forma clara y eficiente.

nuevo %>% select(Sexo, Edad, Regimen, `Grupo Poblacional`) #Se utiliza
## # A tibble: 65,528 × 4
##    Sexo   Edad Regimen `Grupo Poblacional`
##    <fct> <dbl> <fct>   <fct>              
##  1 M        38 Sisben  General            
##  2 F        33 Sisben  General            
##  3 F        33 Sisben  General            
##  4 F        33 Sisben  General            
##  5 F        33 Sisben  General            
##  6 F        33 Sisben  General            
##  7 F        33 Sisben  General            
##  8 F        33 Sisben  General            
##  9 F        33 Sisben  General            
## 10 F        33 Sisben  General            
## # ℹ 65,518 more rows
nuevo %>% filter(Edad > 40)
## # A tibble: 34,001 × 10
##    `Tipo dcto` Sexo   Edad Regimen      Actividad      `Grupo Poblacional` Area 
##    <fct>       <fct> <dbl> <fct>        <fct>          <fct>               <fct>
##  1 CC          M        42 Contributivo Atención de p… General             U    
##  2 CC          M        42 Contributivo Atención de p… General             U    
##  3 CC          M        42 Contributivo Atención de p… General             U    
##  4 CC          M        42 Contributivo Atención de p… General             U    
##  5 CC          M        42 Contributivo Atención de p… General             U    
##  6 CC          M        42 Contributivo Atención de p… General             U    
##  7 CC          M        42 Contributivo Atención de p… General             U    
##  8 CC          M        42 Contributivo Atención de p… General             U    
##  9 CC          M        42 Contributivo Atención de p… General             U    
## 10 CC          M        42 Contributivo Atención de p… General             U    
## # ℹ 33,991 more rows
## # ℹ 3 more variables: `Comuna / Corregimiento` <fct>, Condiciones <fct>,
## #   Etnias <fct>

Nota: En R, cuando el nombre de una columna contiene espacios, como por ejemplo “Grupo Poblacional”, no puede ser interpretado directamente como un nombre de variable normal. Si intentas escribirlo sin comillas, R generará un error porque esperaría una sola palabra sin espacios. Para solucionar esto, usamos comillas invertidas (también llamadas backticks). Estas comillas especiales le dicen a R: “Esto es un nombre de columna literal, tal como aparece, aunque tenga espacios.”

Actividad: ¿Cómo filtrarías las personas del régimen Sisben?

5. Renombrar las columnas

Renombra las columnas de un dataset. No agrega nuevas columnas o altera el orden de las filas de la columna modificada. Utiliza el formato: rename(dataframe, nuevo_nombe = antiguo_nombre).

rename(datos,TID=`Tipo dcto`,Condicion=Condiciones)
## # A tibble: 65,528 × 10
##    TID   Sexo   Edad Regimen Actividad                 `Grupo Poblacional` Area 
##    <chr> <chr> <dbl> <chr>   <chr>                     <chr>               <chr>
##  1 CC    M        38 Sisben  Atención de personas que… General             U    
##  2 CC    F        33 Sisben  Atención de personas que… General             U    
##  3 CC    F        33 Sisben  Atención de personas que… General             U    
##  4 CC    F        33 Sisben  Atención de personas que… General             U    
##  5 CC    F        33 Sisben  Atención de personas que… General             U    
##  6 CC    F        33 Sisben  Atención de personas que… General             U    
##  7 CC    F        33 Sisben  Atención de personas que… General             U    
##  8 CC    F        33 Sisben  Atención de personas que… General             U    
##  9 CC    F        33 Sisben  Atención de personas que… General             U    
## 10 CC    F        33 Sisben  Atención de personas que… General             U    
## # ℹ 65,518 more rows
## # ℹ 3 more variables: `Comuna / Corregimiento` <chr>, Condicion <chr>,
## #   Etnias <chr>

6. Limpieza de datos atípicos

Durante el análisis de datos, es fundamental identificar y corregir valores atípicos o erróneos, ya que pueden distorsionar los resultados y generar conclusiones incorrectas. En este ejemplo, utilizamos boxplot() para visualizar posibles valores extremos en la variable Edad.

boxplot(nuevo$Edad)

Luego, con sum(nuevo$Edad > 300), contamos cuántos registros tienen edades inusualmente altas, que probablemente son errores de digitación (como 504 en lugar de 54). Usando unique() visualizamos cuáles son esos valores específicos.

sum(nuevo$Edad > 300)
## [1] 120
unique(nuevo[nuevo$Edad > 300, ])
## # A tibble: 5 × 10
##   `Tipo dcto` Sexo   Edad Regimen      Actividad       `Grupo Poblacional` Area 
##   <fct>       <fct> <dbl> <fct>        <fct>           <fct>               <fct>
## 1 CC          M       504 Contributivo Atención de pe… General             U    
## 2 CC          F       322 Contributivo Atención de pe… General             U    
## 3 CC          F       530 Sisben       Atención de pe… General             U    
## 4 CC          F       530 Sisben       Atención de pe… General             U    
## 5 CC          F       530 Sisben       Atención de pe… General             U    
## # ℹ 3 more variables: `Comuna / Corregimiento` <fct>, Condiciones <fct>,
## #   Etnias <fct>

Posteriormente corregimos manualmente los errores con asignaciones directas. Esta limpieza es clave para asegurar la calidad y confiabilidad del análisis.

# Correcciones
nuevo[nuevo$Edad == 504, ]$Edad <- 54
nuevo[nuevo$Edad == 322, ]$Edad <- 32
nuevo[nuevo$Edad == 530, ]$Edad <- 53

7. Creación y modificación de variables

En esta sección aprenderemos a crear nuevas variables a partir de las ya existentes, una tarea común y muy útil en el análisis de datos. Usaremos la función mutate() del paquete dplyr para generar una nueva variable categórica llamada Edad_agrupada, que clasifica a las personas en tres grupos según su edad: Joven (menores de 25 años), Adultez (entre 25 y 58 años) y Vejez (60 años o más). Esta transformación permite resumir la variable continua de edad en categorías más interpretables para ciertos análisis.

nuevo <- nuevo %>%
  mutate(Edad_agrupada = ifelse(Edad < 25, "Joven",
                         ifelse(Edad < 59, "Adultez", "Vejez")))
unique(nuevo$Edad_agrupada)
## [1] "Adultez" "Joven"   "Vejez"

Explicación del código: * nuevo <- nuevo %>%: Estamos tomando el data frame llamado nuevo y encadenando operaciones con el operador pipe %>%, lo que permite aplicar funciones de manera fluida.

  • mutate(...): Esta función se usa para crear o modificar variables dentro del data frame. En este caso, vamos a crear una nueva variable.

  • Edad_agrupada = ifelse(...): Estamos creando una nueva columna llamada Edad_agrupada, que se definirá usando condiciones lógicas.

  • ifelse(Edad < 25, "Joven", ...): Si la edad de una persona es menor a 25, se le asigna la categoría “Joven”.

  • ifelse(Edad < 59, "Adultez", "Vejez"): Si no se cumple la primera condición, se evalúa si la edad es menor a 59. Si es así, se le asigna “Adultez”. Si no, se le asigna “Vejez”.

Este tipo de recategorización es muy útil cuando queremos simplificar el análisis de variables continuas, especialmente en visualizaciones o modelos que requieren variables categóricas.

8. Ordenamiento

En muchos análisis necesitamos ordenar los datos según los valores de una variable, por ejemplo, para ver quiénes son los más jóvenes o los de mayor edad. Con la función arrange() de dplyr, podemos organizar las filas de nuestra base de datos de forma ascendente o descendente. En el primer ejemplo, los datos se ordenan de menor a mayor edad; en el segundo, usando desc(Edad), se ordenan de mayor a menor. Esta operación es muy útil para priorizar observaciones, detectar extremos o preparar datos para informes.

nuevo %>% arrange(Edad)
## # A tibble: 65,528 × 11
##    `Tipo dcto` Sexo   Edad Regimen    Actividad        `Grupo Poblacional` Area 
##    <fct>       <fct> <dbl> <fct>      <fct>            <fct>               <fct>
##  1 CC          F        18 Subsidiado Atención de per… General             U    
##  2 CC          F        18 Subsidiado Atención de per… General             U    
##  3 CC          F        18 Subsidiado Atención de per… General             U    
##  4 CC          F        18 Subsidiado Atención de per… General             U    
##  5 CC          F        18 Subsidiado Atención de per… General             U    
##  6 CC          F        18 Subsidiado Atención de per… General             U    
##  7 CC          F        18 Subsidiado Atención de per… General             U    
##  8 CC          F        18 Subsidiado Atención de per… General             U    
##  9 CC          F        18 Subsidiado Atención de per… General             U    
## 10 CC          F        18 Subsidiado Atención de per… General             U    
## # ℹ 65,518 more rows
## # ℹ 4 more variables: `Comuna / Corregimiento` <fct>, Condiciones <fct>,
## #   Etnias <fct>, Edad_agrupada <chr>
nuevo %>% arrange(desc(Edad))
## # A tibble: 65,528 × 11
##    `Tipo dcto` Sexo   Edad Regimen    Actividad        `Grupo Poblacional` Area 
##    <fct>       <fct> <dbl> <fct>      <fct>            <fct>               <fct>
##  1 CC          F        94 Subsidiado Atención de per… General             U    
##  2 CC          F        94 Subsidiado Atención de per… General             U    
##  3 CC          F        94 Subsidiado Atención de per… General             U    
##  4 CC          F        94 Subsidiado Atención de per… General             U    
##  5 CC          F        94 Subsidiado Atención de per… General             U    
##  6 CC          F        94 Subsidiado Atención de per… General             U    
##  7 CC          F        94 Subsidiado Atención de per… General             U    
##  8 CC          F        94 Subsidiado Atención de per… General             U    
##  9 CC          F        94 Subsidiado Atención de per… General             U    
## 10 CC          F        92 Subsidiado Atención de per… General             U    
## # ℹ 65,518 more rows
## # ℹ 4 more variables: `Comuna / Corregimiento` <fct>, Condiciones <fct>,
## #   Etnias <fct>, Edad_agrupada <chr>

9. Agrupamiento y resumen

Una parte esencial de la gestión de datos es poder resumir la información agrupada por categorías, lo cual nos permite extraer patrones o comparaciones entre grupos. La función group_by() de dplyr se utiliza para dividir la base de datos según una o más variables categóricas, como el sexo o el régimen de afiliación. Luego, con summarise() (o summarize()), se pueden aplicar funciones de resumen como la media, el conteo, la suma, entre otras. En el ejemplo, calculamos la edad promedio y el número de personas (n()) por cada combinación de Sexo y Regimen. Esto facilita el análisis comparativo entre diferentes grupos poblacionales.

nuevo %>%
  group_by(Sexo, Regimen) %>%
  summarise(promedio_edad = mean(Edad),
            N = n())
## `summarise()` has grouped output by 'Sexo'. You can override using the
## `.groups` argument.
## # A tibble: 6 × 4
## # Groups:   Sexo [2]
##   Sexo  Regimen      promedio_edad     N
##   <fct> <fct>                <dbl> <int>
## 1 F     Contributivo          49.6 30909
## 2 F     Sisben                41.4  6860
## 3 F     Subsidiado            41.6 13277
## 4 M     Contributivo          50.5  8309
## 5 M     Sisben                42.8  3867
## 6 M     Subsidiado            39.8  2306

10. Frecuencias y proporciones

Otra forma importante de explorar datos categóricos es a través de tablas de frecuencia y proporciones. Estas nos permiten conocer cuántas veces aparece cada categoría y qué porcentaje representan dentro del total. Con la función table() podemos contar la frecuencia absoluta de una variable (por ejemplo, cuántos hombres y mujeres hay). Luego, usando prop.table() sobre esa misma tabla, obtenemos la frecuencia relativa o proporción (es decir, el porcentaje que representa cada categoría respecto al total). También podemos aplicar estas funciones para analizar la relación entre dos variables, como Sexo y Regimen, generando así una tabla de doble entrada con sus proporciones correspondientes. Esto es clave para entender la composición y distribución de los datos.

with(nuevo, table(Sexo))
## Sexo
##     F     M 
## 51046 14482
with(nuevo, prop.table(table(Sexo)))
## Sexo
##         F         M 
## 0.7789952 0.2210048
with(nuevo, table(Sexo, Regimen))
##     Regimen
## Sexo Contributivo Sisben Subsidiado
##    F        30909   6860      13277
##    M         8309   3867       2306
with(nuevo, prop.table(table(Sexo, Regimen)))
##     Regimen
## Sexo Contributivo     Sisben Subsidiado
##    F   0.47169149 0.10468807 0.20261568
##    M   0.12680076 0.05901294 0.03519106

La función with() en R se utiliza para simplificar el acceso a las columnas de un data frame, evitando tener que escribir repetidamente el nombre del conjunto de datos. En lugar de escribir datos$columna1, datos$columna2, etc., podemos usar with(datos, expresión) y referirnos directamente a las columnas dentro del bloque. Esto hace que el código sea más limpio, más corto y más fácil de leer, especialmente cuando trabajamos con varias variables del mismo conjunto de datos. Por ejemplo, with(nuevo, table(Sexo)) le dice a R que dentro del objeto nuevo, use la columna Sexo para crear la tabla, sin necesidad de escribir nuevo$Sexo.

10. Actividades prácticas

  1. Usa filter() para seleccionar personas mayores de 60 años.
  2. Usa mutate() para crear una columna que diga “Menor” si la persona tiene menos de 18 años.
  3. Usa group_by() y summarise() para obtener el promedio de edad por grupo poblacional.

11. Conclusiones

La gestión de datos con el paquete dplyr se consolida como una de las habilidades más esenciales en el análisis de datos con R. Esta herramienta permite transformar, depurar, organizar y resumir grandes volúmenes de información de forma clara, eficiente y reproducible. A través de funciones intuitivas como select(), filter(), mutate(), arrange() y summarise(), se facilita la extracción de conocimiento a partir de datos crudos, permitiendo adaptar las bases a los objetivos del análisis de manera precisa.

Los ejemplos presentados en este documento constituyen una introducción práctica al potencial de dplyr, que forma parte del ecosistema tidyverse, ampliamente utilizado en ciencia de datos. Dominar estas funciones no solo optimiza el trabajo cotidiano con datos, sino que también permite estructurar flujos de trabajo coherentes, comprensibles y escalables para futuros proyectos de investigación o análisis profesional.

Para quienes deseen profundizar en estas técnicas, se recomienda consultar la documentación oficial de dplyr, así como el recurso interactivo R for Data Science, que combina teoría, ejemplos y ejercicios guiados. Este tipo de herramientas ofrecen una base sólida para desarrollar habilidades avanzadas en gestión de datos y avanzar con seguridad hacia etapas más complejas del análisis, como visualización, modelado y comunicación de resultados.