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 valoresNA
.right_join()
: La contraparte delleft_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.
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)
<- vroom::vroom("data/colon-annotation.tsv")
gene_annot <- vroom::vroom("data/colon-normalizado-cancer.tsv",
gene_expr 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 ::left_join(
dplyr%>%
gene_annot ::select(gene_id, chr, gene_name),
dplyrby=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 ::mutate(id = paste0(entidad, mun))
dplyr
<- estud_by_mun_sexo %>%
estud_by_mun_sexo ::mutate(municipality_id = ifelse(nchar(municipality_id) == 4,
dplyrpaste0("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 %>%
estud_by_mun_sexo_pob ::inner_join(
dplyr%>%
poblacion ::select(id, pob15_64),
dplyrby = c("municipality_id" = "id")
)
::vroom_write(estud_by_mun_sexo, "data/estud_by_mun_sexo_pob.tsv") vroom
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_by_mun %>%
anuies_hosp ::full_join(hospitales_by_mun,
dplyrby = c("municipality_id", "municipality", "state"),
suffix = c("_anuies", "_hospitales")) %>%
replace(is.na(.), 0)
vroom_write(anuies_hosp, "data/anuies_hosp.tsv")