# Clase 2

#### Germán Rosati y Laia Domenech Burin

#### 30 marzo, 2026

## El mundo tidyverse

- La clase pasada cerramos la parte práctica instalando el paquete Tidyverse. Sin embargo, al hacerlo no estaban instalando solo un paquete, sino una colección de paquetes de R que están diseñados para el análisis de datos.

- La lógica de tener estos paquetes juntos es que todos ellos comparten la misma filosofía, gramática, y estructuras de datos.

- Los principales paquetes que están en este mundo son

  - `magrittr`: que introduce la pipe (%>%)
  - `dplyr`: orientado a la maniplulación de bases de datos
  - `tidyr`: para la limpieza de datos
  - `readr`: para la lectura de bases de datos
  - `purr`: provee herramientas para trabajar con funciones sobre vectores
  - `stringr`: orientado a facilitar el trabajo con datos de texto
  - `forcats`: orientado a facilitar el trabajo con factores

### ¿Por qué tidyverse?

- Está diseñado para ser leído y usado de manera simple por seres humanos. La gramática es intuitiva y la mayoría de sus funcionalidades son fáciles de usar.
- Sus funciones no están pensadas para una tarea específica, sino para todo un flujo de trabajo: desde la importación de datos hasta la comunicación de resultados.
- Su comunidad está basada en los principios de código abierto y colaborativo. Los mismos diseñadores de los paquetes tienen muchísimas fuentes para aprender a usarlos, y disponen del código abierto de cada paquete en GitHub.

Para empezar a trabajar con el paquete, tenemos que introducirlo en la sesión con la función `library()`:

    library(tidyverse)
    library(readr)
    library(eph)

## Pipes: la gramática básica de tidyverse

Más arriba mencionamos que el paquete `magrittr` introduce la pipe y la señalamos como este símbolo `%>%`. La pipe es una forma de escribir del mundo tidyverse, que indica que vamos a realizar de terminada operación sobre el objeto que está a la izquierda. Sirve para indicar una secuencia de acciones.

Para desarrollar los ejemplos de esta clase, vamos a trabajar con datos de la Encuesta Permanente de Hogares. Para ello, usaremos el paquete `eph`. Por ahora, lo único que vamos a usar de él es la función `get_microdata()`, que nos devuelve la base de microdatos de individuos o hogares para el trimestre seleccionado:

    df <- get_microdata(year=2023, trimester=3, type='individual')

    df <- organize_labels(df=df, type='individual') # Vamos a etiquetar la base

    df$NRO_HOGAR <- as.character(df$NRO_HOGAR)

    table(df$CAT_OCUP)

    ##
    ##                                    0                               Patron
    ##                                25844                                  766
    ##                        Cuenta propia                    Obrero o empleado
    ##                                 4673                                16968
    ## Trabajador familiar sin remuneracion                             Ns./Nr..
    ##                                   82                                    2

#### Ejercicio rápido

¿Qué les parece que hace esta línea? `df$NRO_HOGAR <- as.character(df$NRO_HOGAR)`

Ahora, con una pipe…

    df$CAT_OCUP %>%
            table()

    ## .
    ##                                    0                               Patron
    ##                                25844                                  766
    ##                        Cuenta propia                    Obrero o empleado
    ##                                 4673                                16968
    ## Trabajador familiar sin remuneracion                             Ns./Nr..
    ##                                   82                                    2

Las funciones pueden concatenarse, y esta es la principal gracia del uso de las pipes.

    df$CAT_OCUP%>%
            table()%>%
            prop.table()%>%
            round(., 2)

    ## .
    ##                                    0                               Patron
    ##                                 0.53                                 0.02
    ##                        Cuenta propia                    Obrero o empleado
    ##                                 0.10                                 0.35
    ## Trabajador familiar sin remuneracion                             Ns./Nr..
    ##                                 0.00                                 0.00

### Ejercicio rápido ***

¿Cómo obtendrían la tabla anterior sin usar `%>%`? O sea en R-base…

    ###

## dplyr

Vimos que este paquete de tidyverse está orientado al manejo de bases de datos. Tiene 5 funciones básicas que resuelven el 90% de nuestros problemas a la hora de limpiar y procesas bases:

1. `select()`: que selecciona y descarta variables
2. `filter()`: selecciona y descarta según filas
3. `arrange()`: reordena las filas
4. `mutate()`: crea o edita variables
5. `rename()`: renombra variables
6. `summarise()`: colapsa los valores a un solo resumen

Todas pueden ser usadas en conjunto con `group_by()` que cambia el objeto de cada función: en lugar de operar sobre todo el dataset, lo hace al interior de cada grupo definido.

### `select()`

- Esta función únicamente requiere poner el nombre de las columnas que elegimos. +Para seleccionar un intervalo de columnas, uso el `:`

    select_prueba_1 <- df %>% select(CODUSU, CH03:CH09)

    head(select_prueba_1)

    ## # A tibble: 6 × 8
    ##   CODUSU                        CH03       CH04    CH05  CH06  CH07  CH08  CH09
    ##   <labelled>                    <labelled> <label> <lab> <lab> <lab> <lab> <lab>
    ## 1 TQRMNOPSSHJOKSCDEFOCD00804371 3          2       02/1… 10    5     1     1
    ## 2 TQSMNORWTHJMKTCDEFOCD00804372 1          1       01/0… 51    2     1     1
    ## 3 TQSMNORWTHJMKTCDEFOCD00804372 3          2       20/0… 17    5     1     1
    ## 4 TQSMNORWTHJMKTCDEFOCD00804372 2          2       01/0… 51    2     1     1
    ## 5 TQRMNOSQQHMMKUCDEIMBF00813017 1          2       24/0… 31    1     4     1
    ## 6 TQRMNOSQQHMMKUCDEIMBF00813017 2          1       16/0… 29    1     4     1

- Podemos hacer una selección por posición de la columna:

    select_prueba_2 <- df %>% select(3:6)

    head(select_prueba_2)

    ## # A tibble: 6 × 4
    ##   TRIMESTRE  NRO_HOGAR COMPONENTE H15
    ##   <labelled> <chr>     <labelled> <labelled>
    ## 1 3          1         5          1
    ## 2 3          1         1          1
    ## 3 3          1         3          1
    ## 4 3          1         2          1
    ## 5 3          1         1          1
    ## 6 3          1         2          1

- Se puede hacer una anti-selección (o sea, elegir todas las columnas menos algunas especificadas)

    select_prueba_3 <- df %>% select(-c(ANO4:TRIMESTRE))

    head(select_prueba_3)

    ## # A tibble: 6 × 175
    ##   CODUSU      NRO_HOGAR COMPONENTE H15   REGION MAS_500 AGLOMERADO PONDERA CH03
    ##   <labelled>  <chr>     <labelled> <lab> <labe> <label> <labelled> <label> <lab>
    ## 1 TQRMNOPSSH… 1         5          1     41     N        8         341     3
    ## 2 TQSMNORWTH… 1         1          1     41     N        8         339     1
    ## 3 TQSMNORWTH… 1         3          1     41     N        8         339     3
    ## 4 TQSMNORWTH… 1         2          1     41     N        8         339     2
    ## 5 TQRMNOSQQH… 1         1          1     43     N       36         143     1
    ## 6 TQRMNOSQQH… 1         2          1     43     N       36         143     2
    ## # ℹ 166 more variables: CH04 <labelled>, CH05 <labelled>, CH06 <labelled>,
    ## #   CH07 <labelled>, CH08 <labelled>, CH09 <labelled>, CH10 <labelled>,
    ## #   CH11 <labelled>, CH12 <labelled>, CH13 <labelled>, CH14 <labelled>,
    ## #   CH15 <labelled>, CH15_COD <labelled>, CH16 <labelled>, CH16_COD <labelled>,
    ## #   NIVEL_ED <labelled>, ESTADO <labelled>, CAT_OCUP <labelled>,
    ## #   CAT_INAC <labelled>, IMPUTA <labelled>, PP02C1 <labelled>,
    ## #   PP02C2 <labelled>, PP02C3 <labelled>, PP02C4 <labelled>, …

- También, se pueden seleccionar columnas según criterios con funciones auxiliares:
  - `starts_with` : selecciona columnas que empiecen con el string que pasemos.
  - `ends_with` : selecciona columnas que terminen con el string que le pasemos.
  - `contains` : selecciona columnas que contengan la palabra que indicamos.

    select_prueba_4 <- df %>% select(starts_with("CH"))

    head(select_prueba_4)

    ## # A tibble: 6 × 16
    ##   CH03   CH04  CH05  CH06  CH07  CH08  CH09  CH10  CH11  CH12  CH13  CH14  CH15
    ##   <labe> <lab> <lab> <lab> <lab> <lab> <lab> <lab> <lab> <lab> <lab> <lab> <lab>
    ## 1 3      2     02/1… 10    5     1     1     1     1     2     2     "04"  1
    ## 2 1      1     01/0… 51    2     1     1     2     0     6     1     ""    2
    ## 3 3      2     20/0… 17    5     1     1     1     1     4     2     "04"  1
    ## 4 2      2     01/0… 51    2     1     1     2     0     2     1     ""    1
    ## 5 1      2     24/0… 31    1     4     1     2     0     3     1     ""    1
    ## 6 2      1     16/0… 29    1     4     1     2     0     5     1     ""    1
    ## # ℹ 3 more variables: CH15_COD <labelled>, CH16 <labelled>, CH16_COD <labelled>

    select_prueba_5 <- df %>% select(contains("CAT"))

    head(select_prueba_5)

    ## # A tibble: 6 × 2
    ##   CAT_OCUP   CAT_INAC
    ##   <labelled> <labelled>
    ## 1 0          3
    ## 2 3          0
    ## 3 0          3
    ## 4 0          4
    ## 5 0          4
    ## 6 2          0

### `rename()`

- Esta función solo requiere indicar `NOMBRE_NUEVO = NOMBRE_VIEJO`

    df <- df %>% rename(sexo = CH04)

    table(df$sexo)

    ##
    ## Varon Mujer
    ## 23161 25174

- También se puede usar la versión `rename_with()` para cambiarle el nombre a una selección de columnas:

    df %>% rename_with(tolower, starts_with("CH"))

    ## # A tibble: 48,335 × 177
    ##    CODUSU   ANO4  TRIMESTRE NRO_HOGAR COMPONENTE H15   REGION MAS_500 AGLOMERADO
    ##    <labell> <lab> <labelle> <chr>     <labelled> <lab> <labe> <label> <labelled>
    ##  1 TQRMNOP… 2023  3         1         5          1     41     N        8
    ##  2 TQSMNOR… 2023  3         1         1          1     41     N        8
    ##  3 TQSMNOR… 2023  3         1         3          1     41     N        8
    ##  4 TQSMNOR… 2023  3         1         2          1     41     N        8
    ##  5 TQRMNOS… 2023  3         1         1          1     43     N       36
    ##  6 TQRMNOS… 2023  3         1         2          1     43     N       36
    ##  7 TQRMNOS… 2023  3         1         3          1     43     N       36
    ##  8 TQRMNOS… 2023  3         1         4          1     43     N       36
    ##  9 TQRMNOR… 2023  3         1         1          1     43     N       36
    ## 10 TQRMNOR… 2023  3         1         2          1     43     N       36
    ## # ℹ 48,325 more rows
    ## # ℹ 168 more variables: PONDERA <labelled>, ch03 <labelled>, sexo <labelled>,
    ## #   ch05 <labelled>, ch06 <labelled>, ch07 <labelled>, ch08 <labelled>,
    ## #   ch09 <labelled>, ch10 <labelled>, ch11 <labelled>, ch12 <labelled>,
    ## #   ch13 <labelled>, ch14 <labelled>, ch15 <labelled>, ch15_cod <labelled>,
    ## #   ch16 <labelled>, ch16_cod <labelled>, NIVEL_ED <labelled>,
    ## #   ESTADO <labelled>, CAT_OCUP <labelled>, CAT_INAC <labelled>, …

### `arrange()`

- La función toma un data frame y un conjunto de nombres de columnas (o expresiones más complicadas) para ordenar según ellas.

    df %>% arrange(CH06) %>% select(CH06)

    ## # A tibble: 48,335 × 1
    ##    CH06
    ##    <labelled>
    ##  1 -1
    ##  2 -1
    ##  3 -1
    ##  4 -1
    ##  5 -1
    ##  6 -1
    ##  7 -1
    ##  8 -1
    ##  9 -1
    ## 10 -1
    ## # ℹ 48,325 more rows

- Usa `desc()` para reordenar por una columna en orden descendente:

    df %>% arrange(desc(CH06)) %>% select(CH06)

    ## # A tibble: 48,335 × 1
    ##    CH06
    ##    <labelled>
    ##  1 108
    ##  2 102
    ##  3 100
    ##  4  99
    ##  5  99
    ##  6  99
    ##  7  99
    ##  8  99
    ##  9  99
    ## 10  99
    ## # ℹ 48,325 more rows

### `filter()`

- Esta función tiene el siguiente esquema: `filter(CONDICIÓN)`
- La clase 1 vimos los distintos operadores (lógicos, arimétricos, relacionales) que podemos usar para escribir estos formatos condicionales.

Supongamos que queremos quedarnos con los registros de mujeres:

    base_filtrada_1 <- df %>% filter(sexo == 2)

    table(base_filtrada_1$sexo)

    ##
    ## Mujer
    ## 25174

Por ejemplo, supongamos que queremos obtener los registros aquellas personas mayores de 25:

    base_filtrada_2 <- df %>% filter(CH06> 25)

    table(base_filtrada_2$CH06)

    ##
    ##  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45
    ## 742 718 719 665 727 699 760 680 637 636 662 653 636 640 679 597 699 728 682 739
    ##  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65
    ## 648 640 594 616 591 545 555 563 487 484 488 486 495 465 479 479 445 472 404 424
    ##  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85
    ## 424 403 412 372 384 333 344 301 291 310 241 208 240 170 179 154 140 132 117  92
    ##  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 102 108
    ##  83  78  51  51  47  33  31  27  14  11   8   5   6   9   1   1   1

Los condicionales también pueden combinarse. Podríamos traer todas las mujeres mayores de 25:

    base_filtrada_3 <- df %>% filter(sexo == 2 | CH06 > 25)

    dim(base_filtrada_3)

    ## [1] 38889   177

Ahora bien, ¿cómo hacemos si queremos los registros solo las mujeres desocupadas e inactivas?

    base_filtrada_4 <- df  %>% filter(ESTADO %in% c(2, 3) & sexo == 2)

    table(base_filtrada_4$ESTADO, base_filtrada_4$sexo)

    ##
    ##              Mujer
    ##   Desocupado   579
    ##   Inactivo   11882

`%in%` es una forma de indicar que vamos a buscar los valores del vector en la columna que indicamos. Sería lo mismo que hacer:

    base_filtrada_4 <- df  %>% filter((ESTADO == 2 & sexo == 2) | (ESTADO == 3 & sexo == 2))

Pero de manera simplificada.

El filtrado también puede aplicarse sobre columnas para quedarnos sólo con las filas que tienen valores -es decir, borrar los NA.

Vamos a borrar los casos que tienen NA en el ultimo año de cursada aprobado. Probemos que pasa si usamos el operador `==`

    base_filtrada_4 <- df  %>% filter(CH14 != NA) %>% select(CH14)

    nrow(base_filtrada_4)

    ## [1] 0

¡Nos borró todas las variables! Pero esto no está bien, ya que vimos que esta columna tenía varios valores. ¿Qué sucedió?

Resulta que los NA son bastante tramposos en R. Casi cualquier operación con uno de ellos va a devolver otro NA, y es por esto que no debemos trabajar con operadores a la hora de filtrarlos, sino que debemos usar la función `is.na()`

    base_filtrada_5 <- df  %>% filter(!is.na(CH14)) %>% select(CH14)

    nrow(base_filtrada_5)

    ## [1] 48335

### `mutate()`

- Esta función nos permite crear y modificar columnas.
- Suele ser útil crear columnas como funciones de columnas ya existentes
- Su sintaxis es `mutate(nombre_de_la_columna = valores_de_la_columna)`

Por ejemplo, podemos crear una columna simple con el nombre de la base:

    mutate_1 <- df %>% mutate(columna_ejemplo = "EPH 2do trim 2020")
    head(mutate_1)

    ## # A tibble: 6 × 178
    ##   CODUSU    ANO4  TRIMESTRE NRO_HOGAR COMPONENTE H15   REGION MAS_500 AGLOMERADO
    ##   <labelle> <lab> <labelle> <chr>     <labelled> <lab> <labe> <label> <labelled>
    ## 1 TQRMNOPS… 2023  3         1         5          1     41     N        8
    ## 2 TQSMNORW… 2023  3         1         1          1     41     N        8
    ## 3 TQSMNORW… 2023  3         1         3          1     41     N        8
    ## 4 TQSMNORW… 2023  3         1         2          1     41     N        8
    ## 5 TQRMNOSQ… 2023  3         1         1          1     43     N       36
    ## 6 TQRMNOSQ… 2023  3         1         2          1     43     N       36
    ## # ℹ 169 more variables: PONDERA <labelled>, CH03 <labelled>, sexo <labelled>,
    ## #   CH05 <labelled>, CH06 <labelled>, CH07 <labelled>, CH08 <labelled>,
    ## #   CH09 <labelled>, CH10 <labelled>, CH11 <labelled>, CH12 <labelled>,
    ## #   CH13 <labelled>, CH14 <labelled>, CH15 <labelled>, CH15_COD <labelled>,
    ## #   CH16 <labelled>, CH16_COD <labelled>, NIVEL_ED <labelled>,
    ## #   ESTADO <labelled>, CAT_OCUP <labelled>, CAT_INAC <labelled>,
    ## #   IMPUTA <labelled>, PP02C1 <labelled>, PP02C2 <labelled>, …

- También podemos “editar” una columna ya existente. Por ejemplo, podemos pasar a `string` la columna de sexo para que aparezca la etiqueta en lugar de números:

    mutate_2 <- df %>% mutate(sexo = as.character(sexo))
    mutate_2 %>% select(sexo)

    ## # A tibble: 48,335 × 1
    ##    sexo
    ##    <chr>
    ##  1 Mujer
    ##  2 Varon
    ##  3 Mujer
    ##  4 Mujer
    ##  5 Mujer
    ##  6 Varon
    ##  7 Mujer
    ##  8 Mujer
    ##  9 Varon
    ## 10 Mujer
    ## # ℹ 48,325 more rows

- Podemos combinar `mutate` y `across()` para editar varias variables al mismo tiempo:
  - dentro de la función `mutate()` pasamos una segunda función `across()` donde indicamos el conjunto de columnas que queremos modificar
  - para aplicar una función hay que introducirla con el símbolo `~`
  - usamos el punto `.x` para referirnos a la selección de variables anterior

    df <- df %>% mutate(across(c(CH03, sexo, CH07:CAT_INAC), ~as.character(.x)))

    df %>% select(CH03:CAT_INAC)

    ## # A tibble: 48,335 × 20
    ##    CH03  sexo  CH05  CH06  CH07  CH08  CH09  CH10  CH11  CH12  CH13  CH14  CH15
    ##    <chr> <chr> <lab> <lab> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
    ##  1 Hijo… Mujer 02/1… 10    solt… Obra… Si    Si, … Publ… Prim… No    "04"  En e…
    ##  2 Jefe… Varon 01/0… 51    casa… Obra… Si    No a… 0     Terc… Si    ""    En o…
    ##  3 Hijo… Mujer 20/0… 17    solt… Obra… Si    Si, … Publ… Secu… No    "04"  En e…
    ##  4 Cony… Mujer 01/0… 51    casa… Obra… Si    No a… 0     Prim… Si    ""    En e…
    ##  5 Jefe… Mujer 24/0… 31    unid… No p… Si    No a… 0     EGB   Si    ""    En e…
    ##  6 Cony… Varon 16/0… 29    unid… No p… Si    No a… 0     Poli… Si    ""    En e…
    ##  7 Hijo… Mujer 14/0… 12    solt… No p… Si    Si, … Publ… EGB   No    "06"  En e…
    ##  8 Hijo… Mujer 07/1… 15    solt… No p… Si    Si, … Publ… Poli… No    "00"  En e…
    ##  9 Jefe… Varon 15/0… 35    unid… No p… Si    No a… 0     Poli… Si    ""    En u…
    ## 10 Cony… Mujer 25/1… 32    unid… No p… Si    No a… 0     EGB   Si    ""    En u…
    ## # ℹ 48,325 more rows
    ## # ℹ 7 more variables: CH15_COD <chr>, CH16 <chr>, CH16_COD <chr>,
    ## #   NIVEL_ED <chr>, ESTADO <chr>, CAT_OCUP <chr>, CAT_INAC <chr>

### `group_by` + `summarize()`

- `group_by` cambia la unidad de análsis del dataset a grupos. Así, al llamar a cualqyuer verbo de `dplyr` se aplica “por grupo”,
- combinándolo con `summarize()`, nos permite hacer una tabla con una medida resumen de las variables que querramos.

Por ejemplo, podemos hacer el conteo de frecuencias del último año aprobado de escolaridad:

    df %>%
            group_by(CH14)%>%
            summarize(n=n())

    ## # A tibble: 13 × 2
    ##    CH14                     n
    ##    <chr>                <int>
    ##  1 ""                   23924
    ##  2 "00"                  4240
    ##  3 "01"                  3874
    ##  4 "02"                  4878
    ##  5 "03"                  4527
    ##  6 "04"                  3259
    ##  7 "05"                  1944
    ##  8 "06"                   703
    ##  9 "07"                   121
    ## 10 "08"                   138
    ## 11 "09"                    18
    ## 12 "Educacion especial"   241
    ## 13 "Ns/Nr."               468

La media de edades según sexo:

    df %>%
            group_by(sexo)%>%
            summarize(mean_edad=round(mean(CH06,na.rm=TRUE)))

    ## # A tibble: 2 × 2
    ##   sexo  mean_edad
    ##   <chr>     <dbl>
    ## 1 Mujer        37
    ## 2 Varon        34

### `pivot_longer` y `pivot_wider`

- `pivot_longer` “alarga” los datos convirtiendo columnas a filas. Tiene los siguientes parámetros: + `cols`: elijo las columnas que quiero pasar a filas + `names_to`: indico el nombre de la columna que va a contener las variables elegidas + `values_to`: indico el nombre de la columna que va a contener los valores de las variables

    medidas_resumen <- df %>%
      group_by(sexo) %>%
      summarise(media_edad = mean(CH06, na.rm = TRUE),
                sd_edad = sd(CH06, na.rm = TRUE)) %>%
      select(sexo,
             media_edad, sd_edad)

    pivot_longer_resumen <- medidas_resumen%>%
      pivot_longer(cols = c(media_edad, sd_edad),
                   names_to = "variable",
                   values_to = "valor")

- `pivot_wider` es la operación inversa. Crea variables a partir de filas, y “alarga” la base de datos. +`id_cols`: la columna de ID, que no queremos que pierda su formato +`names_from`: indico en qué columna están los nombres de las variables
  - `values_from`: indico en qué columna están los valores de las variables

    pivot_longer_resumen %>%
            pivot_wider(id_cols= sexo,
                        names_from=variable,
                        values_from = valor)

    ## # A tibble: 2 × 3
    ##   sexo  media_edad sd_edad
    ##   <chr>      <dbl>   <dbl>
    ## 1 Mujer       37.1    22.5
    ## 2 Varon       34.3    21.6

### `join()`

- Esta función sirve para unir un dataframe x con un dataframe y a partir de un identificador común. Existen distintos tipos de join:
  - `inner_join():` incluye todas las filas que estén en x e y.
  - `left_join():` incluye todas las filas que estén en x.
  - `right_join():` incluye todas las filas que estén en y.
  - `full_join():` incluye todas las filas que estén en x o y.

Supongamos que queremos “joinear” la base que tenemos con las variables de resumen del hogar (cantidad de personas en el hogar `IX_TOT`, las personas menores de 10 años `IX_MEN10` y las personas de 10 o más años de edad, `IX_MAYEQ10`). Todas estas variables están en la tabla de hogares. La columna CODSU nos da un identificador único de cada registro. De manera que podemos hacer un seguimiento de los individuos en el hogar a través de esa columna:

    df_2 <- get_microdata(year=2023, trimester=3, type='hogar') %>%
            organize_labels(type='hogar') %>%
            mutate(NRO_HOGAR = as.character(NRO_HOGAR))

    df_2 <- df_2 %>%
        select(CODUSU, NRO_HOGAR, IX_TOT:IX_MAYEQ10) # Selecciono únicamente las variables de ID y las variables de resumen del hogar

    df_merged <- df %>% left_join(df_2, by = c("CODUSU", "NRO_HOGAR"))

Ahora podemos chequear el resultado revisando los nombres de columnas que se agregaron a la tabla.

    colnames(df_merged)

    ##   [1] "CODUSU"     "ANO4"       "TRIMESTRE"  "NRO_HOGAR"  "COMPONENTE"
    ##   [6] "H15"        "REGION"     "MAS_500"    "AGLOMERADO" "PONDERA"
    ##  [11] "CH03"       "sexo"       "CH05"       "CH06"       "CH07"
    ##  [16] "CH08"       "CH09"       "CH10"       "CH11"       "CH12"
    ##  [21] "CH13"       "CH14"       "CH15"       "CH15_COD"   "CH16"
    ##  [26] "CH16_COD"   "NIVEL_ED"   "ESTADO"     "CAT_OCUP"   "CAT_INAC"
    ##  [31] "IMPUTA"     "PP02C1"     "PP02C2"     "PP02C3"     "PP02C4"
    ##  [36] "PP02C5"     "PP02C6"     "PP02C7"     "PP02C8"     "PP02E"
    ##  [41] "PP02H"      "PP02I"      "PP03C"      "PP03D"      "PP3E_TOT"
    ##  [46] "PP3F_TOT"   "PP03G"      "PP03H"      "PP03I"      "PP03J"
    ##  [51] "INTENSI"    "PP04A"      "PP04B_COD"  "PP04B1"     "PP04B2"
    ##  [56] "PP04B3_MES" "PP04B3_ANO" "PP04B3_DIA" "PP04C"      "PP04C99"
    ##  [61] "PP04D_COD"  "PP04G"      "PP05B2_MES" "PP05B2_ANO" "PP05B2_DIA"
    ##  [66] "PP05C_1"    "PP05C_2"    "PP05C_3"    "PP05E"      "PP05F"
    ##  [71] "PP05H"      "PP06A"      "PP06C"      "PP06D"      "PP06E"
    ##  [76] "PP06H"      "PP07A"      "PP07C"      "PP07D"      "PP07E"
    ##  [81] "PP07F1"     "PP07F2"     "PP07F3"     "PP07F4"     "PP07F5"
    ##  [86] "PP07G1"     "PP07G2"     "PP07G3"     "PP07G4"     "PP07G_59"
    ##  [91] "PP07H"      "PP07I"      "PP07J"      "PP07K"      "PP08D1"
    ##  [96] "PP08D4"     "PP08F1"     "PP08F2"     "PP08J1"     "PP08J2"
    ## [101] "PP08J3"     "PP09A"      "PP09A_ESP"  "PP09B"      "PP09C"
    ## [106] "PP09C_ESP"  "PP10A"      "PP10C"      "PP10D"      "PP10E"
    ## [111] "PP11A"      "PP11B_COD"  "PP11B1"     "PP11B2_MES" "PP11B2_ANO"
    ## [116] "PP11B2_DIA" "PP11C"      "PP11C99"    "PP11D_COD"  "PP11G_ANO"
    ## [121] "PP11G_MES"  "PP11G_DIA"  "PP11L"      "PP11L1"     "PP11M"
    ## [126] "PP11N"      "PP11O"      "PP11P"      "PP11Q"      "PP11R"
    ## [131] "PP11S"      "PP11T"      "P21"        "DECOCUR"    "IDECOCUR"
    ## [136] "RDECOCUR"   "GDECOCUR"   "PDECOCUR"   "ADECOCUR"   "PONDIIO"
    ## [141] "TOT_P12"    "P47T"       "DECINDR"    "IDECINDR"   "RDECINDR"
    ## [146] "GDECINDR"   "PDECINDR"   "ADECINDR"   "PONDII"     "V2_M"
    ## [151] "V3_M"       "V4_M"       "V5_M"       "V8_M"       "V9_M"
    ## [156] "V10_M"      "V11_M"      "V12_M"      "V18_M"      "V19_AM"
    ## [161] "V21_M"      "T_VI"       "ITF"        "DECIFR"     "IDECIFR"
    ## [166] "RDECIFR"    "GDECIFR"    "PDECIFR"    "ADECIFR"    "IPCF"
    ## [171] "DECCFR"     "IDECCFR"    "RDECCFR"    "GDECCFR"    "PDECCFR"
    ## [176] "ADECCFR"    "PONDIH"     "IX_TOT"     "IX_MEN10"   "IX_MAYEQ10"

## Ejercicios

1. ¿Cómo podrían calcular (sin hacer el join) las variables que trajimos de la tabla de hogar?

- cantidad de personas en el hogar `IX_TOT`
- cantidad de personas menores de 10 años `IX_MEN10`
- cantidad de personas de 10 o más años de edad, `IX_MAYEQ10`

2. Hagan un join de la variable Ingreso Total Familiar (`ITF`) de la tabla de hogar y chequeen los resultados con la misma variable que ya existe en la tabla de individuos.