MANUAL DE REFERENCIA DE LA ASIGNATURA

Para explicar todo el temario de la asignatura de AED sigo el manual: Introducción al Análisis Exploratorio de Datos. Aplicaciones con R y datos reales.

Clica sobre la imagen para acceder a la web del libro

7.2. Mutating joins

Hay 4 tipos de mutating joins. Su sintaxis es idéntica, sólo se diferencian en que las filas que se seleccionan dependen del criterio para hacer el match:

  • inner_join(df1,df2): Devuelve todas las columnas de df1 y también las de df2, PERO solo devuelve las filas de df1 que tienen una equivalencia en df2. (la equivalencia se define en función del valor de una variable o variables comunes en df1 y df2).


  • left_join(df1,df2): Devuelve todas las columnas de df1 y también las de df2; en cuanto a las filas, devuelve TODAS las filas de df1. (Si hubiesen varios matches entre df1 y df2 se devuelven todas las combinaciones!!!!)

  • rigth_join(df1,df2): Retorna todas las columnas de df1 y también las de df2; en cuanto a las filas, devuelve TODAS las filas de df2. De df2!! (Si hubiesen varios matches entre df1 y df2 se devuelven todas las combinaciones!!!!)

  • full_join(df1,df2): Devuelve todas las columnas de df1 y también las de df2; en cuanto a las filas, devuelve TODAS las filas de df1 y de df2. Es decir, devuelve TODAS las filas y TODAS las columnas de las 2 tablas. (Donde no hay matches devuelve NA’s)

Una representación gráfica para ilustrar los comentarios anteriores:

Vamos a trabajar las mutating joins a partir de los siguientes 2 dataframes (tibbles en realidad). Los ejemplos son de Hadley.

# como tenemos muchos objetos en el entorno, primero lo vamos a limpiar todo.
rm(list=ls())
(df1 <- data_frame(x = c(1, 2), y = 2:1))
## # A tibble: 2 × 2
##       x     y
##   <dbl> <int>
## 1     1     2
## 2     2     1
(df2 <- data_frame(x = c(1, 3), a = 10, b = "a"))
## # A tibble: 2 × 3
##       x     a b    
##   <dbl> <dbl> <chr>
## 1     1    10 a    
## 2     3    10 a

Inner Join:

#- inner_join(df1, df2) 
#- solo va a incluir observaciones que se encuentran tanto en el df1 como en el df2.
df_inner <- inner_join(df1, df2)
df_inner
## # A tibble: 1 × 4
##       x     y     a b    
##   <dbl> <int> <dbl> <chr>
## 1     1     2    10 a

Left Join:

#- left_join(df1, df2) 
#- incluye todas las observaciones del df1, tanto si están o no en el df2 
#- ES EL TIO DE JOIN MÁS USADO (asegura que no perdemos observaciones de la tabla primaria).
df_left_join <- left_join(df1, df2)
df_left_join
## # A tibble: 2 × 4
##       x     y     a b    
##   <dbl> <int> <dbl> <chr>
## 1     1     2    10 a    
## 2     2     1    NA <NA>

Right Joint:

#- right_join(df1, df2) 
#- incluye todas las observaciones de df2. 
#- es equivalente a left_join(df2, df1), pero las columnas se ordenan de forma diferente
df_right_join <- right_join(df1, df2)
df_right_join
## # A tibble: 2 × 4
##       x     y     a b    
##   <dbl> <int> <dbl> <chr>
## 1     1     2    10 a    
## 2     3    NA    10 a

Full Joint:

#- full_join() incluye todas las observaciones del df1 y del df2
df_full_join <- full_join(df1, df2)
df_full_join
## # A tibble: 3 × 4
##       x     y     a b    
##   <dbl> <int> <dbl> <chr>
## 1     1     2    10 a    
## 2     2     1    NA <NA> 
## 3     3    NA    10 a


Comentario adicional sobre las mutating joins

Las (left, right and full) joins se llaman colectivamente como “outer joins”. Cuando una fila no tiene match en una outer join, las nuevas variables que se crean se llenan con NA’s.

Las mutating joins se usan principalmente para añadir columnas, PERO en el proceso pueden generarse nuevas filas: si un match no es único, se añadirán todas las combinaciones posibles (el producto cartesiano) de las matching observations. Veamos un ejemplo con una left_join:

(df1 <- data_frame(x = c(1, 1, 2), y = 1:3))
## # A tibble: 3 × 2
##       x     y
##   <dbl> <int>
## 1     1     1
## 2     1     2
## 3     2     3
(df2 <- data_frame(x = c(1, 1, 2), z = c("a", "b", "a")))
## # A tibble: 3 × 2
##       x z    
##   <dbl> <chr>
## 1     1 a    
## 2     1 b    
## 3     2 a
df_left_join <- left_join(df1, df2)
df_left_join
## # A tibble: 5 × 3
##       x     y z    
##   <dbl> <int> <chr>
## 1     1     1 a    
## 2     1     1 b    
## 3     1     2 a    
## 4     1     2 b    
## 5     2     3 a