class: center, middle, titular background-size: contain <img style="border-radius: 50%;" src="img/masapp.jpg" width="250px"/> # Capítulo 2: Datos Relacionales con `dplyr` ## **CAPACITACIÓN** #### LINDA CABRERA ORELLANA #### Mayo, 2023 --- .pull-left[ # Contenido del Capítulo 2 - Datos relacionales con `dplyr` * Mutating joins * Filtering joins * Set operations - Práctica 4 ] .pull-right[ # Paquetes a utilizar *
`library(tidyverse)` *
`library(dplyr)` *
`library(readr)` *
`library(readxl)` ] --- class: middle, center, inverse
# Datos Relacionales con `dplyr` --- ## Datos relacionales con `dplyr` .pull-left[La mayor parte del tiempo, nos vienen muchas tablas de información que debemos combinar para responder a nuestras preguntas de interés, a esto se le llama **datos relacionales**. Para trabajar con datos relacionales necesitas verbos que funcionen con pares de tablas y para esto existen tres familias de verbos diseñadas para trabajar con datos relacionales que son las 1) **uniones de transformación** (_mutating joins_), 2) **uniones de filtro** (_filtering joins_) y 3) **operaciones de conjuntos** (_set operations_). El lugar más común para encontrar datos relacionales es en un **sistema relacional de administración de bases de datos** (_Relational Data Base Management System_ en inglés), un concepto que abarca casi todas las bases de datos modernas. ] .pull-right[Una de las formas de mostrar las relaciones entre las diferentes tablas es mediante un diagrama: <img src="img/diagrama.png" width="100%" style="display: block; margin: auto;" /> ] --- ## Mutating joins Las **uniones de transformación** (del inglés _mutating joins_) agregan nuevas variables a un data frame a partir de las observaciones coincidentes en otra tabla. En las uniones de transformación tenemos algunos tipos de uniones: <div class="figure" style="text-align: center"> <img src="img/mutating.png" alt="Figura 3. Tipos de mutating joins" width="100%" /> <p class="caption">Figura 3. Tipos de mutating joins</p> </div> --- ## Mutating joins Para entender el `inner_join`, `left_join()`, `right_join()` y `full_join()`, vamos a crear los siguientes data frames: .pull-left[ ```r df_1 <- data.frame(Nombre= c('Belén', 'Noé', 'Salvador', 'Anne', 'Pablo', 'Rafaela', 'Victoria'), Edad = c(22,18,21,26,25,23,21), Ciudad= factor(c('Gye', 'Uio', 'Cue', 'Gye', 'Cue', 'Uio', 'Cue')) ) df_1 ## Nombre Edad Ciudad ## 1 Belén 22 Gye ## 2 Noé 18 Uio ## 3 Salvador 21 Cue ## 4 Anne 26 Gye ## 5 Pablo 25 Cue ## 6 Rafaela 23 Uio ## 7 Victoria 21 Cue ``` ] .pull-right[ ```r df_2 <- data.frame( A= c('Ana', 'Belén','Jose', 'Anne', 'Luis'), B= c(100,200,300,200,250), C= c('Soltera','Soltera','Casado','Divorciada','Soltero')) df_2 ## A B C ## 1 Ana 100 Soltera ## 2 Belén 200 Soltera ## 3 Jose 300 Casado ## 4 Anne 200 Divorciada ## 5 Luis 250 Soltero ``` ] --- ## Mutating joins .pull-left[ ### `inner_join()` Muestra las observaciones cuyas claves coinciden en ambos conjuntos de datos: ```r inner_join(df_1, df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad B C ## 1 Belén 22 Gye 200 Soltera ## 2 Anne 26 Gye 200 Divorciada ``` ] .pull-right[ ### `left_join()` Muestra las observaciones del conjunto de la izquierda pero añade los datos del conjunto de la derecha, coincidan o no coincidan. Si no coinciden, se agregan con NA. ```r left_join(df_1, df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad B C ## 1 Belén 22 Gye 200 Soltera ## 2 Noé 18 Uio NA <NA> ## 3 Salvador 21 Cue NA <NA> ## 4 Anne 26 Gye 200 Divorciada ## 5 Pablo 25 Cue NA <NA> ## 6 Rafaela 23 Uio NA <NA> ## 7 Victoria 21 Cue NA <NA> ``` ] --- ## Mutating joins .pull-left[ ### `right_join()` Muestra las observaciones del conjunto de la derecha pero añade los datos del conjunto de la izquierda, coincidan o no coincidan. Si no coinciden, se agregan con NA. ```r right_join(df_1, df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad B C ## 1 Belén 22 Gye 200 Soltera ## 2 Anne 26 Gye 200 Divorciada ## 3 Ana NA <NA> 100 Soltera ## 4 Jose NA <NA> 300 Casado ## 5 Luis NA <NA> 250 Soltero ``` ] .pull-right[ ### `full_join()` Muestra las observaciones de ambos conjuntos de datos, cuando los datos no coinciden, se agregan con NA. ```r full_join(df_1, df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad B C ## 1 Belén 22 Gye 200 Soltera ## 2 Noé 18 Uio NA <NA> ## 3 Salvador 21 Cue NA <NA> ## 4 Anne 26 Gye 200 Divorciada ## 5 Pablo 25 Cue NA <NA> ## 6 Rafaela 23 Uio NA <NA> ## 7 Victoria 21 Cue NA <NA> ## 8 Ana NA <NA> 100 Soltera ## 9 Jose NA <NA> 300 Casado ## 10 Luis NA <NA> 250 Soltero ``` ] --- ## Filtering joins Las **uniones de filtro** (del inglés _filtering joins_) filtran observaciones en un data frame con base en si coinciden o no con una observación de otra tabla. .pull-left[ ### `semi_join()` Muestra las observaciones del conjunto de la izquierda que tiene coincidencias con el conjunto de la derecha: ```r semi_join(df_1, df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad ## 1 Belén 22 Gye ## 2 Anne 26 Gye ``` ] .pull-right[ ### `anti_join()` Muestra las observaciones del conjunto de la izquierda que no tiene coincidencias con el conjunto de la derecha: ```r anti_join(df_1, df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad ## 1 Noé 18 Uio ## 2 Salvador 21 Cue ## 3 Pablo 25 Cue ## 4 Rafaela 23 Uio ## 5 Victoria 21 Cue ``` ] --- ## Set operations Las **operaciones de conjuntos** (del inglés _set operations_) tratan las observaciones como elementos de un conjunto. Las comparaciones se realizan entre conjuntos que contengan las mismas columnas, pues se revisa cómo difieren las observaciones entre los conjuntos, para esto, revisaremos las funciones `intersect()`, `union()` y `setdiff()`. Para ejemplificar esta parte crearemos el data.frame `df3`. .pull-left[ ```r df_3 <- data.frame(Nombre= c('Belén', 'Noé', 'María', 'Anne', 'Pablo'), Edad = c(22,18,21,26,25), Ciudad= factor(c('Cue', 'Uio', 'Cue', 'Gye', 'Cue'))) df_3 ## Nombre Edad Ciudad ## 1 Belén 22 Cue ## 2 Noé 18 Uio ## 3 María 21 Cue ## 4 Anne 26 Gye ## 5 Pablo 25 Cue ``` ] .pull-right[ ### `intersect()` Devuelve las observaciones comunes entre ambos conjuntos. ```r intersect(df_1, df_3) ## Nombre Edad Ciudad ## 1 Noé 18 Uio ## 2 Anne 26 Gye ## 3 Pablo 25 Cue ``` ] --- ## Set operations .pull-left[ ### `union()` Devuelve las observaciones únicas en ambos conjuntos, es decir que no see repiten en ningun de los dos conjuntos. ```r union(df_1, df_3) ## Nombre Edad Ciudad ## 1 Belén 22 Gye ## 2 Noé 18 Uio ## 3 Salvador 21 Cue ## 4 Anne 26 Gye ## 5 Pablo 25 Cue ## 6 Rafaela 23 Uio ## 7 Victoria 21 Cue ## 8 Belén 22 Cue ## 9 María 21 Cue ``` ] .pull-right[ ### `setdiff()` Devuelve las observaciones en el primer conjunto pero que son diferentes del segundo conjunto. ```r setdiff(df_1, df_3) ## Nombre Edad Ciudad ## 1 Belén 22 Gye ## 2 Salvador 21 Cue ## 3 Rafaela 23 Uio ## 4 Victoria 21 Cue ``` ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 4 --- #
Práctica: ¡10 minutos! .pull-left[ <img src="img/relacionales_ventas.png" width="90%" style="display: block; margin: auto;" /> ] .pull-right[ 1. Cargue a R, la hoja `ciiu_1level` del archivo denominado `CIIU.xls`. _CIIU_ es la Clasificación Nacional de Actividades Económicas. 2. ¿Qué join necesitamos realizar en nuestros datos `ventas` para que aparezca el nombre del tipo de actividad? Efectúelo. ] --- class: middle, center, inverse <br> <br> # Datos Relacionales con `dplyr` ## **CAPÍTULO 2** <br> <br> .center[ ### [@MasappEC
](https://www.facebook.com/MasappEC/) ### [@Masappdata
](https://twitter.com/Masappdata) ]