Procesando datos con {tidyverse}

Principales herramientas (funciones) para el tratamiento de datos

2024-02-21

Bienvenidos y bienvenidas a Estación R

💬 Slack

🔗 Web

🐘 Mastodon

𝕏 X

✉️ Correo

¿Qué vimos?


✅ Conceptos básicos de R (valores, vectores, data.framtes, funciones, objetos)


✅ Cómo armar y organizar un proyecto de trabajo


✅ Qué son los paquetes (o librerías)

Hoja de Ruta

📌 ¿Qué es la Ciencia de Datos?


📦 Paquete {dplyr}

🔧 `select()` 🔧 `filter()` 

🔧 `mutate()` 🔧 `rename()` 

🔧 `arrange()` 

🔧 `group_by()` 🔧 `summarise()`  

🔧 `joins` 

📌 La pipa (|> o %>%)


📦 Paquete {tidyr}

🔧 `pivot_longer()` 🔧 `pivot_wider()`  

Configuración para esta clase


  • Armar un proyeto de trabajo nuevo

  • Crear una carpeta en el llamada datos

  • Descargar la base del Padrón Único Nacional de Alojamientos (Argentina) y ubicarla en la carpeta datos

  • Crear un script de trabajo

¿Qué es la Ciencia de Datos?

¿Qué es la Ciencia de Datos?

r project console

{tidyverse}

¿Qué es {tidyverse}?

  • Una colección de paquetes.

  • Comparten una filosofía acerca de los datos y la programación en R (“tidy” -ordenado-).

  • Tienen una coherencia para ser utilizados en conjunto.

  • Orientado a ser leído y escrito por y para seres humanos.

  • Una comunidad, basada en los principios del código abierto y trabajo colaborativo.

¿Qué es {tidyverse}?

{tidyverse}


  • Instalación:
install.packages("tidyverse")

{tidyverse}


  • Cargo el paquete:
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

{tidyverse}

  • Nos evita tener que instalar uno por uno a cada paquete:
install.packages("dplyr")
install.packages("tidyr")
install.packages("ggplot2")


  • Como también tener que convocarlos de a uno:
library(dplyr)
library(tidyr)
library(ggplot2)

La pipa

Un operador llamado pipa




base_de_datos |> 
  funcion1 |> 
  funcion2 |>  
  funcion3

Un operador llamado pipa


  • Pipa de R base: |>


  • Pipa de {magritr}: %>%

Ejemplo:



datos <- data.frame(nombre = c("Pirulanzo", "Rodogovia", "Rodogovia", "Rodogovia"),
                    edad = c(23, 12, 87, 32))

datos
     nombre edad
1 Pirulanzo   23
2 Rodogovia   12
3 Rodogovia   87
4 Rodogovia   32

Ejemplo:

  • Quiero calcular qué proporción de personas se llaman Rodogovia


  • Antes (sin el pipe):
round(prop.table(table(datos$nombre)), digits = 1)

Pirulanzo Rodogovia 
      0.2       0.8 

Ejemplo:


  • Después (con el pipe):
datos$nombre |> 
  table() |> 
  prop.table() |> 
  round(digits = 1)

Pirulanzo Rodogovia 
      0.2       0.8 

Funciones del paquete dplyr:


Función Acción
select() selecciona o descarta variables
filter() selecciona filas
mutate() crea / edita variables
rename() renombra variables
group_by() segmenta en funcion de una variable
summarize() genera una tabla de resúmen

select()


Elige o descarta columnas de una base de datos

select()


  • La función tiene la siguiente estructura:
base_de_datos |> 
  select(id, nombre) #<<

Caso práctico

# Cargo paquete
library(readr)

# Importo datos
df_puna <- read_csv("datos/puna_base_agregada.csv")


# Exploro la base
colnames(df_puna)
 [1] "indice_tiempo"           "region"                 
 [3] "ruta_natural"            "provincia_codigo"       
 [5] "provincia_nombre"        "departamento_partido"   
 [7] "localidad"               "clasificacion_minturdep"
 [9] "tipo"                    "establecimientos"       
[11] "unidades"                "habitaciones"           
[13] "plazas"                 

Caso práctico


  • Pedido: La coordinadora me ha solicitado conocer la cantidad de plazas que hay por localidad y, si es posible, saber de qué tipo son los alojamientos


  • Variables de trabajo:

    • localidad
    • plazas
    • tipo

Caso práctico


  • Selecciono las 3 columnas de interés
library(tidyverse)

df_puna |> 
  select(localidad, tipo, plazas)

Caso práctico


  • Selecciono las 3 columnas de interés
library(tidyverse)

df_puna_sel <- df_puna |> 
  select(localidad, tipo, plazas)


  • Chequeo las columnas del nuevo objeto
colnames(df_puna_sel)
[1] "localidad" "tipo"      "plazas"   

Otras formas de seleccionar…

select() - por posición


  1. Chequeo la posición:
colnames(df_puna)
 [1] "indice_tiempo"           "region"                 
 [3] "ruta_natural"            "provincia_codigo"       
 [5] "provincia_nombre"        "departamento_partido"   
 [7] "localidad"               "clasificacion_minturdep"
 [9] "tipo"                    "establecimientos"       
[11] "unidades"                "habitaciones"           
[13] "plazas"                 

select() - por posición


  1. Selecciono
df_puna_sel_posicion <- df_puna |> 
  select(7, 9, 13)

select() - por posición


  1. Chequeo
colnames(df_puna_sel_posicion)
[1] "localidad" "tipo"      "plazas"   

select() - por posición (columnas consecutivas)


df_puna_sel_posicion2 <- df_puna |> 
  select(1:3)

select() - por posición (columnas consecutivas)


df_puna_sel_posicion2 <- df_puna |> 
  select(1:3)


colnames(df_puna_sel_posicion2)
[1] "indice_tiempo" "region"        "ruta_natural" 

select() - por nombre (consecutiva)


df_puna_sel_posicion3 <- df_puna |> 
  select(establecimientos:plazas)

select() - por nombre (consecutiva)


df_puna_sel_posicion3 <- df_puna |> 
  select(establecimientos:plazas)


colnames(df_puna_sel_posicion3)
[1] "establecimientos" "unidades"         "habitaciones"     "plazas"          

select() - Por patrones de texto


Trío:

  • starts_with() –> empieza con…

  • ends_with() –> termina con…

  • contains() –> contiene…

select() + starts_with()


df_puna_sel_patron1 <- df_puna |> 
  select(starts_with("provincia"))

select() + starts_with()


df_puna_sel_patron1 <- df_puna |> 
  select(starts_with("provincia"))


colnames(df_puna_sel_patron1)
[1] "provincia_codigo" "provincia_nombre"

select() + ends_with()


df_puna_sel_patron2 <- df_puna |> 
  select(ends_with("o"))

select() + starts_with()


df_puna_sel_patron2 <- df_puna |> 
  select(ends_with("o"))


colnames(df_puna_sel_patron2)
[1] "indice_tiempo"        "provincia_codigo"     "departamento_partido"
[4] "tipo"                

select() + contains()


df_puna_sel_patron3 <- df_puna |> 
  select(contains("_"))

select() + contains()


df_puna_sel_patron3 <- df_puna |> 
  select(contains("_"))


colnames(df_puna_sel_patron3)
[1] "indice_tiempo"           "ruta_natural"           
[3] "provincia_codigo"        "provincia_nombre"       
[5] "departamento_partido"    "clasificacion_minturdep"

LA COMBINACIÓN FINAL

select()


df_puna_select_tuto <- df_puna |> 
  select(localidad, 2, starts_with("provincia"), 9:11)

select()


df_puna_select_tuto <- df_puna |> 
  select(localidad, 2, starts_with("provincia"), 9:11)


colnames(df_puna_select_tuto)
[1] "localidad"        "region"           "provincia_codigo" "provincia_nombre"
[5] "tipo"             "establecimientos" "unidades"        

Ejercitación grupal

Ejercitación

  • Crear un objeto en donde importamos la base de datos de Alojamientos.

  • Seleccionar 3 variables de la base según el nombre de las mismas y guardar en otro objeto.

  • Seleccionar 3 variables de la base según la posición de las mismas y guardar en otro objeto.

  • Seleccionar todas las variables que empiecen con un patrón de texto (a elegir).

filter()


Define los casos (filas) en base a una condición

filter()


  • La función tiene la siguiente estructura:
base_de_datos |> 
  filter(condicion) 

filter()


  • La función tiene la siguiente estructura:
base_de_datos |> 
  filter(Edad > 65) 

Caso práctico


  • La directora de tesis me pidió que estudie los alojamientos de tipo Camping.


  • Universo de análisis / Población de estudio:

    • Alojamientos tipo Camping

Caso práctico


  • Chequeo con qué tipos de alojamiento cuento en la base:

Caso práctico


  • Chequeo con qué tipos de alojamiento cuento en la base:
unique(df_puna$clasificacion_minturdep)
 [1] "Albergue municipal / complejo deportivo"
 [2] "Caba\xf1as / bungalows"                 
 [3] "Conjunto de unidades turisticas"        
 [4] "Establecimiento rural"                  
 [5] "Hosteria"                               
 [6] "Hotel 1 estrella"                       
 [7] "Hotel 2 estrellas"                      
 [8] "Hotel boutique"                         
 [9] "Hotel sin categorizar"                  
[10] "Residencial"                            
[11] "Camping"                                
[12] "Hotel 3 estrellas"                      
[13] "Sin clasificar"                         
[14] "Motel"                                  
[15] "Hospedaje"                              
[16] "Posada"                                 
[17] "Apart hotel"                            
[18] "Albergue / b&b / hostel"                
[19] "Hotel 4 estrellas"                      
[20] "Hotel 5 estrellas"                      
[21] "Dormis"                                 
[22] "Residencia universitaria"               
[23] "Hotel sindical / mutual"                
[24] "Complejo turistico"                     
[25] "Refugio"                                
[26] "Pension"                                
[27] "Lodge de pesca / caza/ en bodegas"      

Caso práctico


  • Aplico filtro
library(tidyverse)

df_filtrada <- df_puna |> 
  filter(clasificacion_minturdep == "Camping")

Caso práctico


  • Chequeo filtro
unique(df_filtrada$clasificacion_minturdep)
[1] "Camping"

filter()

Condición Acción
== igual
%in% incluye
!= distinto
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
Operador Descripción
& y - Cuando se cumplen ambas condiciones
| o - Cuando se cumple una u otra condición

Caso práctico


  • La encargada de la oficina de turismo de Buenos Aires quiere que le arme una base sólo con alojamientos de tipo Camping y Hoteles 3 estrellas.

Caso práctico


  • Chequeo las categorías de la variable clasificacion_minturdep
unique(df_puna$clasificacion_minturdep)
 [1] "Albergue municipal / complejo deportivo"
 [2] "Caba\xf1as / bungalows"                 
 [3] "Conjunto de unidades turisticas"        
 [4] "Establecimiento rural"                  
 [5] "Hosteria"                               
 [6] "Hotel 1 estrella"                       
 [7] "Hotel 2 estrellas"                      
 [8] "Hotel boutique"                         
 [9] "Hotel sin categorizar"                  
[10] "Residencial"                            
[11] "Camping"                                
[12] "Hotel 3 estrellas"                      
[13] "Sin clasificar"                         
[14] "Motel"                                  
[15] "Hospedaje"                              
[16] "Posada"                                 
[17] "Apart hotel"                            
[18] "Albergue / b&b / hostel"                
[19] "Hotel 4 estrellas"                      
[20] "Hotel 5 estrellas"                      
[21] "Dormis"                                 
[22] "Residencia universitaria"               
[23] "Hotel sindical / mutual"                
[24] "Complejo turistico"                     
[25] "Refugio"                                
[26] "Pension"                                
[27] "Lodge de pesca / caza/ en bodegas"      

Caso práctico


  • Filtro (opción 1):
df_camping_y_hoteles3estrellas <- df_puna |> 
  filter(clasificacion_minturdep == "Camping" | clasificacion_minturdep == "Hotel 3 estrellas")

Caso práctico


  • Chequeo filtro
unique(df_camping_y_hoteles3estrellas$clasificacion_minturdep)
[1] "Camping"           "Hotel 3 estrellas"

Caso práctico


  • Filtro (opción 2, operador: %in%):
df_camping_y_hoteles3estrellas <- df_puna |> 
  filter(clasificacion_minturdep %in% c("Camping", "Hotel 3 estrellas"))

Caso práctico


  • Chequeo filtro
unique(df_camping_y_hoteles3estrellas$clasificacion_minturdep)
[1] "Camping"           "Hotel 3 estrellas"

select() + filter()


df_puna |> 
  select(localidad, 
         clasificacion_minturdep)
# A tibble: 14,717 × 2
   localidad clasificacion_minturdep                  
   <chr>     <chr>                                    
 1 Baradero  "Albergue municipal / complejo deportivo"
 2 Baradero  "Caba\xf1as / bungalows"                 
 3 Baradero  "Conjunto de unidades turisticas"        
 4 Baradero  "Establecimiento rural"                  
 5 Baradero  "Hosteria"                               
 6 Baradero  "Hotel 1 estrella"                       
 7 Baradero  "Hotel 2 estrellas"                      
 8 Baradero  "Hotel boutique"                         
 9 Baradero  "Hotel sin categorizar"                  
10 Baradero  "Residencial"                            
# ℹ 14,707 more rows

select() + filter()


df_puna |> 
  select(localidad, 
         clasificacion_minturdep) |> 
  filter(clasificacion_minturdep %in% c("Camping", "Hotel 3 estrellas"))
# A tibble: 1,438 × 2
   localidad                  clasificacion_minturdep
   <chr>                      <chr>                  
 1 Belen de Escobar           Camping                
 2 Belen de Escobar           Hotel 3 estrellas      
 3 Fatima                     Hotel 3 estrellas      
 4 Ramallo                    Hotel 3 estrellas      
 5 Villa Ramallo              Hotel 3 estrellas      
 6 San Nicolas de Los Arroyos Hotel 3 estrellas      
 7 San Pedro                  Camping                
 8 San Pedro                  Hotel 3 estrellas      
 9 Zarate                     Hotel 3 estrellas      
10 9 de Julio                 Hotel 3 estrellas      
# ℹ 1,428 more rows

Ejercitación grupal

Ejercitación

  • Crear un objeto que contenga la base de PUNA sólo con las variables localidad, ruta_natural y plazas

  • En ese mismo objeto, quedarse sólo con las filas de la ruta natural Delta.

  • Calcular cuántas plazas hay en total para la ruta natural Delta (tip: la función sum() puede ser de ayuda)

mutate()


Crea / edita variables (columnas)

mutate()


  • La función tiene la siguiente estructura:


base_de_datos %>% 
   mutate(var_nueva = var_1 + var_2)

mutate() - Caso práctico


  • Llega a la oficina una persona interesada en saber cuál es el valor total disponible para dormir en los establecimientos. Quiere, entonces, conocer el resultado de la suma entre habitaciones y plazas.
  • Para ello, podemos crear una variable que contenga este resultado:

mutate() - Caso práctico


df_lugar_tot <- df_puna |> 
  select(localidad, habitaciones, plazas)
# A tibble: 14,717 × 3
   localidad habitaciones plazas
   <chr>            <dbl>  <dbl>
 1 Baradero             6     30
 2 Baradero             0    277
 3 Baradero             0     50
 4 Baradero            57    131
 5 Baradero            68    164
 6 Baradero            15     34
 7 Baradero            49    135
 8 Baradero            27     78
 9 Baradero            28     60
10 Baradero             5     15
# ℹ 14,707 more rows

mutate() - Caso práctico


df_lugar_tot <- df_puna |> 
  select(localidad, habitaciones, plazas) |> 
  mutate(lugar_disponible = habitaciones + plazas)
# A tibble: 14,717 × 4
   localidad habitaciones plazas lugar_disponible
   <chr>            <dbl>  <dbl>            <dbl>
 1 Baradero             6     30               36
 2 Baradero             0    277              277
 3 Baradero             0     50               50
 4 Baradero            57    131              188
 5 Baradero            68    164              232
 6 Baradero            15     34               49
 7 Baradero            49    135              184
 8 Baradero            27     78              105
 9 Baradero            28     60               88
10 Baradero             5     15               20
# ℹ 14,707 more rows

mutate() + case_when() = Recodificación



  • Necesito agregarle una etiqueta a la variable indice_tiempo (pasar de 2020 a "Año 2020")

mutate() + case_when() = Recodificación


df_lugar_tot <- df_puna |> 
  select(indice_tiempo, localidad, plazas)
# A tibble: 14,717 × 3
   indice_tiempo localidad plazas
           <dbl> <chr>      <dbl>
 1          2020 Baradero      30
 2          2020 Baradero     277
 3          2020 Baradero      50
 4          2020 Baradero     131
 5          2020 Baradero     164
 6          2020 Baradero      34
 7          2020 Baradero     135
 8          2020 Baradero      78
 9          2020 Baradero      60
10          2020 Baradero      15
# ℹ 14,707 more rows

mutate() + case_when() = Recodificación


df_puna_recod <- df_puna |> 
  select(indice_tiempo, localidad, plazas) |> 
  mutate(anio_etiqueta = case_when(indice_tiempo == 2020 ~ "Año 2020",
                                      indice_tiempo == 2021 ~ "Año 2021",
                                      indice_tiempo == 2022 ~ "Año 2022"))
# A tibble: 14,717 × 4
   indice_tiempo localidad plazas anio_etiqueta
           <dbl> <chr>      <dbl> <chr>        
 1          2020 Baradero      30 Año 2020     
 2          2020 Baradero     277 Año 2020     
 3          2020 Baradero      50 Año 2020     
 4          2020 Baradero     131 Año 2020     
 5          2020 Baradero     164 Año 2020     
 6          2020 Baradero      34 Año 2020     
 7          2020 Baradero     135 Año 2020     
 8          2020 Baradero      78 Año 2020     
 9          2020 Baradero      60 Año 2020     
10          2020 Baradero      15 Año 2020     
# ℹ 14,707 more rows

mutate() + case_when() = Recodificación



  • Necesito caracterizar al sector hotelero y compararlo con el resto de los alojamientos

mutate() + case_when() = Recodificación


df_puna_agrup <- df_puna |> 
  select(tipo, plazas) |> 
  mutate(tipo_agrupado = case_when(tipo == "Hoteleros" ~ "Hoteleros",
                                   .default = "Otros"))
# A tibble: 14,717 × 3
   tipo             plazas tipo_agrupado
   <chr>             <dbl> <chr>        
 1 Otros colectivos     30 Otros        
 2 Parahoteleros       277 Otros        
 3 Otros colectivos     50 Otros        
 4 Parahoteleros       131 Otros        
 5 Parahoteleros       164 Otros        
 6 Hoteleros            34 Hoteleros    
 7 Hoteleros           135 Hoteleros    
 8 Hoteleros            78 Hoteleros    
 9 Hoteleros            60 Hoteleros    
10 Parahoteleros        15 Otros        
# ℹ 14,707 more rows

mutate() + case_when() = Recodificación



  • Necesito Reagrupar unicamente a los hoteles de 1, 2 y 3 estrellas, para compararlos frente al resto:

mutate() + case_when() = Recodificación


df_puna_agrup_hotel <- df_puna |> 
  select(clasificacion_minturdep, plazas) |> 
  mutate(clasif_agrupado = case_when(
    clasificacion_minturdep %in% c("Hotel 1 estrella", 
                                   "Hotel 2 estrellas",
                                   "Hotel 3 estrellas") ~ "Hotel hasta 3 estrellas",
    .default = "Otros"))
# A tibble: 14,717 × 3
   clasificacion_minturdep                   plazas clasif_agrupado        
   <chr>                                      <dbl> <chr>                  
 1 "Albergue municipal / complejo deportivo"     30 Otros                  
 2 "Caba\xf1as / bungalows"                     277 Otros                  
 3 "Conjunto de unidades turisticas"             50 Otros                  
 4 "Establecimiento rural"                      131 Otros                  
 5 "Hosteria"                                   164 Otros                  
 6 "Hotel 1 estrella"                            34 Hotel hasta 3 estrellas
 7 "Hotel 2 estrellas"                          135 Hotel hasta 3 estrellas
 8 "Hotel boutique"                              78 Otros                  
 9 "Hotel sin categorizar"                       60 Otros                  
10 "Residencial"                                 15 Otros                  
# ℹ 14,707 more rows

Ejercitación grupal

Ejercitación

  • Necesito reagrupar la variable clasificacion_minturdep para quedarme con 2 categorìas:

    • Camping

    • Otros

Dada la consigna anterior, rellenar en el campo marcado con ______ con el código necesario para ejecutar la sentencia:

df_puna |> 
  select(localidad, ________) |> 
  mutate(nueva_clasificacion = case_when(________ == "Camping" ~ "Camping",
                                         .default = "Otros"))

summarise()


Resume información y realiza cálculos

summarise()


  • Antes:
sum(df_puna$plazas)
[1] 2346290

summarise()


  • Ahora:
df_puna |> 
  summarise(cant_plazas = sum(plazas))
# A tibble: 1 × 1
  cant_plazas
        <dbl>
1     2346290

summarise()


  • Ahora:
df_puna |> 
  summarise(cant_plazas = sum(plazas),
            prom_plazas = mean(plazas))
# A tibble: 1 × 2
  cant_plazas prom_plazas
        <dbl>       <dbl>
1     2346290        159.

summarise()


  • Ahora:
df_puna |> 
  summarise(cant_plazas = sum(plazas),
            prom_plazas = mean(plazas),
            min_plazas  = min(plazas),
            max_plazas  = max(plazas))
# A tibble: 1 × 4
  cant_plazas prom_plazas min_plazas max_plazas
        <dbl>       <dbl>      <dbl>      <dbl>
1     2346290        159.          0      20001

group_by()


Ayuda a ejecutar una función de forma agrupada

group_by()


  • Antes:
df_puna |> 
  summarise(cant_plazas = sum(plazas),
            prom_plazas = mean(plazas),
            min_plazas  = min(plazas),
            max_plazas  = max(plazas))
# A tibble: 1 × 4
  cant_plazas prom_plazas min_plazas max_plazas
        <dbl>       <dbl>      <dbl>      <dbl>
1     2346290        159.          0      20001

group_by()


  • Después:
df_puna |>
  group_by(indice_tiempo) |> 
  summarise(cant_plazas = sum(plazas),
            prom_plazas = mean(plazas),
            min_plazas  = min(plazas),
            max_plazas  = max(plazas))
# A tibble: 3 × 5
  indice_tiempo cant_plazas prom_plazas min_plazas max_plazas
          <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
1          2020      785963        161.          0      20001
2          2021      780050        159.          0      20001
3          2022      780277        158.          0      19964

input / output


  • Toda función tiene un input (ingredientes 🧂🌾🧄) y un output (la torta 🎂)

input / output


  • ¿Cuál es el output del summarise()?

input / output


# Creo objeto
tabla_puna <- df_puna |>
  group_by(indice_tiempo) |> 
  summarise(cant_plazas = sum(plazas),
            prom_plazas = mean(plazas),
            min_plazas  = min(plazas),
            max_plazas  = max(plazas))

# Chequeo tipo de objeto
class(tabla_puna)
[1] "tbl_df"     "tbl"        "data.frame"

input / output


  • ¿Y qué puedo hacer sobre un data frame?

input / output


tabla_puna |> 
  filter(indice_tiempo == 2022)
# A tibble: 1 × 5
  indice_tiempo cant_plazas prom_plazas min_plazas max_plazas
          <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
1          2022      780277        158.          0      19964

input / output


tabla_puna |> 
  filter(indice_tiempo == 2022) |> 
  select(indice_tiempo, cant_plazas)
# A tibble: 1 × 2
  indice_tiempo cant_plazas
          <dbl>       <dbl>
1          2022      780277

tidyverse en acción


tidyverse en acción

df_puna |> 
  select(indice_tiempo, tipo, plazas)
# A tibble: 14,717 × 3
   indice_tiempo tipo             plazas
           <dbl> <chr>             <dbl>
 1          2020 Otros colectivos     30
 2          2020 Parahoteleros       277
 3          2020 Otros colectivos     50
 4          2020 Parahoteleros       131
 5          2020 Parahoteleros       164
 6          2020 Hoteleros            34
 7          2020 Hoteleros           135
 8          2020 Hoteleros            78
 9          2020 Hoteleros            60
10          2020 Parahoteleros        15
# ℹ 14,707 more rows

tidyverse en acción

df_puna |> 
  select(indice_tiempo, tipo, plazas) |> 
  filter(indice_tiempo %in% c(2021, 2022))
# A tibble: 9,843 × 3
   indice_tiempo tipo             plazas
           <dbl> <chr>             <dbl>
 1          2021 Otros colectivos     30
 2          2021 Parahoteleros       277
 3          2021 Otros colectivos     50
 4          2021 Parahoteleros       131
 5          2021 Parahoteleros       164
 6          2021 Hoteleros            34
 7          2021 Hoteleros           135
 8          2021 Hoteleros            78
 9          2021 Hoteleros            60
10          2021 Parahoteleros        15
# ℹ 9,833 more rows

tidyverse en acción

df_puna |> 
  select(indice_tiempo, tipo, plazas) |> 
  filter(indice_tiempo %in% c(2021, 2022)) |> 
  mutate(tipo_recod = case_when(tipo == "Hoteleros" ~ "Hoteleros",
                                .default = "Otros"))
# A tibble: 9,843 × 4
   indice_tiempo tipo             plazas tipo_recod
           <dbl> <chr>             <dbl> <chr>     
 1          2021 Otros colectivos     30 Otros     
 2          2021 Parahoteleros       277 Otros     
 3          2021 Otros colectivos     50 Otros     
 4          2021 Parahoteleros       131 Otros     
 5          2021 Parahoteleros       164 Otros     
 6          2021 Hoteleros            34 Hoteleros 
 7          2021 Hoteleros           135 Hoteleros 
 8          2021 Hoteleros            78 Hoteleros 
 9          2021 Hoteleros            60 Hoteleros 
10          2021 Parahoteleros        15 Otros     
# ℹ 9,833 more rows

tidyverse en acción

df_puna |> 
  select(indice_tiempo, tipo, plazas) |> 
  filter(indice_tiempo %in% c(2021, 2022)) |> 
  mutate(tipo_recod = case_when(tipo == "Hoteleros" ~ "Hoteleros",
                                .default = "Otros")) |> 
  group_by(indice_tiempo, tipo_recod) |> 
  summarise(cant_plazas = sum(plazas),
            prom_plazas = mean(plazas))
# A tibble: 4 × 4
# Groups:   indice_tiempo [2]
  indice_tiempo tipo_recod cant_plazas prom_plazas
          <dbl> <chr>            <dbl>       <dbl>
1          2021 Hoteleros       454631        264.
2          2021 Otros           325419        102.
3          2022 Hoteleros       455702        264.
4          2022 Otros           324575        101.

tidyverse en acción