Apunte 6 — Limpiar datos con janitor

Analítica de Personas · Semestre otoño 2026 · Semana 2 · Prof. René Gempp

1. ¿Qué es janitor y por qué lo necesitas?

El paquete janitor es un conjunto de funciones para limpiar y explorar datos "sucios" — el tipo de datos que encuentras en la vida real: columnas con nombres raros, filas vacías, formatos inconsistentes. En people analytics, los datos del HRIS, las planillas Excel de los jefes de área y las encuestas suelen llegar con estos problemas.

# Instalar (una sola vez)
install.packages("janitor")

# Cargar
library(janitor)
¿Cuándo usar janitor? Inmediatamente después de cargar datos con read_csv() o read_excel(). Las funciones de limpieza de janitor son el primer paso antes de analizar.

2. clean_names() — Limpiar nombres de columnas

La función más usada de janitor. Convierte nombres de columnas a un formato consistente: minúsculas, sin espacios, sin caracteres especiales.

# Datos reales a menudo vienen con nombres así:
# "Nombre Empleado", "Depto.", "Ingreso Mensual (CLP)", "Eval. 2024"

datos <- read_csv("archivo_sucio.csv") |>
  clean_names()

Antes de clean_names()

Nombre Empleado
Depto.
Ingreso Mensual (CLP)
Eval. 2024
% Cumplimiento
Fecha de Ingreso

Después de clean_names()

nombre_empleado
depto
ingreso_mensual_clp
eval_2024
percent_cumplimiento
fecha_de_ingreso

clean_names() hace todo esto automáticamente: convierte a minúsculas, reemplaza espacios por guiones bajos, elimina puntos y paréntesis, convierte % a percent, y maneja caracteres especiales.

Hazlo siempre, incluso si los nombres se ven "bien" Ejecutar clean_names() al cargar datos es un buen hábito. No rompe nada si los nombres ya están limpios, y te protege contra problemas invisibles como espacios al final de los nombres o caracteres Unicode ocultos.

3. tabyl() — Tablas cruzadas rápidas

La estrella de janitor para people analytics. tabyl() crea tablas de frecuencia y tablas cruzadas con una sintaxis mínima, mucho más legible que table() de base R.

Tabla de una variable

# Distribución de departamentos
datos |>
  tabyl(departamento)
 departamento             n   percent
 Desarrollo de Software 417 0.3475000
 Finanzas               120 0.1000000
 Marketing               78 0.0650000
 Recursos Humanos       133 0.1108333
 Soporte Técnico        195 0.1625000
 Ventas                 257 0.2141667

Automáticamente incluye la columna n (conteo) y percent (proporción). No necesitas group_by() ni summarise().

Tabla cruzada de dos variables

# Tabla cruzada: departamento × tipo de salida
datos |>
  filter(rotacion == "Sí") |>
  tabyl(departamento, tipo_salida)
 departamento            Involuntaria Voluntaria
 Desarrollo de Software           20         73
 Finanzas                          6         23
 Marketing                         4         16
 Recursos Humanos                 11         31
 Soporte Técnico                  13         55
 Ventas                           13         61

4. adorn_*() — Decorar tablas de tabyl

Las funciones adorn_*() agregan porcentajes, totales y formato a las tablas de tabyl(). Se encadenan con el pipe:

datos |>
  filter(rotacion == "Sí") |>
  tabyl(departamento, tipo_salida) |>
  adorn_totals(c("row", "col")) |>     # Agrega fila y columna de totales
  adorn_percentages("row") |>            # Convierte a porcentaje por fila
  adorn_pct_formatting(digits = 1) |>    # Formatea con 1 decimal y símbolo %
  adorn_ns()                              # Agrega el N original entre paréntesis
 departamento            Involuntaria    Voluntaria         Total
 Desarrollo de Software  21.5%  (20)  78.5%  (73)  100.0%  (93)
 Finanzas                20.7%   (6)  79.3%  (23)  100.0%  (29)
 Marketing               20.0%   (4)  80.0%  (16)  100.0%  (20)
 Recursos Humanos        26.2%  (11)  73.8%  (31)  100.0%  (42)
 Soporte Técnico         19.1%  (13)  80.9%  (55)  100.0%  (68)
 Ventas                  17.6%  (13)  82.4%  (61)  100.0%  (74)
 Total                   20.6%  (67)  79.4% (259)  100.0% (326)

Referencia rápida de funciones adorn_*()

FunciónQué haceArgumentos comunes
adorn_totals()Agrega fila y/o columna de totales"row", "col", o c("row", "col")
adorn_percentages()Convierte conteos a proporciones"row" (por fila), "col" (por columna), "all" (del total)
adorn_pct_formatting()Formatea proporciones como porcentajedigits = 1 (decimales), affix_sign = TRUE (agrega %)
adorn_ns()Agrega el N original entre paréntesisposition = "front" o "rear"
adorn_title()Agrega título a la tabla"combined" o "top"
El orden importa Las funciones adorn_*() se aplican en secuencia. Un orden típico es: (1) adorn_totals() → (2) adorn_percentages() → (3) adorn_pct_formatting() → (4) adorn_ns(). Si calculas porcentajes antes de agregar totales, el total no será 100%.

Porcentajes por columna vs. por fila

adorn_percentages("row")

Cada fila suma 100%. Responde: "De los que se fueron de Ventas, ¿qué proporción fue voluntaria vs. involuntaria?"

adorn_percentages("col")

Cada columna suma 100%. Responde: "De todas las salidas voluntarias, ¿qué proporción viene de cada departamento?"

5. remove_empty() — Eliminar filas y columnas vacías

Cuando cargas una planilla Excel, es común que traiga filas o columnas completamente vacías. remove_empty() las elimina:

# Eliminar filas vacías
datos |> remove_empty("rows")

# Eliminar columnas vacías
datos |> remove_empty("cols")

# Ambas a la vez
datos |> remove_empty(c("rows", "cols"))
Pipeline de limpieza recomendado Cuando cargas datos de una fuente "sucia" (Excel, HRIS exportado, etc.), usa este pipeline estándar:
datos <- read_csv("archivo.csv") |>
  clean_names() |>                # Nombres consistentes
  remove_empty(c("rows", "cols"))  # Sin filas/columnas vacías

6. get_dupes() — Encontrar duplicados

Identifica filas duplicadas en una o más columnas. Esencial para verificar la calidad de datos del HRIS:

# ¿Hay IDs duplicados? (debería dar 0 filas)
datos |>
  get_dupes(id_empleado)

# ¿Hay combinaciones duplicadas de nombre + fecha de ingreso?
datos |>
  get_dupes(nombre, fecha_ingreso)

# Sin argumentos: busca filas completamente idénticas
datos |>
  get_dupes()

El resultado incluye una columna dupe_count que indica cuántas veces aparece cada valor duplicado. Si get_dupes() devuelve 0 filas, no hay duplicados.

Siempre verifica duplicados después de un join Si haces un left_join() y la tabla resultante tiene más filas de las esperadas, usa get_dupes(id_empleado) para encontrar los registros problemáticos.

7. remove_constant() — Eliminar columnas constantes

Si una columna tiene el mismo valor en todas las filas (por ejemplo, pais = "Chile" para todos), no aporta información al análisis. remove_constant() la elimina automáticamente:

datos |>
  remove_constant()
# Elimina cualquier columna donde todos los valores son iguales

8. Patrón completo: de datos sucios a tabla limpia

Aquí va un ejemplo real de pipeline de limpieza para datos típicos de RRHH:

# Supón que recibes un Excel del HRIS con problemas típicos

datos_limpios <- readxl::read_excel("reporte_hris.xlsx") |>
  clean_names() |>                        # 1. Nombres consistentes
  remove_empty(c("rows", "cols")) |>      # 2. Sin filas/columnas vacías
  remove_constant() |>                    # 3. Sin columnas constantes
  mutate(
    departamento = str_trim(departamento), # 4. Quitar espacios sobrantes
    genero = str_to_title(genero)          # 5. Capitalización consistente
  )

# Verificar calidad
datos_limpios |> get_dupes(id_empleado)  # 6. ¿Duplicados?
datos_limpios |> glimpse()               # 7. Revisión visual

9. Resumen: funciones de janitor

Función¿Qué hace?¿Cuándo usarla?
clean_names()Limpia nombres de columnasSiempre, al cargar datos
tabyl()Tablas de frecuencia y cruzadasPara explorar variables categóricas
adorn_totals()Agrega fila/columna de totalesDespués de tabyl()
adorn_percentages()Convierte a proporcionesDespués de tabyl()
adorn_pct_formatting()Formatea como porcentajeDespués de adorn_percentages()
adorn_ns()Agrega N entre paréntesisDespués de adorn_pct_formatting()
remove_empty()Elimina filas/columnas vacíasAl cargar datos de Excel
get_dupes()Encuentra duplicadosPara verificar calidad de datos
remove_constant()Elimina columnas con un solo valorAl limpiar datos inicialmente