Apunte 1 — El pipe y las funciones de dplyr

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

1. ¿Qué es el pipe |>?

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.

¿De dónde viene? El pipe |> 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.

Cómo leerlo en voz alta

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."

Atajo de teclado

En RStudio: Ctrl + Shift + M (Windows/Linux) o Cmd + Shift + M (Mac) inserta el pipe automáticamente.

2. Funciones para explorar datos

Función¿Qué hace?Ejemplo
glimpse(datos)Vista rápida: muestra cada variable, su tipo y primeros valoresglimpse(innovaco)
summary(datos)Resumen estadístico: min, max, media, mediana, cuartilessummary(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 columnasnames(innovaco)
dim(datos)Filas y columnas juntosdim(innovaco)
¿Cuándo uso cada una? 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.

3. Funciones de dplyr para transformar datos

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)
ArgumentoQué haceDefault
...Variable(s) por las que contar
sort = TRUEOrdena de mayor a menorFALSE
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"))
OperadorSignificadoEjemplo
==Igual agenero == "Mujer"
!=Distinto derotacion != "No"
>, >=, <, <=Mayor, mayor o igual, menor, menor o igualedad >= 30
& o ,Y (ambas condiciones)edad > 30, genero == "Mujer"
|O (cualquiera de las dos)depto == "Ventas" | depto == "RRHH"
%in%Está en una listadepto %in% c("Ventas", "RRHH")
Error frecuente: = 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 resumir

Estas 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ónQué calculaEjemplo
n()Número de filas en el grupon_empleados = n()
mean(x)Promedioedad_prom = mean(edad)
median(x)Medianaedad_med = median(edad)
sd(x)Desviación estándaredad_sd = sd(edad)
min(x), max(x)Mínimo y máximomin_ing = min(ingreso_mensual)
sum(x)Sumatotal = sum(horas_capacitacion)
sum(condición)Contar los TRUEn_salidas = sum(rotacion == "Sí")
mean(condición)Proporción de TRUEtasa_rot = mean(rotacion == "Sí")
Truco: 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))

4. Patrón completo: combinando todo

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

5. Cargando datos con 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
)
¿Por qué 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.

6. Redondear y formatear resultados

# 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ónQué haceEjemplo
round(x, 1)Redondea a 1 decimalround(3.456, 1)3.5
scales::percent(x)Formatea como porcentajescales::percent(0.27)"27%"
scales::comma(x)Formatea con separador de milesscales::comma(1500000)"1,500,000"