Analítica de Personas · Semestre otoño 2026 · Semana 1 · Prof. René Gempp
|>?El pipe toma el resultado de lo que está a la izquierda y lo pasa como primer argumento de la función de la derecha. Es como decir "y luego...":
# Sin pipe: se lee de adentro hacia afuera (confuso)
summarise(group_by(filter(datos, departamento == "Ventas"), cargo), n = n())
# Con pipe: se lee de arriba hacia abajo (claro)
datos |>
filter(departamento == "Ventas") |>
group_by(cargo) |>
summarise(n = n())
Ambas expresiones hacen exactamente lo mismo. El pipe simplemente cambia el orden de lectura.
|> es nativo de R (desde la versión 4.1, 2021). No necesita ningún paquete. Existe otro pipe, %>%, que viene del paquete magrittr y se carga con tidyverse. Para este curso usaremos |> porque es el estándar actual, pero ambos funcionan igual en la práctica.
datos |> # "Toma los datos..."
filter(edad > 30) |> # "...filtra los mayores de 30..."
group_by(departamento) |> # "...agrupa por departamento..."
summarise(n = n()) # "...y cuenta cuántos hay en cada uno."
En RStudio: Ctrl + Shift + M (Windows/Linux) o Cmd + Shift + M (Mac) inserta el pipe automáticamente.
| Función | ¿Qué hace? | Ejemplo |
|---|---|---|
glimpse(datos) | Vista rápida: muestra cada variable, su tipo y primeros valores | glimpse(innovaco) |
summary(datos) | Resumen estadístico: min, max, media, mediana, cuartiles | summary(innovaco) |
head(datos, n) | Muestra las primeras n filas (por defecto 6) | head(innovaco, 10) |
nrow(datos) | Número de filas (empleados) | nrow(innovaco) |
ncol(datos) | Número de columnas (variables) | ncol(innovaco) |
names(datos) | Nombres de todas las columnas | names(innovaco) |
dim(datos) | Filas y columnas juntos | dim(innovaco) |
glimpse() es la primera función que deberías ejecutar al cargar datos nuevos: te dice cuántas filas/columnas hay y el tipo de cada variable (chr = texto, dbl = número, date = fecha). summary() es el segundo paso: te da la distribución de cada variable numérica.
Estas son las funciones "verbos" de dplyr. Cada una hace una sola cosa y se combinan con el pipe:
count() — Contar por categoría# ¿Cuántos empleados hay por departamento?
innovaco |> count(departamento)
# Ordenar de mayor a menor
innovaco |> count(departamento, sort = TRUE)
# Contar por dos variables a la vez
innovaco |> count(departamento, genero)
| Argumento | Qué hace | Default |
|---|---|---|
... | Variable(s) por las que contar | — |
sort = TRUE | Ordena de mayor a menor | FALSE |
name = "total" | Cambia el nombre de la columna de conteo | "n" |
filter() — Seleccionar filas que cumplen una condición# Solo empleados de Soporte Técnico
innovaco |> filter(departamento == "Soporte Técnico")
# Empleados mayores de 40 Y que se fueron
innovaco |> filter(edad > 40, rotacion == "Sí")
# Empleados de Ventas O Marketing
innovaco |> filter(departamento %in% c("Ventas", "Marketing"))
| Operador | Significado | Ejemplo |
|---|---|---|
== | Igual a | genero == "Mujer" |
!= | Distinto de | rotacion != "No" |
>, >=, <, <= | Mayor, mayor o igual, menor, menor o igual | edad >= 30 |
& o , | Y (ambas condiciones) | edad > 30, genero == "Mujer" |
| | O (cualquiera de las dos) | depto == "Ventas" | depto == "RRHH" |
%in% | Está en una lista | depto %in% c("Ventas", "RRHH") |
= vs ==
= es para asignar valores. == es para comparar. Si escribes filter(genero = "Mujer") dará error. Lo correcto es filter(genero == "Mujer").
group_by() + summarise() — Agrupar y resumirEstas dos funciones se usan casi siempre juntas. group_by() define los grupos, summarise() calcula un resumen para cada grupo:
# Edad promedio por departamento
innovaco |>
group_by(departamento) |>
summarise(
n_empleados = n(),
edad_promedio = mean(edad),
edad_mediana = median(edad),
ingreso_min = min(ingreso_mensual),
ingreso_max = max(ingreso_mensual)
)
Funciones de resumen que puedes usar dentro de summarise():
| Función | Qué calcula | Ejemplo |
|---|---|---|
n() | Número de filas en el grupo | n_empleados = n() |
mean(x) | Promedio | edad_prom = mean(edad) |
median(x) | Mediana | edad_med = median(edad) |
sd(x) | Desviación estándar | edad_sd = sd(edad) |
min(x), max(x) | Mínimo y máximo | min_ing = min(ingreso_mensual) |
sum(x) | Suma | total = sum(horas_capacitacion) |
sum(condición) | Contar los TRUE | n_salidas = sum(rotacion == "Sí") |
mean(condición) | Proporción de TRUE | tasa_rot = mean(rotacion == "Sí") |
mean(condición) para calcular tasas
En R, TRUE vale 1 y FALSE vale 0. Entonces mean(rotacion == "Sí") calcula la proporción de empleados que se fueron. Multiplica por 100 para obtener el porcentaje.
select() — Elegir columnas# Solo estas 3 columnas
innovaco |> select(nombre, departamento, edad)
# Todo EXCEPTO nombre
innovaco |> select(-nombre)
# Columnas que empiezan con "satisf"
innovaco |> select(starts_with("satisf"))
mutate() — Crear o modificar columnas# Crear una nueva columna
innovaco |>
mutate(
ingreso_anual = ingreso_mensual * 12,
es_joven = edad < 30
)
No la usaremos mucho en la Semana 1, pero aparecerá frecuentemente desde la Semana 2.
arrange() — Ordenar filas# Ordenar por edad (ascendente)
innovaco |> arrange(edad)
# Ordenar por ingreso (descendente)
innovaco |> arrange(desc(ingreso_mensual))
Aquí va un ejemplo que combina varias funciones en un solo pipeline. Léelo de arriba hacia abajo:
# "Quiero saber la tasa de rotación por departamento,
# ordenada de peor a mejor"
innovaco |> # Tomo los datos
group_by(departamento) |> # Agrupo por departamento
summarise( # Calculo para cada grupo:
n_empleados = n(), # cuántos son
n_salidas = sum(rotacion == "Sí"), # cuántos se fueron
tasa_rotacion = mean(rotacion == "Sí") # qué proporción se fue
) |>
arrange(desc(tasa_rotacion)) # Ordeno de mayor a menor tasa
read_csv()# Cargar un CSV (del paquete readr, incluido en tidyverse)
innovaco <- read_csv("innovaco_empleados.csv")
# Opciones útiles:
datos <- read_csv("archivo.csv",
show_col_types = FALSE, # Silencia el mensaje de tipos de columna
locale = locale(encoding = "latin1") # Si hay problemas con ñ/tildes
)
read_csv() y no read.csv()?
read_csv() (con guión bajo, del paquete readr/tidyverse) es más rápida, adivina mejor los tipos de datos, y produce tibbles en vez de data.frames. Siempre prefiere read_csv() en este curso.
# Redondear a 1 decimal
round(mean(innovaco$edad), 1) # 34.4
# Dentro de summarise
innovaco |>
summarise(
edad_promedio = round(mean(edad), 1),
tasa_rotacion = scales::percent(mean(rotacion == "Sí"), accuracy = 0.1)
)
| Función | Qué hace | Ejemplo |
|---|---|---|
round(x, 1) | Redondea a 1 decimal | round(3.456, 1) → 3.5 |
scales::percent(x) | Formatea como porcentaje | scales::percent(0.27) → "27%" |
scales::comma(x) | Formatea con separador de miles | scales::comma(1500000) → "1,500,000" |