Operaciones esenciales de limpieza de datos en R: dplyr, tidyr y lubridate

Este documento consolida las operaciones fundamentales de limpieza de datos, orgenizadas en tres paquetes principales.

  1. 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()
  1. 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()
  1. 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())

Etiquetas: dplyr tidyr lubridate R lenguaje_R

Publicado el 7-14 18:45