Este documento consolida las operaciones fundamentales de limpieza de datos, orgenizadas en tres paquetes principales.
- El paquete dplyr
Las funciones clave incluyen: select para seleccionar columnas, filter para filtrar filas, arrange para ordenar, mutate para crear nuevas variables, group_by para agrupar y summarize (o summarise) para agregar datos. El operador %>% se pronuncia "then" y permite encadenar operaciones de forma legible.
1.1 Carga y exploración inicial
library(dplyr)
# Carga de datos y vista preliminar
ruta_archivo <- file.path('2014-07-08.csv')
datos_brutos <- read.csv(ruta_archivo, stringsAsFactors = FALSE)
cat("Dimensiones:", dim(datos_brutos), "\n")
print(head(datos_brutos))
# Convertir a tibble para mejor visualización
datos_tbl <- as_tibble(datos_brutos)
print(datos_tbl)
1.2 Funciones de transformación básicca
# Selección de columnas
select(datos_tbl, ip_id, paquete, pais)
select(datos_tbl, r_arch:pais)
select(datos_tbl, -tiempo)
select(datos_tbl, -(X:tamano))
# Filtrado de filas
filter(datos_tbl, paquete == "swirl")
filter(datos_tbl, version_r == "3.1.1", pais == "US")
filter(datos_tbl, version_r <= "3.0.2", pais == "IN")
filter(datos_tbl, pais == "US" | pais == "IN")
filter(datos_tbl, !is.na(version_r))
# Ordenación
arrange(datos_tbl2, ip_id) # Ascendente por defecto
arrange(datos_tbl2, desc(ip_id)) # Descendente
arrange(datos_tbl2, paquete, ip_id) # Orden múltiple
# Creación de nuevas variables
mutate(datos_tbl3, tamano_mb = tamano / 2^20)
mutate(datos_tbl3,
tamano_mb = tamano / 2^20,
tamano_gb = tamano_mb / 2^10)
# Resumen global
summarise(datos_tbl3, promedio_bytes = mean(tamano))
1.3 Agrupación y resumen
# Agrupar por paquete
grupos_paquete <- group_by(datos_tbl, paquete)
# Resumen por grupo
resumen_paquete <- summarise(grupos_paquete,
recuento = n(),
ips_unicas = n_distinct(ip_id),
paises_unicos = n_distinct(pais),
bytes_promedio = mean(tamano))
# Filtrado basado en el resumen
umbral <- quantile(resumen_paquete$ips_unicas, probs = 0.99)
mayor_unicidad <- filter(resumen_paquete, ips_unicas > 465)
mayor_unicidad_ordenada <- arrange(mayor_unicidad, desc(ips_unicas))
mayores_paises <- filter(resumen_paquete, paises_unicos > 60)
resultado_final <- arrange(mayores_paises, desc(paises_unicos), bytes_promedio)
print(resultado_final)
1.4 Versiones alternativas de la operación anterior
Versión anidada (menos legible):
resultado_anidado <- arrange(
filter(
summarise(
group_by(datos_tbl, paquete),
recuento = n(),
ips_unicas = n_distinct(ip_id),
paises_unicos = n_distinct(pais),
bytes_promedio = mean(tamano)
),
paises_unicos > 60
),
desc(paises_unicos),
bytes_promedio
)
print(resultado_anidado)
Versión con operader tubería (recomendada):
resultado_tuberia <- datos_tbl %>%
group_by(paquete) %>%
summarise(recuento = n(),
ips_unicas = n_distinct(ip_id),
paises_unicos = n_distinct(pais),
bytes_promedio = mean(tamano)) %>%
filter(paises_unicos > 60) %>%
arrange(desc(paises_unicos), bytes_promedio)
print(resultado_tuberia)
1.5 Ejemplo integral con tubería
datos_tbl %>%
select(ip_id, pais, paquete, tamano) %>%
mutate(tamano_mb = tamano / 2^20) %>%
filter(tamano_mb <= 0.5) %>%
arrange(desc(tamano_mb)) %>%
print()
- El paquete tidyr
2.1 Reconocimiento de datos (tidying)
library(tidyr)
library(readr)
library(dplyr)
# Convertir formato ancho a largo
datos_largos <- estudiantes2 %>%
gather(key = "clave_sexo_clase", value = "conteo", -grado) %>%
separate(clave_sexo_clase, into = c("sexo", "clase")) %>%
print()
# La función gather() transforma columnas en pares clave-valor.
# La función separate() divide una columna en múltiples columnas.
2.2 Distribución de datos
# Convertir formato largo a ancho
datos_anchos <- estudiantes3 %>%
gather(clave_clase, nota, clase1:clase5, na.rm = TRUE) %>%
spread(test, nota) %>%
mutate(clase_numero = parse_number(clave_clase)) %>%
print()
# La función spread() distribuye un par clave-valor en múltiples columnas.
2.3 Combinación de datos
# Selección de datos únicos
info_estudiantes <- estudiantes4 %>%
select(id, nombre, sexo) %>%
distinct() %>%
print()
libro_notas <- estudiantes4 %>%
select(id, clase, parcial, final) %>%
print()
# Combinación por columnas (join)
datos_combinados <- merge(libro_notas, info_estudiantes, by = "id")
# Combinación por filas (bind_rows)
aprobados <- mutate(aprobados, estado = "aprobado")
reprobados <- mutate(reprobados, estado = "reprobado")
todos <- bind_rows(aprobados, reprobados)
2.4 Ejemplo de procesamiento completo
sat %>%
select(-contains("total")) %>%
gather(clave_parte_sexo, conteo, -rango_puntaje) %>%
separate(clave_parte_sexo, into = c("parte", "sexo")) %>%
group_by(parte, sexo) %>%
mutate(total_grupo = sum(conteo),
proporcion = conteo / total_grupo) %>%
print()
- El paquete lubridate
3.1 Fecha y hora actual
library(lubridate)
# Obtener el día de la semana (1=Domingo, 2=Lunes, ...)
dia_semana_actual <- wday(today())
3.2 Parseo de fechas y horas
# Funciones de parseo flexible
ymd("1989-05-17")
ymd("1989 May 17")
mdy("March 12,1975")
dmy(25081985)
ymd("1920/1/2")
# Parseo de horas
hms("03:22:14")
ymd_hms(c("2010-04-14-04-35-59", "2010-01-01 12:00:00"))
ymd_hms(now())