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.
# 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(). .
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.
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”.
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?
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>
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
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.
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>
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
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.
filter() para seleccionar personas mayores de 60
años.mutate() para crear una columna que diga “Menor” si
la persona tiene menos de 18 años.group_by() y summarise() para obtener
el promedio de edad por grupo poblacional.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.