{tidyverse} - Parte IIMódulo 4 - mutate(), summarise() y group_by()
2026-03-10
✅ La EPH: qué mide, cómo se estructura, cuestionarios
✅ Conceptos básicos de R: valores, vectores, funciones, objetos
✅ Tidyverse: paquetes, importación, la pipa (|>)
✅ select() y filter(): elegir columnas y filtrar filas
🔧 mutate() - crear y editar variables
🔧 case_when() - recodificar categorías
🔧 summarise() - resumir información
🔧 group_by() - operar por grupos
| Variable | Significado | Valores |
|---|---|---|
CH04 |
Sexo | 1=Varón, 2=Mujer |
CH06 |
Edad | Años cumplidos |
ESTADO |
Condición de actividad | 1=Ocupado, 2=Desocupado, 3=Inactivo |
NIVEL_ED |
Nivel educativo | 1 a 7 |
P21 |
Ingreso ocupación principal | En pesos |
REGION |
Región estadística | 1=GBA, 40=NOA, 41=NEA, 42=Cuyo, 43=Pampeana, 44=Patagonia |
mutate(){dplyr}| Función | Acción |
|---|---|
select() |
selecciona o descarta columnas |
filter() |
selecciona filas |
mutate() |
crea / edita variables |
group_by() |
segmenta en función de una variable |
summarise() |
genera una tabla de resumen |
La clase pasada cubrimos
select()yfilter(). Hoy completamos el kit de herramientas.
mutate() - Crear o editar variables
mutate()agrega una columna nueva (o modifica una existente) al data frame.
# A tibble: 46,050 × 4
CH04 CH06 ESTADO fuente
<dbl> <dbl> <dbl> <chr>
1 2 86 3 EPH - T1 2024
2 1 68 1 EPH - T1 2024
3 1 20 2 EPH - T1 2024
4 2 75 3 EPH - T1 2024
5 2 41 1 EPH - T1 2024
6 1 42 1 EPH - T1 2024
7 2 20 3 EPH - T1 2024
8 1 14 3 EPH - T1 2024
9 1 29 1 EPH - T1 2024
10 2 27 2 EPH - T1 2024
# ℹ 46,040 more rows
mutate() + case_when() = RecodificaciónMuchas veces necesitamos transformar códigos numéricos en etiquetas legibles.
La variable ESTADO tiene valores 1, 2, 3 y 4… ¿qué significa cada uno?
# A tibble: 46,050 × 4
CH04 CH06 ESTADO actividad
<dbl> <dbl> <dbl> <chr>
1 2 86 3 Inactivo
2 1 68 1 Ocupado
3 1 20 2 Desocupado
4 2 75 3 Inactivo
5 2 41 1 Ocupado
6 1 42 1 Ocupado
7 2 20 3 Inactivo
8 1 14 3 Inactivo
9 1 29 1 Ocupado
10 2 27 2 Desocupado
# ℹ 46,040 more rows
eph_ind |>
select(CH04, CH06) |>
mutate(grupo_edad = case_when(
CH06 < 18 ~ "Menor de 18",
CH06 >= 18 & CH06 < 65 ~ "18 a 64",
CH06 >= 65 ~ "65 y más"
))# A tibble: 46,050 × 3
CH04 CH06 grupo_edad
<dbl> <dbl> <chr>
1 2 86 65 y más
2 1 68 65 y más
3 1 20 18 a 64
4 2 75 65 y más
5 2 41 18 a 64
6 1 42 18 a 64
7 2 20 18 a 64
8 1 14 Menor de 18
9 1 29 18 a 64
10 2 27 18 a 64
# ℹ 46,040 more rows
case_when() con .default.default asigna un valor a todo lo que no matcheó con las condiciones anteriores:eph_ind |>
select(CH04, CH06, ESTADO) |>
mutate(es_ocupado = case_when(
ESTADO == 1 ~ "Ocupado",
.default = "No ocupado"
))# A tibble: 46,050 × 4
CH04 CH06 ESTADO es_ocupado
<dbl> <dbl> <dbl> <chr>
1 2 86 3 No ocupado
2 1 68 1 Ocupado
3 1 20 2 No ocupado
4 2 75 3 No ocupado
5 2 41 1 Ocupado
6 1 42 1 Ocupado
7 2 20 3 No ocupado
8 1 14 3 No ocupado
9 1 29 1 Ocupado
10 2 27 2 No ocupado
# ℹ 46,040 more rows
case_when()eph_ind |>
select(CH04, CH06, ESTADO) |>
mutate(sexo = case_when(
CH04 == 1 ~ "Varón",
CH04 == 2 ~ "Mujer"
))# A tibble: 46,050 × 4
CH04 CH06 ESTADO sexo
<dbl> <dbl> <dbl> <chr>
1 2 86 3 Mujer
2 1 68 1 Varón
3 1 20 2 Varón
4 2 75 3 Mujer
5 2 41 1 Mujer
6 1 42 1 Varón
7 2 20 3 Mujer
8 1 14 3 Varón
9 1 29 1 Varón
10 2 27 2 Mujer
# ℹ 46,040 more rows
mutate() + case_when()CH04, CH06, NIVEL_ED y ESTADO. Crear una variable llamada sexo que recodifique CH04 (1 = “Varón”, 2 = “Mujer”).grupo_actividad que agrupe ESTADO en dos categorías: “Activo” (1 y 2) y “No activo” (3 y 4). Tip: recordar el operador %in%.mayor_de_edad que valga "Sí" cuando CH06 >= 18 y "No" en caso contrario.summarise()summarise() - Resumir informaciónsummarise() colapsa todas las filas en una sola fila con el resumen pedido.summarise() - EstructuraFunciones comunes para resumir:
| Función | Acción |
|---|---|
mean() |
Promedio |
sum() |
Suma total |
min() / max() |
Mínimo / Máximo |
n() |
Cantidad de filas |
Pasamos de 46.050 filas a una sola fila con el resultado.
eph_ind |>
summarise(edad_promedio = mean(CH06),
edad_minima = min(CH06),
edad_maxima = max(CH06),
total_personas = n())# A tibble: 1 × 4
edad_promedio edad_minima edad_maxima total_personas
<dbl> <dbl> <dbl> <int>
1 36.3 -1 101 46050
n()es especial: no recibe argumentos, simplemente cuenta las filas.
Combinamos
filter()+summarise()con la pipa. Cada paso se encadena.
group_by()group_by() - Operar por grupossummarise() nos da un resumen general. Pero muchas veces queremos comparar entre grupos.group_by() divide el data frame en grupos antes de resumir.eph_ind |>
filter(ESTADO == 1, P21 > 0) |>
group_by(CH04) |>
summarise(ingreso_promedio = mean(P21),
cantidad = n())# A tibble: 2 × 3
CH04 ingreso_promedio cantidad
<dbl> <dbl> <int>
1 1 344550. 8976
2 2 258920. 7537
Recordar:
CH04= 1 (Varón), 2 (Mujer). Podemos mejorar esto conmutate()+case_when().
eph_ind |>
filter(ESTADO == 1, P21 > 0) |>
mutate(sexo = case_when(CH04 == 1 ~ "Varón",
CH04 == 2 ~ "Mujer")) |>
group_by(sexo, REGION) |>
summarise(ingreso_promedio = mean(P21),
cantidad = n())# A tibble: 12 × 4
# Groups: sexo [2]
sexo REGION ingreso_promedio cantidad
<chr> <dbl> <dbl> <int>
1 Mujer 1 321779. 1043
2 Mujer 40 202567. 1809
3 Mujer 41 188494. 793
4 Mujer 42 242039. 775
5 Mujer 43 268307. 2179
6 Mujer 44 349388. 938
7 Varón 1 446867. 1149
8 Varón 40 253146. 2141
9 Varón 41 240207. 984
10 Varón 42 323336. 981
11 Varón 43 358655. 2598
12 Varón 44 491457. 1123
.byDesde dplyr 1.1.0, existe una forma más directa: el argumento .by dentro de summarise().
Ambas hacen lo mismo.
.byes más conciso y no requiere un paso extra. Van a encontrar ambas formas en la práctica.
.by con múltiples variableseph_ind |>
filter(ESTADO == 1, P21 > 0) |>
mutate(sexo = case_when(CH04 == 1 ~ "Varón",
CH04 == 2 ~ "Mujer")) |>
summarise(ingreso_promedio = mean(P21),
cantidad = n(),
.by = c(sexo, REGION))# A tibble: 12 × 4
sexo REGION ingreso_promedio cantidad
<chr> <dbl> <dbl> <int>
1 Varón 43 358655. 2598
2 Mujer 40 202567. 1809
3 Varón 40 253146. 2141
4 Mujer 44 349388. 938
5 Mujer 1 321779. 1043
6 Mujer 42 242039. 775
7 Varón 42 323336. 981
8 Varón 41 240207. 984
9 Mujer 43 268307. 2179
10 Varón 1 446867. 1149
11 Mujer 41 188494. 793
12 Varón 44 491457. 1123
summarise() + group_by()ESTADO). Tip: summarise(n = n(), .by = ESTADO).ESTADO == 1) con ingreso positivo (P21 > 0). Calcular el ingreso promedio por región (REGION).CH04 a sexo (“Varón”/“Mujer”) y calcular el ingreso promedio por sexo y región.tidyverse en acciónPregunta: ¿Cuál es el ingreso promedio de la población ocupada por sexo y grupo de edad?
Combinamos todo lo aprendido en un solo pipeline:
eph_ind |>
filter(ESTADO == 1, P21 > 0) |>
select(CH04, CH06, P21) |>
mutate(
sexo = case_when(
CH04 == 1 ~ "Varón",
CH04 == 2 ~ "Mujer"),
grupo_edad = case_when(
CH06 < 30 ~ "Joven",
CH06 >= 30 & CH06 < 50 ~ "Adulto",
CH06 >= 50 ~ "Mayor")
) |>
summarise(
ingreso_promedio = mean(P21),
personas = n(),
.by = c(sexo, grupo_edad)
)# A tibble: 6 × 4
sexo grupo_edad ingreso_promedio personas
<chr> <chr> <dbl> <int>
1 Varón Mayor 381930. 2363
2 Mujer Adulto 272637. 4028
3 Varón Adulto 366886. 4532
4 Varón Joven 253464. 2081
5 Mujer Mayor 275972. 1956
6 Mujer Joven 201865. 1553
✅ mutate() + case_when() — crear variables y recodificar
✅ summarise() — resumir datos (promedios, conteos, etc.)
✅ group_by() / .by — operar por grupos
✅ Combinar todo en un pipeline completo con la EPH
📁 Cómo organizar un proyecto de R profesionalmente
📊 ggplot2: visualización de datos
🎯 TP integrador: aplicando todo lo aprendido
🏁 Último encuentro del curso