Analítica de Personas · Semestre otoño 2026 · Semana 2 · Prof. René Gempp
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)
read_csv() o read_excel(). Las funciones de limpieza de janitor son el primer paso antes de analizar.
clean_names() — Limpiar nombres de columnasLa 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()
clean_names()Nombre Empleado
Depto.
Ingreso Mensual (CLP)
Eval. 2024
% Cumplimiento
Fecha de Ingreso
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.
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.
tabyl() — Tablas cruzadas rápidasLa 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.
# 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: 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
adorn_*() — Decorar tablas de tabylLas 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)
adorn_*()| Función | Qué hace | Argumentos 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 porcentaje | digits = 1 (decimales), affix_sign = TRUE (agrega %) |
adorn_ns() | Agrega el N original entre paréntesis | position = "front" o "rear" |
adorn_title() | Agrega título a la tabla | "combined" o "top" |
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%.
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?"
remove_empty() — Eliminar filas y columnas vacíasCuando 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"))
datos <- read_csv("archivo.csv") |>
clean_names() |> # Nombres consistentes
remove_empty(c("rows", "cols")) # Sin filas/columnas vacías
get_dupes() — Encontrar duplicadosIdentifica 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.
left_join() y la tabla resultante tiene más filas de las esperadas, usa get_dupes(id_empleado) para encontrar los registros problemáticos.
remove_constant() — Eliminar columnas constantesSi 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
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
| Función | ¿Qué hace? | ¿Cuándo usarla? |
|---|---|---|
clean_names() | Limpia nombres de columnas | Siempre, al cargar datos |
tabyl() | Tablas de frecuencia y cruzadas | Para explorar variables categóricas |
adorn_totals() | Agrega fila/columna de totales | Después de tabyl() |
adorn_percentages() | Convierte a proporciones | Después de tabyl() |
adorn_pct_formatting() | Formatea como porcentaje | Después de adorn_percentages() |
adorn_ns() | Agrega N entre paréntesis | Después de adorn_pct_formatting() |
remove_empty() | Elimina filas/columnas vacías | Al cargar datos de Excel |
get_dupes() | Encuentra duplicados | Para verificar calidad de datos |
remove_constant() | Elimina columnas con un solo valor | Al limpiar datos inicialmente |