class: center, middle, inverse, title-slide # Datos Relacionales ## con dplyr ### Patricia A. Loto (馃惁
@patriloto
) ### 02/05/2020 --- # 驴Qu茅 vamos a aprender? 1. Tipos de claves: primaria, for谩nea y subrogada 1. 驴Qu茅 es una relaci贸n? 1. Uniones de transformaci贸n 1. Uniones de filtrado 1. Operaciones con conjuntos --- class: inverse, center,bottom background-image: url("largada.jpg") background-size:cover ## 隆Empecemos! --- class: inverse, center, middle ## Motivaci贸n #### En la vida real es raro que un an谩lisis de datos involucre una 煤nica tabla de datos, por el contrario necesitaremos trabajar con m谩s de un dataset, por lo que ser谩 de suma utilidad aprender a unir dos o m谩s tablas. Para esto, aprenderemos los conjuntos de verbos que facilitan las **uniones** o **JOINS**. --- class: inverse, center, top color-text:black background-image: url("vuelos.jpg") background-size:cover ## Dataset #### Usaremos los datos sobre vuelos desde y hacia la ciudad de Nueva York, incluidos en el paquete **datos**, para aprender sobre datos relacionales. El paquete **datos** contiene cuatro tablas que se relacionan con la tabla `vuelos`: --- class: inverse, center, top background-image: url("aeropuertos.jpg") background-size:cover ### Aeropuertos ### Contiene informaci贸n de cada aeropuerto, identificado por su c贸digo. --- # aeropuertos ``` Observations: 1,458 Variables: 8 $ codigo_aeropuerto <chr> "04G", "06A", "06C", "06N", "09J", "0A9", "0G6", ... $ nombre <chr> "Lansdowne Airport", "Moton Field Municipal Airpo... $ latitud <dbl> 41.13047, 32.46057, 41.98934, 41.43191, 31.07447,... $ longitud <dbl> -80.61958, -85.68003, -88.10124, -74.39156, -81.4... $ altura <dbl> 1044, 264, 801, 523, 11, 1593, 730, 492, 1000, 10... $ zona_horaria <dbl> -5, -6, -6, -5, -5, -5, -5, -5, -5, -8, -5, -6, -... $ horario_verano <chr> "A", "A", "A", "A", "A", "A", "A", "A", "U", "A",... $ zona_horaria_iana <chr> "America/New_York", "America/Chicago", "America/C... ``` --- class: inverse, center, top background-image: url("aerolineas.jpg") background-size:cover ## Aerol铆neas --- # aerolineas #### Permite observar el nombre completo de la aerol铆nea a partir de su c贸digo abreviado. ``` Observations: 16 Variables: 2 $ aerolinea <chr> "9E", "AA", "AS", "B6", "DL", "EV", "F9", "FL", "HA", "MQ... $ nombre <chr> "Endeavor Air Inc.", "American Airlines Inc.", "Alaska Ai... ``` --- class: inverse, left, top background-image: url("aviones.jpg") background-size:cover ## Aviones ### Entrega informaci贸n de cada avi贸n, identificado por su codigo_cola. --- # aviones ``` Observations: 3,322 Variables: 9 $ codigo_cola <chr> "N10156", "N102UW", "N103US", "N104UW", "N10575", "N105... $ anio <int> 2004, 1998, 1999, 1999, 2002, 1999, 1999, 1999, 1999, 1... $ tipo <chr> "Fixed wing multi engine", "Fixed wing multi engine", "... $ fabricante <chr> "EMBRAER", "AIRBUS INDUSTRIE", "AIRBUS INDUSTRIE", "AIR... $ modelo <chr> "EMB-145XR", "A320-214", "A320-214", "A320-214", "EMB-1... $ motores <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2... $ asientos <int> 55, 182, 182, 182, 55, 182, 182, 182, 182, 182, 55, 55,... $ velocidad <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,... $ tipo_motor <chr> "Turbo-fan", "Turbo-fan", "Turbo-fan", "Turbo-fan", "Tu... ``` --- class: inverse, center, bottom background-image: url("clima.jpg") background-size:cover ## Clima ### Entrega informaci贸n del clima en cada aeropuerto de Nueva York para cada hora. --- # clima ``` Observations: 26,115 Variables: 15 $ origen <chr> "EWR", "EWR", "EWR", "EWR", "EWR", "EWR", "EWR", "... $ anio <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 20... $ mes <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,... $ dia <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,... $ hora <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16,... $ temperatura <dbl> 39.02, 39.02, 39.02, 39.92, 39.02, 37.94, 39.02, 3... $ punto_rocio <dbl> 26.06, 26.96, 28.04, 28.04, 28.04, 28.04, 28.04, 2... $ humedad <dbl> 59.37, 61.63, 64.43, 62.21, 64.43, 67.21, 64.43, 6... $ direccion_viento <dbl> 270, 250, 240, 250, 260, 240, 240, 250, 260, 260, ... $ velocidad_viento <dbl> 10.35702, 8.05546, 11.50780, 12.65858, 12.65858, 1... $ velocidad_rafaga <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA... $ precipitacion <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,... $ presion <dbl> 1012.0, 1012.3, 1012.5, 1012.2, 1011.9, 1012.4, 10... $ visibilidad <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10... $ fecha_hora <dttm> 2013-01-01 01:00:00, 2013-01-01 02:00:00, 2013-01... ``` --- # Relaciones * Recordemos que, se llaman **datos relacionales** a m煤ltiples tablas de datos, ya que no solo importan los conjuntos de datos individuales, sino que tambi茅n sus relaciones son importantes. -- * Una **clave primaria** y su correspondiente **clave for谩nea** en otra tabla forman una relaci贸n. -- * Las **relaciones** siempre se definen sobre un par de tablas. Todas las otras relaciones se construyen sobre esta idea simple: las relaciones entre tres o m谩s tablas son siempre una propiedad de las relaciones entre cada par. --- # Relaciones Diagrama de relaciones entre las diferentes tablas del dataset **vuelos**: <img src="relational-nycflights.svg" width="60%" style="display: block; margin: auto;" /> * `vuelos` se conecta con `aviones` a trav茅s de la variable `codigo_cola` * `vuelos` se conecta con `aerolineas` a trav茅s de la variable `codigo_carrier`. * `vuelos` se conecta con `aeropuertos` de dos formas: a trav茅s de las variables `origen` y `destino`. * `vuelos` se conecta con `clima` a trav茅s de las variables origen (es decir,la ubicaci贸n) m谩s `anio`, `mes`, `dia` y `hora`. --- # Claves * Las variables usadas para conectar cada par de variables se llaman **claves** (del ingl茅s _key_). * Una clave es una variable (o un conjunto de variables) que identifican de manera 煤nica una observaci贸n. * En casos simples, una sola variable es suficiente para identificar una observaci贸n. **Ejemplo**: cada avi贸n est谩 identificado de forma 煤nica por su `codigo_cola`. * En otros casos, se pueden necesitar m煤ltiples variables. **Ejemplo**, para identificar una observaci贸n en `clima` se necesitan cinco variables: `anio`, `mes`, `dia`, `hora` y `origen`. --- # Claves Existen diferentes tipos de claves: * Una **clave primaria** identifica 煤nicamente una observaci贸n en su propia tabla. Por ejemplo, `codigo_cola` es una clave primaria, ya que identifica de manera 煤nica cada avi贸n en la tabla `aviones`. * Una **clave for谩nea** identifica de manera 煤nica una observaci贸n en otra tabla. Por ejemplo, `vuelos$codigo_cola` es una clave for谩nea, ya que aparece en la tabla `vuelos`, y une cada vuelo con un 煤nico avi贸n. * Una **clave subrogada**, es aquella que tiene como 煤nico requisito almacenar un valor num茅rico 煤nico para cada fila de la tabla, el cual es totalmente independiente a los datos de negocio. **Importante:** Una variable puede ser clave primaria y clave for谩nea a la vez. Por ejemplo, `origen` es parte de la clave primaria de la tabla `clima` y tambi茅n una clave for谩nea de la tabla `aeropuertos`, es decir, permite que el `clima` se relacione con un determinado aeropuerto. --- class: inverse, center, middle background-image: url("soga1.jpg") background-size:cover ### JOINS --- #Joins #### Una uni贸n es una forma de conectar cada fila en x con cero, una o m谩s filas en y. Familias de verbos para trabajar entre pares de tablas: 1. **__Uniones de transformaci贸n__** (del ingl茅s **_mutating joins_**), las cuales agregan nuevas variables a un *data frame* a partir de las observaciones coincidentes en otra tabla. 1. **__Uniones de filtro__** (del ingl茅s **_filtering joins_**), las cuales filtran observaciones en un *data frame* con base en si coinciden o no con una observaci贸n de otra tabla. 1. **__Operaciones de conjuntos__** (del ingl茅s **_set operations_**), las cuales tratan las observaciones como elementos de un conjunto. --- #Joins #### Sintaxis: `tabla1` %>% **TIPO_DE_UNION** (`tabla2`, **by** = "key") donde *TIPO_DE_UNION* puede ser: * inner_join * left_join * right_join * full_join * anti_join * semi_join **by** (seg煤n) le indica a dplyr qu茅 variable es la clave con la que se realizar谩 la uni贸n. --- # Uniones de transformaci贸n La **__uni贸n de transformaci贸n__** o **_mutating join_** permite combinar variables a partir de dos tablas. -- #### 1. Busca coincidencias de observaciones entre ambas tablas de acuerdo a su/s clave/s -- #### 2. Luego, copia las variables de una tabla a la otra. #### Principalmente, existen dos tipos de uni贸n: .pull-left[ #### **uni贸n interior** ----------------------------- mantiene las observaciones que aparecen en ambas tablas. ] .pull-right[ #### **uni贸n exterior** ----------------------------- mantiene las observaciones que aparecen en al menos una de las tablas ] --- # Uniones de transformaci贸n Las funciones de uni贸n, tal como `mutate()`, agregan variables hacia la derecha, por lo que si tienes muchas variables inicialmente, las nuevas variables no se imprimir谩n. Por lo tanto, crearemos un conjunto de datos m谩s angosto para que sea m谩s f谩cil ver qu茅 es lo que est谩 ocurriendo: ```r vuelos2 <- vuelos %>% select (anio:dia, hora, origen, destino, codigo_cola, aerolinea) %>% head(7) vuelos2 ``` ``` # A tibble: 7 x 8 anio mes dia hora origen destino codigo_cola aerolinea <int> <int> <int> <dbl> <chr> <chr> <chr> <chr> 1 2013 1 1 5 EWR IAH N14228 UA 2 2013 1 1 5 LGA IAH N24211 UA 3 2013 1 1 5 JFK MIA N619AA AA 4 2013 1 1 5 JFK BQN N804JB B6 5 2013 1 1 6 LGA ATL N668DN DL 6 2013 1 1 5 EWR ORD N39463 UA 7 2013 1 1 6 EWR FLL N516JB B6 ``` --- # Entendiendo las uniones de transformaci贸n Una **uni贸n exterior** mantiene las observaciones que aparecen en al menos una de las tablas. Existen tres tipos de uniones exteriores: * Una **uni贸n izquierda (left join)** mantiene todas las observaciones en x. * Una **uni贸n derecha (right join)** mantiene todas las observaciones en y. * Una **uni贸n completa (full join)** mantiene todas las observaciones en x e y. --- # Representaci贸n gr谩fica de las uniones exteriores <img src="join-outer.svg" width="40%" style="display: block; margin: auto;" /> --- # Uni贸n por izquierda Queremos incluir el nombre completo de la aerol铆nea en la tabla `vuelos2`. ####驴C贸mo lo hacemos? -- Combinamos los datos de `vuelos2` y `aerolineas` -- con un `left_join()` (*union_izquierda*): ```r union_tablas <- vuelos2 %>% * left_join (aerolineas, by = "aerolinea") ``` --- # Uni贸n por izquierda El resultado de unir `vuelos2` y `aerolineas` es la inclusi贸n de una variable adicional, `nombre` en la primera tabla. Por esta raz贸n llamamos uni贸n de transformaci贸n a este tipo de uni贸n. ``` # A tibble: 7 x 9 anio mes dia hora origen destino codigo_cola aerolinea nombre <int> <int> <int> <dbl> <chr> <chr> <chr> <chr> <chr> 1 2013 1 1 5 EWR IAH N14228 UA United Air Lines~ 2 2013 1 1 5 LGA IAH N24211 UA United Air Lines~ 3 2013 1 1 5 JFK MIA N619AA AA American Airline~ 4 2013 1 1 5 JFK BQN N804JB B6 JetBlue Airways 5 2013 1 1 6 LGA ATL N668DN DL Delta Air Lines ~ 6 2013 1 1 5 EWR ORD N39463 UA United Air Lines~ 7 2013 1 1 6 EWR FLL N516JB B6 JetBlue Airways ``` --- class: inverse, center, top background-image: url("banda1.jpg") background-size:cover # Dataset bandas --- # Tablas .pull-left[ ```r dplyr::band_members ``` ``` # A tibble: 3 x 2 name band <chr> <chr> 1 Mick Stones 2 John Beatles 3 Paul Beatles ``` ] .pull-right[ ```r dplyr::band_instruments ``` ``` # A tibble: 3 x 2 name plays <chr> <chr> 1 John guitar 2 Paul bass 3 Keith guitar ``` ] <img src="tablas_banda_instrumento.png" width="100%" style="display: block; margin: auto 0 auto auto;" /> --- # Uni贸n interna o Inner Join ```r *band_members %>% inner_join(band_instruments) ``` ``` # A tibble: 2 x 3 name band plays <chr> <chr> <chr> 1 John Beatles guitar 2 Paul Beatles bass ``` En algunos casos, no es necesario especificar la clave por la cual se realizar谩 la uni贸n. <img src="inner_join_banda_instrumento.png" width="80%" style="display: block; margin: auto;" /> **Importante:** La propiedad m谩s importante de una uni贸n interior es que las filas no coincidentes no se incluyen en el resultado. --- # Uni贸n izquierda ```r *band_members %>% left_join(band_instruments) ``` ``` # A tibble: 3 x 3 name band plays <chr> <chr> <chr> 1 Mick Stones <NA> 2 John Beatles guitar 3 Paul Beatles bass ``` <img src="left_join_banda_instrumento.png" width="100%" style="display: block; margin: auto 0 auto auto;" /> --- # Uni贸n derecha ```r *band_members %>% right_join(band_instruments) ``` ``` # A tibble: 3 x 3 name band plays <chr> <chr> <chr> 1 John Beatles guitar 2 Paul Beatles bass 3 Keith <NA> guitar ``` <img src="right_join_banda_instrumento.png" width="100%" style="display: block; margin: auto 0 auto auto;" /> --- # Full Join ```r *band_members %>% full_join(band_instruments) ``` ``` # A tibble: 4 x 3 name band plays <chr> <chr> <chr> 1 Mick Stones <NA> 2 John Beatles guitar 3 Paul Beatles bass 4 Keith <NA> guitar ``` <img src="full_join_banda_instrumento.png" width="100%" style="display: block; margin: auto;" /> --- # Diagramas de Venn Otra forma de ilustrar diferentes tipos de uniones es mediante un diagrama de Venn: <img src="join-venn.svg" width="100%" style="display: block; margin: auto;" /> * Son 煤tiles para recordar qu茅 uniones preservan las observaciones en qu茅 tabla * Tienen una limitante importante: un diagrama de Venn no puede mostrar qu茅 ocurre con las claves que no identifican de manera 煤nica una observaci贸n. --- # Uniones de filtrado Las **__Uniones de filtrado__** unen observaciones de la misma forma que las uniones de transformaci贸n pero afectan a las observaciones, no a las variables.Adem谩s, uniones de filtro no duplican filas como lo hacen las uniones de transformaci贸n. ####Tipos: * **semi_join:** mantiene todas las observaciones en x con coincidencias en y. Las semi uniones son 煤tiles para unir tablas resumen previamente filtradas con las filas originales. * **anti_join:** descarta todas las observaciones en x con coincidencias en y. --- # Uniones de filtrado ### Semi Join ```r *band_members %>% semi_join(band_instruments) ``` ``` # A tibble: 2 x 2 name band <chr> <chr> 1 John Beatles 2 Paul Beatles ``` <img src="semi_join_banda_instrumento.png" width="100%" style="display: block; margin: auto;" /> --- # Uniones de filtrado ### Anti Join ```r *band_members %>% anti_join(band_instruments) ``` ``` # A tibble: 1 x 2 name band <chr> <chr> 1 Mick Stones ``` <img src="anti_join_banda_instrumento.png" width="100%" style="display: block; margin: auto;" /> --- # Utilidad de las uniones de filtrado * Las **semi uniones** son 煤tiles para unir tablas resumen previamente filtradas con las filas originales. Buscamos cada vuelo que fue a alguno de los destinos m谩s populares: ```r vuelos %>% * semi_join(destinos_populares)%>% head(3) ``` ``` # A tibble: 3 x 19 anio mes dia horario_salida salida_programa~ atraso_salida <int> <int> <int> <int> <int> <dbl> 1 2013 1 1 554 600 -6 2 2013 1 1 554 558 -4 3 2013 1 1 557 600 -3 # ... with 13 more variables: horario_llegada <int>, llegada_programada <int>, # atraso_llegada <dbl>, aerolinea <chr>, vuelo <int>, codigo_cola <chr>, # origen <chr>, destino <chr>, tiempo_vuelo <dbl>, distancia <dbl>, # hora <dbl>, minuto <dbl>, fecha_hora <dttm> ``` --- # Utilidad de las uniones de filtrado * Las **anti uniones** son 煤tiles para encontrar desajustes. Por ejemplo, al conectar `aviones` y `vuelos`, podr铆a ser interesante saber que existen muchos `vuelos` que no tienen coincidencias en `aviones`: ```r vuelos %>% * anti_join(aviones, by = "codigo_cola") %>% count(codigo_cola, sort = TRUE)%>% head(6) ``` ``` # A tibble: 6 x 2 codigo_cola n <chr> <int> 1 <NA> 2512 2 N725MQ 575 3 N722MQ 513 4 N723MQ 507 5 N713MQ 483 6 N735MQ 396 ``` --- # Operaciones de conjuntos Tratan las observaciones como elementos de un conjunto. * `intersect(x, y)`: devuelve las observaciones comunes en x e y. * `union(x, y)`: devuelve las observaciones 煤nicas en x e y. * `setdiff(x, y)`: devuelve las observaciones en x pero no en y. **Ejemplo:** ```r df1 <- tribble( ~x, ~y, 1, 1, 2, 1 ) df2 <- tribble( ~x, ~y, 1, 1, 1, 2 ) ``` --- # Operaciones de conjuntos Las cuatro posibilidades son: ```r intersect(df1, df2) ``` ``` # A tibble: 1 x 2 x y <dbl> <dbl> 1 1 1 ``` ```r union(df1, df2) ``` ``` # A tibble: 3 x 2 x y <dbl> <dbl> 1 1 1 2 2 1 3 1 2 ``` --- # Operaciones de conjuntos ```r setdiff(df1, df2) ``` ``` # A tibble: 1 x 2 x y <dbl> <dbl> 1 2 1 ``` ```r setdiff(df2, df1) ``` ``` # A tibble: 1 x 2 x y <dbl> <dbl> 1 1 2 ``` --- class: inverse, center, middle background-image: url("marvel.jpg") background-size:cover ## Otros Ejemplos ### Dataset superh茅roes y editoriales --- ## Tabla Superh茅roes ```r superheroes <- tibble::tribble( ~name, ~alignment, ~gender, ~publisher, "Magneto", "bad", "male", "Marvel", "Storm", "good", "female", "Marvel", "Mystique", "bad", "female", "Marvel", "Batman", "good", "male", "DC", "Joker", "bad", "male", "DC", "Catwoman", "bad", "female", "DC", "Hellboy", "good", "male", "Dark Horse Comics" ) ``` <table> <thead> <tr> <th style="text-align:left;"> name </th> <th style="text-align:left;"> alignment </th> <th style="text-align:left;"> gender </th> <th style="text-align:left;"> publisher </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Magneto </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> Marvel </td> </tr> <tr> <td style="text-align:left;"> Storm </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> Marvel </td> </tr> <tr> <td style="text-align:left;"> Mystique </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> Marvel </td> </tr> <tr> <td style="text-align:left;"> Batman </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> DC </td> </tr> <tr> <td style="text-align:left;"> Joker </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> DC </td> </tr> <tr> <td style="text-align:left;"> Catwoman </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> DC </td> </tr> <tr> <td style="text-align:left;"> Hellboy </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> Dark Horse Comics </td> </tr> </tbody> </table> --- ## Tabla editoriales ```r publishers <- tibble::tribble( ~publisher, ~yr_founded, "DC", 1934L, "Marvel", 1939L, "Image", 1992L ) ``` <table> <thead> <tr> <th style="text-align:left;"> publisher </th> <th style="text-align:right;"> yr_founded </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Image </td> <td style="text-align:right;"> 1992 </td> </tr> </tbody> </table> --- ## inner_join(superheroes, publishers) ```r *tabla_inner <- superheroes %>% inner_join (publishers) ``` <table> <thead> <tr> <th style="text-align:left;"> name </th> <th style="text-align:left;"> alignment </th> <th style="text-align:left;"> gender </th> <th style="text-align:left;"> publisher </th> <th style="text-align:right;"> yr_founded </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Magneto </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Storm </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Mystique </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Batman </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Joker </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Catwoman </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> </tbody> </table> --- ## full_join(superheroes, publishers) ```r *tabla_full <- superheroes %>% full_join (publishers) ``` <table> <thead> <tr> <th style="text-align:left;"> name </th> <th style="text-align:left;"> alignment </th> <th style="text-align:left;"> gender </th> <th style="text-align:left;"> publisher </th> <th style="text-align:right;"> yr_founded </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Magneto </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Storm </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Mystique </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Batman </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Joker </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Catwoman </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Hellboy </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> Dark Horse Comics </td> <td style="text-align:right;"> NA </td> </tr> <tr> <td style="text-align:left;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:left;"> Image </td> <td style="text-align:right;"> 1992 </td> </tr> </tbody> </table> --- ## left_join(superheroes, publishers) ```r *tabla_left <-superheroes %>% left_join (publishers) ``` <table> <thead> <tr> <th style="text-align:left;"> name </th> <th style="text-align:left;"> alignment </th> <th style="text-align:left;"> gender </th> <th style="text-align:left;"> publisher </th> <th style="text-align:right;"> yr_founded </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Magneto </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Storm </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Mystique </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> Marvel </td> <td style="text-align:right;"> 1939 </td> </tr> <tr> <td style="text-align:left;"> Batman </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Joker </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Catwoman </td> <td style="text-align:left;"> bad </td> <td style="text-align:left;"> female </td> <td style="text-align:left;"> DC </td> <td style="text-align:right;"> 1934 </td> </tr> <tr> <td style="text-align:left;"> Hellboy </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> Dark Horse Comics </td> <td style="text-align:right;"> NA </td> </tr> </tbody> </table> --- ## anti_join(superheroes, publishers) ```r *tabla_anti <- superheroes %>% anti_join (publishers) ``` <table> <thead> <tr> <th style="text-align:left;"> name </th> <th style="text-align:left;"> alignment </th> <th style="text-align:left;"> gender </th> <th style="text-align:left;"> publisher </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Hellboy </td> <td style="text-align:left;"> good </td> <td style="text-align:left;"> male </td> <td style="text-align:left;"> Dark Horse Comics </td> </tr> </tbody> </table> --- ## Fuentes: * [R para Ciencia de datos](http://r4ds.had.co.nz/) * [Primers de Rstudio](https://rstudio.cloud/learn/primers/4.3) * [Gu铆a de referencia](https://dplyr.tidyverse.org/reference/join.html) * Slides de [Robust tools](https://github.com/gnab/remark/issues/142) de [Danielle Navarro](https://twitter.com/djnavarro). * [STAT 545 - Chapter 15](https://stat545.com/join-cheatsheet.html) de [Jenny Bryan](https://twitter.com/JennyBryan) ------------------------------------------------- 鉃★笍 Las slides fueron creadas con el paquete de R [**xaringan**](https://github.com/yihui/xaringan), utilizando el css propio [summer_light](https://github.com/PatriLoto/datos_relaciones_con_dplyr/blob/master/summer_light.css). 鉃★笍 Las im谩genes fueron tomadas de [Unplash](https://unplash.com).