class: center, middle .linea-superior[] .linea-inferior[] <img src="imagenes/logo_super_portada.png" width="180" /> # Curso Capacitación en R ## Sesión 3 ## Bases de datos 1 (tratamiento y análisis) ### Junio 2025 --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Introducción a bases de datos -- En honor al trabajo nacional, exploraremos una base de datos creada por Riva Quiroga, lingüista chilena y activa participante de LatinR y R-Ladies. Este paquete se llama `guaguas` ya instalado al principio de la sesión. -- Dado que ya instalamos el paquete, ahora **solo debemos cargarlo**. ``` r library("guaguas") ``` -- Este paquete consiste en proveer *Datos sobre nombres de guaguas (bebés) registrados en Chile entre 1920 y 2021, según el Servicio de Registro Civil e Identificación. Incluye solo los que fueron inscritos como primer nombre. Este dataset permite explorar tendencias en los nombres registrados durante el último siglo y puede utilizarse como fuente de ejemplos para aprender/enseñar a trabajar con datos.* --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Introducción a bases de datos Exploremos la base `guaguas` con las siguientes funciones: -- - `View()` -- - `glimpse()` -- - `str()` -- - `class` -- - `dim()` -- - `names()` -- - Operador `$` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Indexación -- - Las bases de datos a diferencia de los vectores vistos en la sesión pasada se pueden conceptualizar como una estructura matricial donde sus columnas pueden ser de distinto tipo respecto a las otras. -- - Si tenemos el siguiente vector, lo podiamos indexar de la siguiente forma: ``` r vector_ejemplo <- c(-1,0,1) vector_ejemplo[3] ``` ``` ## [1] 1 ``` - ¿Qué ocurre si hacemos lo mismo con una base de datos? -- ``` r head(guaguas[3],3) ``` ``` ## # A tibble: 3 × 1 ## sexo ## <chr> ## 1 F ## 2 M ## 3 M ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Indexación -- ``` r head(guaguas[3,],3) ``` ``` ## # A tibble: 1 × 5 ## anio nombre sexo n proporcion ## <dbl> <chr> <chr> <dbl> <dbl> ## 1 1920 Juan M 636 0.0312 ``` -- ``` r head(guaguas[,3],3) ``` ``` ## # A tibble: 3 × 1 ## sexo ## <chr> ## 1 F ## 2 M ## 3 M ``` -- ``` r guaguas[1,4] ``` ``` ## # A tibble: 1 × 1 ## n ## <dbl> ## 1 2130 ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Indexación -- Para indexar data frames se incluyen dos vectores: el primero es el asociado a filas y el segundo es el asociado a las columnas. -- ``` r guaguas[1:5,c(2,4)] ``` ``` ## # A tibble: 5 × 2 ## nombre n ## <chr> <dbl> ## 1 María 2130 ## 2 José 984 ## 3 Juan 636 ## 4 Luis 631 ## 5 Rosa 426 ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- Para el tratamiento de bases de datos utilizaremos una de las librerías estándar en esta materia llamada `dplyr`. -- ``` r install.packages("dplyr") # Instala la librería ``` -- ``` r library(dplyr) # Carga la librería ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- Esta librería funciona asociando funciones relevantes a verbos. -- ### Verbos relevantes para FILAS - `filter()`: significa filtrar. Permite mantener (o quitar) filas según los valores de las columnas. El primer argumento es el data frame y los argumentos subsiguientes son las condiciones que se deben cumplir. -- ``` r filter(guaguas, nombre == "Nicolás") ``` ``` ## # A tibble: 105 × 5 ## anio nombre sexo n proporcion ## <dbl> <chr> <chr> <dbl> <dbl> ## 1 1920 Nicolás M 17 0.000834 ## 2 1921 Nicolás M 33 0.000715 ## 3 1922 Nicolás M 46 0.000946 ## 4 1923 Nicolás M 31 0.000612 ## 5 1924 Nicolás M 36 0.000650 ## 6 1925 Nicolás M 41 0.000711 ## 7 1926 Nicolás M 66 0.00108 ## 8 1927 Nicolás M 54 0.000764 ## 9 1928 Nicolás M 83 0.000875 ## 10 1929 Nicolás M 83 0.000908 ## # ℹ 95 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Verbos relevantes para FILAS - `arrange()`: significa ordenar. Permite cambiar el orden de las filas en base al valor de las columnas. Toma un data frame y un set de columnas a ordenar. -- ``` r arrange(guaguas, -anio, desc(n), nombre) ``` ``` ## # A tibble: 858,782 × 5 ## anio nombre sexo n proporcion ## <dbl> <chr> <chr> <dbl> <dbl> ## 1 2021 Mateo M 3267 0.0184 ## 2 2021 Emma F 2352 0.0132 ## 3 2021 Sofía F 2251 0.0126 ## 4 2021 Isabella F 2155 0.0121 ## 5 2021 Lucas M 2054 0.0115 ## 6 2021 Emilia F 2044 0.0115 ## 7 2021 Agustín M 1972 0.0111 ## 8 2021 Benjamín M 1935 0.0109 ## 9 2021 Agustina F 1816 0.0102 ## 10 2021 Santiago M 1809 0.0102 ## # ℹ 858,772 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Verbos relevantes para FILAS - `distinct()`: significa distinguir. Permite encontrar filas únicas en el data frame. -- ``` r distinct(guaguas) # Carga la librería ``` ``` ## # A tibble: 858,782 × 5 ## anio nombre sexo n proporcion ## <dbl> <chr> <chr> <dbl> <dbl> ## 1 1920 María F 2130 0.104 ## 2 1920 José M 984 0.0483 ## 3 1920 Juan M 636 0.0312 ## 4 1920 Luis M 631 0.0310 ## 5 1920 Rosa F 426 0.0209 ## 6 1920 Ana F 340 0.0167 ## 7 1920 Manuel M 326 0.0160 ## 8 1920 Olga F 289 0.0142 ## 9 1920 Carlos M 277 0.0136 ## 10 1920 Pedro M 269 0.0132 ## # ℹ 858,772 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Verbos relevantes para FILAS - `distinct()`: significa distinguir. Permite encontrar filas únicas en el data frame. -- ``` r distinct(guaguas, nombre, n) ``` ``` ## # A tibble: 333,772 × 2 ## nombre n ## <chr> <dbl> ## 1 María 2130 ## 2 José 984 ## 3 Juan 636 ## 4 Luis 631 ## 5 Rosa 426 ## 6 Ana 340 ## 7 Manuel 326 ## 8 Olga 289 ## 9 Carlos 277 ## 10 Pedro 269 ## # ℹ 333,762 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Verbos relevantes para FILAS - `distinct()`: significa distinguir. Permite encontrar filas únicas en el data frame. -- ``` r distinct(guaguas, nombre, n, .keep_all = TRUE) ``` ``` ## # A tibble: 333,772 × 5 ## anio nombre sexo n proporcion ## <dbl> <chr> <chr> <dbl> <dbl> ## 1 1920 María F 2130 0.104 ## 2 1920 José M 984 0.0483 ## 3 1920 Juan M 636 0.0312 ## 4 1920 Luis M 631 0.0310 ## 5 1920 Rosa F 426 0.0209 ## 6 1920 Ana F 340 0.0167 ## 7 1920 Manuel M 326 0.0160 ## 8 1920 Olga F 289 0.0142 ## 9 1920 Carlos M 277 0.0136 ## 10 1920 Pedro M 269 0.0132 ## # ℹ 333,762 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Verbos relevantes para COLUMNAS - `mutate()`: significa mutar. Permite añadir nuevas columnas en función de las columnas ya existentes. -- ``` r guaguas |> mutate(proporcion_porcentual = proporcion*100) ``` ``` ## # A tibble: 858,782 × 6 ## anio nombre sexo n proporcion proporcion_porcentual ## <dbl> <chr> <chr> <dbl> <dbl> <dbl> ## 1 1920 María F 2130 0.104 10.4 ## 2 1920 José M 984 0.0483 4.83 ## 3 1920 Juan M 636 0.0312 3.12 ## 4 1920 Luis M 631 0.0310 3.10 ## 5 1920 Rosa F 426 0.0209 2.09 ## 6 1920 Ana F 340 0.0167 1.67 ## 7 1920 Manuel M 326 0.0160 1.60 ## 8 1920 Olga F 289 0.0142 1.42 ## 9 1920 Carlos M 277 0.0136 1.36 ## 10 1920 Pedro M 269 0.0132 1.32 ## # ℹ 858,772 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Verbos relevantes para COLUMNAS - `select()`: significa seleccionar. Permite seleccionar variables, incluso con operaciones. -- ``` r guaguas |> select(anio,n,proporcion) ``` ``` ## # A tibble: 858,782 × 3 ## anio n proporcion ## <dbl> <dbl> <dbl> ## 1 1920 2130 0.104 ## 2 1920 984 0.0483 ## 3 1920 636 0.0312 ## 4 1920 631 0.0310 ## 5 1920 426 0.0209 ## 6 1920 340 0.0167 ## 7 1920 326 0.0160 ## 8 1920 289 0.0142 ## 9 1920 277 0.0136 ## 10 1920 269 0.0132 ## # ℹ 858,772 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Verbos relevantes para COLUMNAS - `rename()`: significa renombrar. Permite cambiar el nombre a variables, incluso con operaciones. -- ``` r guaguas |> rename(cantidad = n) ``` ``` ## # A tibble: 858,782 × 5 ## anio nombre sexo cantidad proporcion ## <dbl> <chr> <chr> <dbl> <dbl> ## 1 1920 María F 2130 0.104 ## 2 1920 José M 984 0.0483 ## 3 1920 Juan M 636 0.0312 ## 4 1920 Luis M 631 0.0310 ## 5 1920 Rosa F 426 0.0209 ## 6 1920 Ana F 340 0.0167 ## 7 1920 Manuel M 326 0.0160 ## 8 1920 Olga F 289 0.0142 ## 9 1920 Carlos M 277 0.0136 ## 10 1920 Pedro M 269 0.0132 ## # ℹ 858,772 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Verbos relevantes para COLUMNAS - `relocate()`: significa trasladar. Permite trasladar variables del data frame. -- ``` r guaguas |> relocate(nombre,sexo) ``` ``` ## # A tibble: 858,782 × 5 ## nombre sexo anio n proporcion ## <chr> <chr> <dbl> <dbl> <dbl> ## 1 María F 1920 2130 0.104 ## 2 José M 1920 984 0.0483 ## 3 Juan M 1920 636 0.0312 ## 4 Luis M 1920 631 0.0310 ## 5 Rosa F 1920 426 0.0209 ## 6 Ana F 1920 340 0.0167 ## 7 Manuel M 1920 326 0.0160 ## 8 Olga F 1920 289 0.0142 ## 9 Carlos M 1920 277 0.0136 ## 10 Pedro M 1920 269 0.0132 ## # ℹ 858,772 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Uso de pipes ``` r arrange( select( mutate( filter( guaguas, nombre == "Nicolás" ), proporcion_porcentual = proporcion*100 ), anio,nombre,proporcion_porcentual ), desc(anio) ) ``` ``` ## # A tibble: 105 × 3 ## anio nombre proporcion_porcentual ## <dbl> <chr> <dbl> ## 1 2021 Nicolás 0.461 ## 2 2020 Nicolás 0.502 ## 3 2019 Nicolás 0.539 ## 4 2018 Nicolás 0.570 ## 5 2017 Nicolás 0.558 ## 6 2016 Nicolás 0.664 ## 7 2015 Nicolás 0.595 ## 8 2014 Nicolás 0.613 ## 9 2014 Nicolás 0.000397 ## 10 2013 Nicolás 0.666 ## # ℹ 95 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Uso de pipes ``` r guaguas_1 <- filter(guaguas, nombre == "Nicolás") guaguas_1 <- mutate(guaguas_1, proporcion_porcentual = proporcion*100) guaguas_1 <- select(guaguas_1, anio,nombre,proporcion_porcentual) guaguas_1 <-arrange(guaguas_1,desc(anio)) guaguas_1 ``` ``` ## # A tibble: 105 × 3 ## anio nombre proporcion_porcentual ## <dbl> <chr> <dbl> ## 1 2021 Nicolás 0.461 ## 2 2020 Nicolás 0.502 ## 3 2019 Nicolás 0.539 ## 4 2018 Nicolás 0.570 ## 5 2017 Nicolás 0.558 ## 6 2016 Nicolás 0.664 ## 7 2015 Nicolás 0.595 ## 8 2014 Nicolás 0.613 ## 9 2014 Nicolás 0.000397 ## 10 2013 Nicolás 0.666 ## # ℹ 95 more rows ``` --- background-image: url("imagenes/background.png") background-size: contain; background-position: 50% 0% # Tratamiento -- ### Operador Pipe |> -- El operador pipe (de tubería o tubo) `|>` toma lo que tiene a la izquierda y lo pasa a la función a su derecha. La forma más fácil de verbalizarlo es utilizando la palabra **dado `\(x\)` entonces**. ``` r guaguas_nicolas <- guaguas |> filter(nombre == "Nicolás") |> mutate(proporcion_porcentual = proporcion*100) |> select(anio,nombre,proporcion_porcentual) |> arrange(desc(anio)) guaguas_nicolas ``` ``` ## # A tibble: 105 × 3 ## anio nombre proporcion_porcentual ## <dbl> <chr> <dbl> ## 1 2021 Nicolás 0.461 ## 2 2020 Nicolás 0.502 ## 3 2019 Nicolás 0.539 ## 4 2018 Nicolás 0.570 ## 5 2017 Nicolás 0.558 ## 6 2016 Nicolás 0.664 ## 7 2015 Nicolás 0.595 ## 8 2014 Nicolás 0.613 ## 9 2014 Nicolás 0.000397 ## 10 2013 Nicolás 0.666 ## # ℹ 95 more rows ```