6.1 Uniones para mutar

Los mutating joins nos sirven para incrementar nuestro número de variables en un data frame, por lo tanto, lo mutan. La elección del join que queremos usar, depende de las observaciones que deseamos preservar. En dplyr existen cuatro tipos de mutating joins:

  • left_join(): preserva todas las observaciones y variables del primer data frame y añade las variables del segundo en las observaciones donde encuentra coincidencias. Si una observación del primer data frame no tiene coincidencia en el segundo, las variables se añadirán con valores NA.
  • right_join(): La contraparte del left_join(). Aquí se preservan todas las observaciones del segundo data frame.
  • inner_join(): solamente preserva las observaciones que coinciden en ambos data frames añadiendo las variables de ambos.
  • full_join(): Se preservan todas las observaciones en ambos data frames.

En las imagen, las observaciones coincidentes en los data frames están están unidas por una línea.

Tipos de joins. Imagen tomada de: Joining Data in R with dplyr [5]

6.1.1 Left join

Si leemos las matrices de expresión genética, podemos unir las anotaciones de los genes presentes mediante un join.

library(vroom)

gene_annot <- vroom::vroom("data/colon-annotation.tsv")
gene_expr <- vroom::vroom("data/colon-normalizado-cancer.tsv",
                          col_select = 1:6)

head(gene_annot)
## # A tibble: 6 × 10
##   gene_id        chr    start    end strand ensem…¹ length gene_…² gene_…³    gc
##   <chr>          <chr>  <dbl>  <dbl> <chr>  <chr>    <dbl> <chr>   <chr>   <dbl>
## 1 ENSG000001860… 1      69091  70008 +      ENSG00…    917 OR4F5   protei…  42.8
## 2 ENSG000001876… 1     924880 944581 +      ENSG00…  19701 SAMD11  protei…  66.0
## 3 ENSG000001889… 1     944204 959309 -      ENSG00…  15105 NOC2L   protei…  59.6
## 4 ENSG000001879… 1     960587 965715 +      ENSG00…   5128 KLHL17  protei…  67.9
## 5 ENSG000001875… 1     966497 975865 +      ENSG00…   9368 PLEKHN1 protei…  62.6
## 6 ENSG000001876… 1     975204 982093 -      ENSG00…   6889 PERM1   protei…  67.8
## # … with abbreviated variable names ¹​ensembl_id, ²​gene_name, ³​gene_type
head(gene_expr)
## # A tibble: 6 × 6
##   gene               colon_cancer_1 colon_cancer_2 colon_cance…¹ colon…² colon…³
##   <chr>                       <dbl>          <dbl>         <dbl>   <dbl>   <dbl>
## 1 ENSG00000000003.14          166.           136.         144.    129.     165. 
## 2 ENSG00000000005.5            31.1           18.0          2.91    7.79    17.3
## 3 ENSG00000000419.12          107.           111.         115.    127.     123. 
## 4 ENSG00000000457.13           99.6           93.6         98.5    89.2     84.3
## 5 ENSG00000000460.16           92.3           85.7         94.3    96.0     86.3
## 6 ENSG00000000938.12           43.3           46.0         59.5    46.8     51.6
## # … with abbreviated variable names ¹​colon_cancer_3, ²​colon_cancer_4,
## #   ³​colon_cancer_5

La columna gene_id del tibble gene_annot coincide con la columna gene del tibble gene_expr, por lo tanto, podemos unirlas. Usamos un left_join(), para asegurarnos de que no perdemos ninguna fila del dataset de expresión. Solamente elegiremos algunas columnas del dataset de anotaciones.

gene_expr %>%
  dplyr::left_join(
    gene_annot %>% 
      dplyr::select(gene_id, chr, gene_name),
    by=c("gene" = "gene_id")
  )
## # A tibble: 15,571 × 8
##    gene               colon_canc…¹ colon…² colon…³ colon…⁴ colon…⁵ chr   gene_…⁶
##    <chr>                     <dbl>   <dbl>   <dbl>   <dbl>   <dbl> <chr> <chr>  
##  1 ENSG00000000003.14        166.    136.   144.    129.     165.  X     TSPAN6 
##  2 ENSG00000000005.5          31.1    18.0    2.91    7.79    17.3 X     TNMD   
##  3 ENSG00000000419.12        107.    111.   115.    127.     123.  20    DPM1   
##  4 ENSG00000000457.13         99.6    93.6   98.5    89.2     84.3 1     SCYL3  
##  5 ENSG00000000460.16         92.3    85.7   94.3    96.0     86.3 1     C1orf1…
##  6 ENSG00000000938.12         43.3    46.0   59.5    46.8     51.6 1     FGR    
##  7 ENSG00000000971.15         84.6    98.1   86.3    94.1    103.  1     CFH    
##  8 ENSG00000001036.13        146.    147.   132.    140.     131.  6     FUCA2  
##  9 ENSG00000001084.10        117.    125.   120.    135.     115.  6     GCLC   
## 10 ENSG00000001167.14        115.    109.   111.    108.      99.8 6     NFYA   
## # … with 15,561 more rows, and abbreviated variable names ¹​colon_cancer_1,
## #   ²​colon_cancer_2, ³​colon_cancer_3, ⁴​colon_cancer_4, ⁵​colon_cancer_5,
## #   ⁶​gene_name

6.1.2 Inner join

Para analizar si hay una correlación entre el número de estudiantes en las instituciones de educación superior con el total de habitantes por municipio, podemos hacer un join entre el resumen obtenido en el ejemplo Obtener el número de estudiantes de educación superior en cada municipio por grado académico y sexo 5.1.3 y el dataset de población

head(estud_by_mun_sexo)
## # A tibble: 6 × 6
## # Groups:   municipality_id, municipality, state,
## #   academic_degree [4]
##   municipality_id municipality state   academic_degree        sex    estudiantes
##   <chr>           <chr>        <chr>   <chr>                  <chr>        <dbl>
## 1 10001           Canatlán     Durango Licenciatura           Hombre         138
## 2 10001           Canatlán     Durango Licenciatura           Mujer          157
## 3 10001           Canatlán     Durango Maestría               Hombre         115
## 4 10001           Canatlán     Durango Maestría               Mujer          158
## 5 10001           Canatlán     Durango Normal de Licenciatura Hombre        1905
## 6 10004           Cuencamé     Durango Licenciatura           Hombre        1638
head(poblacion)
## # A tibble: 6 × 9
##   entidad nom_ent        mun   nom_mun     pobtot pobfem pob0_14 pob15…¹ pob65…²
##   <chr>   <chr>          <chr> <chr>        <dbl>  <dbl>   <dbl>   <dbl>   <dbl>
## 1 01      Aguascalientes 001   Aguascalie… 948990 486917  240583  639532   67941
## 2 01      Aguascalientes 002   Asientos     51536  26275   16266   31919    3331
## 3 01      Aguascalientes 003   Calvillo     58250  29687   16720   35854    5641
## 4 01      Aguascalientes 004   Cosío        17000   8708    5183   10699    1118
## 5 01      Aguascalientes 005   Jesús María 129929  65710   38303   84949    6538
## 6 01      Aguascalientes 006   Pabellón d…  47646  24269   14140   30491    2977
## # … with abbreviated variable names ¹​pob15_64, ²​pob65_mas

Estos dataframes podrían unirse por nombres de municipios con la columna municipality de estud_by_mun_sexo y nom_mun de poblacion. Sin embargo, no podemos asegurar que los municipios estén escritos exactamente igual. Por lo tanto, es conveniente crear un id utilizando las columnas entidad y mun para igualar la columna municipality_id.

poblacion <- poblacion %>%
  dplyr::mutate(id = paste0(entidad, mun))

estud_by_mun_sexo <- estud_by_mun_sexo %>%
  dplyr::mutate(municipality_id = ifelse(nchar(municipality_id) == 4, 
                                          paste0("0", municipality_id), municipality_id))

Y utilizamos el inner_join() para unir los datasets. Solamente tomaremos la variable pob15_64 ya que es la edad donde preferentemente serían estudiantes de educación superior

estud_by_mun_sexo_pob <- estud_by_mun_sexo %>%
   dplyr::inner_join(
    poblacion %>% 
      dplyr::select(id, pob15_64),
    by = c("municipality_id" = "id")
  )

vroom::vroom_write(estud_by_mun_sexo, "data/estud_by_mun_sexo_pob.tsv")

6.1.3 Full join¨

Podemos investigar si hay una correlación entre el número de universidades con el número de hospitales en los municipios y para eso tenemos que ejecutar un full_join() ya que podría haber municipios donde no hay instituciones de salud pero sí instituciones de educación superior y viceversa.

Ambos dataframes contienen la variable total para definir el total de instituciones. Es por eso que utilizamos el parámetro suffix para renombrar las nuevas variables. Además, reemplazamos los valores NA, de las observaciones no coincidentes con 0.

anuies_hosp <- anuies_by_mun %>%
  dplyr::full_join(hospitales_by_mun, 
                    by = c("municipality_id", "municipality", "state"), 
                    suffix = c("_anuies", "_hospitales")) %>%
  replace(is.na(.), 0)

vroom_write(anuies_hosp, "data/anuies_hosp.tsv")

Referencias

[5]
W. Surles, Joining data in r with dplyr. 2017. Available: https://rpubs.com/williamsurles/293454