Juntando tablas.
Juntar tablas es una actividad muy importante para realizar análisis de datos, debido a que, muchas veces, los datos que nos interesa analizar estan en dos tablas distintas.
Procedimiento para juntar tablas:
Paso 1: Identificar la variable llave. La variable llave es la variable que tiene información en comun para ambas tablas y es la que permite hacer el match entre ambas.
Paso 2: Identificar la relación entre las variables. La relación puede ser de tres tipo:
Relación 1 a 1, cuando un valor de una tabla hace match con el valor de otra tabla.
Relación 1 a muchos, cuando un valor de una tabla se corresponde a muchos valores de la otra tabla.
Relación muchos a muchos, cuando varios valores de una tabla se relacionan con varios otros valores de otras tablas. Esta situación es rara y no es muy deseable, en general.
Para los presentes ejercicios, nos enfocaremos en las primeras dos relaciones.
Paso 3. Identificar el procedimiento de unión que deseo implementar.
Para este proceso de unión, podemos utilizar una de las siguientes cuatro funciones de {dplyr}:
inner_join(), donde la tabla resultante nos da la unión de aquellos valores que coinciden entre sí.left_join(), donde la tabla resultante nos da la unión de los valores que coinciden con la tabla izquierda. Nota. Las posiciones de las tablas son relativas al orden en que las declaramos por lo que, generalmente, vamos a tratar de poner la mas importante a la izquierda.right_join(), donde la tabla resultante nos da la unión de los valores que coinciden con la tabla derecha.full_join(), donde la tabla resultante conserva los valores de la tabla derecha y la izquierda, rellenando conNAsaquellos valores donde no hay coincidencias.
Ejemplos de joins.
Para el presente ejemplo, vamos a realizar uniones de las siguientes tablas:
Estas tablas las vamos a generar con el siguiente código:
casos <- tibble::tribble(
~Municipios, ~Casos,
"Ocuituco", 10L,
"Yecapixtla", 13L,
"Jonacatepec", 23L,
"Tetela", 5L,
"Tepoztlán", 50L
)
fall <- tibble::tribble(
~Municipios, ~Fallecimientos,
"Yecapixtla", 1L,
"Jonacatepec", 2L,
"Tepoztlán", 20L
)
hosp <- tibble::tribble(
~Municipios, ~Hospitales,
"Ocuituco", 1L,
"Jonacatepec", 1L,
"Tetela", 1L,
"Tepoztlán", 2L
)
pop <- tibble::tribble(
~Municipios, ~Poblacion,
"Ocuituco", 18000L,
"Yecapixtla", 40000L,
"Jonacatepec", 35000L,
"Tetela", 20000L,
"Tepoztlán", 45000L
)Paso 1 Identificamos la variable llave.
En estos casos, la variable llave es la variable Municipios.
Paso 2. Identificamos las relaciones.
En estos casos, la relación es 1 a 1, ya que la unidad de observación para las cuatro tablas es el municipio.
Paso 3. Realizamos el join
Para esto, vamos a experimentar con las 4 formas de hacer join vistas arriba:
Primero, leemos la librería tidyverse, la cual contiene a la biblioteca dplyr, la cual a su vez contiene las funciones para hacer unión de tablas.
Ahora si, procedemos a hacer las uniones.
Dada la explicación brindada arriba (y otras explicaciones que pudieras buscar por tu cuenta en Google), trata de entender por qué las uniones de las tablas se dieron como se dieron.
inner_join(x = base_izq, y = base_der, by = "llave")
Corroboramos:
## # A tibble: 3 x 3
## Municipios Casos Fallecimientos
## <chr> <int> <int>
## 1 Yecapixtla 13 1
## 2 Jonacatepec 23 2
## 3 Tepoztlán 50 20
## # A tibble: 2 x 3
## Municipios Fallecimientos Hospitales
## <chr> <int> <int>
## 1 Jonacatepec 2 1
## 2 Tepoztlán 20 2
## # A tibble: 5 x 3
## Municipios Casos Poblacion
## <chr> <int> <int>
## 1 Ocuituco 10 18000
## 2 Yecapixtla 13 40000
## 3 Jonacatepec 23 35000
## 4 Tetela 5 20000
## 5 Tepoztlán 50 45000
left_join(x = base_izq, y = base_der, by = "llave")
Corroboramos:
## # A tibble: 5 x 3
## Municipios Casos Fallecimientos
## <chr> <int> <int>
## 1 Ocuituco 10 NA
## 2 Yecapixtla 13 1
## 3 Jonacatepec 23 2
## 4 Tetela 5 NA
## 5 Tepoztlán 50 20
## # A tibble: 3 x 3
## Municipios Fallecimientos Hospitales
## <chr> <int> <int>
## 1 Yecapixtla 1 NA
## 2 Jonacatepec 2 1
## 3 Tepoztlán 20 2
## # A tibble: 5 x 3
## Municipios Casos Poblacion
## <chr> <int> <int>
## 1 Ocuituco 10 18000
## 2 Yecapixtla 13 40000
## 3 Jonacatepec 23 35000
## 4 Tetela 5 20000
## 5 Tepoztlán 50 45000
right_join(x = base_izq, y = base_der, by = "llave")
Corroboramos:
## # A tibble: 3 x 3
## Municipios Casos Fallecimientos
## <chr> <int> <int>
## 1 Yecapixtla 13 1
## 2 Jonacatepec 23 2
## 3 Tepoztlán 50 20
## # A tibble: 4 x 3
## Municipios Fallecimientos Hospitales
## <chr> <int> <int>
## 1 Jonacatepec 2 1
## 2 Tepoztlán 20 2
## 3 Ocuituco NA 1
## 4 Tetela NA 1
## # A tibble: 5 x 3
## Municipios Casos Poblacion
## <chr> <int> <int>
## 1 Ocuituco 10 18000
## 2 Yecapixtla 13 40000
## 3 Jonacatepec 23 35000
## 4 Tetela 5 20000
## 5 Tepoztlán 50 45000
full_join(x = base_izq, y = base_der, by = "llave")
Corroboramos:
## # A tibble: 5 x 3
## Municipios Casos Fallecimientos
## <chr> <int> <int>
## 1 Ocuituco 10 NA
## 2 Yecapixtla 13 1
## 3 Jonacatepec 23 2
## 4 Tetela 5 NA
## 5 Tepoztlán 50 20
## # A tibble: 5 x 3
## Municipios Fallecimientos Hospitales
## <chr> <int> <int>
## 1 Yecapixtla 1 NA
## 2 Jonacatepec 2 1
## 3 Tepoztlán 20 2
## 4 Ocuituco NA 1
## 5 Tetela NA 1
## # A tibble: 5 x 3
## Municipios Casos Poblacion
## <chr> <int> <int>
## 1 Ocuituco 10 18000
## 2 Yecapixtla 13 40000
## 3 Jonacatepec 23 35000
## 4 Tetela 5 20000
## 5 Tepoztlán 50 45000
Una vez que ya entendimos como estuvo la cosa, vamos a trabajar con bases más grandes.
A continuación, se muestra el código necesario para acceder a los datos de Centros Educativos registrados en el CEMABE.
La tabla centros contiene datos de los centros educativos del Censo de Escuelas, Maestros y Alumnos de Educación Básica y Especial, mientras que la tabla inmuebles contiene información de los inmuebles en los cuales se encuentran ubicados dichos centros.
# CEMABE - Usando URLs
centros <-
read_csv("http://segasi.com.mx/clases/cide/vis_man/datos/cemabe_cdmx.csv", col_types = cols(ID_INM = col_character()),
locale = locale(asciify = TRUE)) %>%
arrange(ID_INM)| X1 | ID_INM | CLAVE_CT | ENT | NOM_ENT | MUN | NOM_MUN | LOC | NOM_LOC | AGEB |
|---|---|---|---|---|---|---|---|---|---|
| 1589 | 198685 | 09FUA0317V2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2729 |
| 1930 | 198685 | 09DPR2673O1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2729 |
| 2198 | 198685 | 09DPR3270B2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2729 |
| 2202 | 198686 | 09DJN1169J5 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3318 |
| 1970 | 198687 | 09DPR0014R5 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3318 |
| 1329 | 198688 | 09PJN5843A1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3322 |
| 1274 | 198689 | 09PJN5608X1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 0027 |
| 1603 | 198690 | 09PES0978R1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2733 |
| 1590 | 198691 | 09PJN5548Z1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2733 |
| 1848 | 198692 | 09DJN1338O1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3248 |
| 2195 | 198692 | 09DJN1375S2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3248 |
| 2261 | 198693 | 09DJN1413E2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3252 |
| 2357 | 198693 | 09DJN0922A1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3252 |
| 2028 | 198694 | 09DTV0144J2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3252 |
| 2105 | 198694 | 09DTV0001M1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3252 |
| 1360 | 198695 | 09PPR1609L1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2733 |
| 1529 | 198695 | 09PES0980F1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2733 |
| 2241 | 198696 | 09DJN0880S1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 0027 |
| 2316 | 198696 | 09DJN1053J2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 0027 |
| 2089 | 198697 | 09DPR0995J2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 0027 |
inmuebles <-
read_csv("http://segasi.com.mx/clases/cide/vis_man/datos/TR_inmuebles_09.csv", col_types = cols(ID_INM = col_character()),
locale = locale(asciify = TRUE)) %>%
arrange(ID_INM)| ID_INM | ENT | NOM_ENT | MUN | NOM_MUN | LOC | NOM_LOC | AGEB | MZA | ENT_ADMON |
|---|---|---|---|---|---|---|---|---|---|
| 198685 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2729 | 022 | 09 |
| 198686 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 3318 | 008 | 09 |
| 198687 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 3318 | 012 | 09 |
| 198688 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 3322 | 003 | 09 |
| 198689 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 0027 | 025 | 09 |
| 198690 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2733 | 012 | 09 |
| 198691 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2733 | 012 | 09 |
| 198692 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 3248 | 017 | 09 |
| 198693 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 3252 | 008 | 09 |
| 198694 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 3252 | 016 | 09 |
| 198695 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2733 | 013 | 09 |
| 198696 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 0027 | 004 | 09 |
| 198697 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 0027 | 004 | 09 |
| 198698 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 0027 | 004 | 09 |
| 198699 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 0027 | 004 | 09 |
| 198700 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2733 | 010 | 09 |
| 198701 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2733 | 010 | 09 |
| 198702 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2733 | 010 | 09 |
| 198703 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2625 | 016 | 09 |
| 198704 | 09 | Distrito Federal | 005 | Gustavo A. Madero | 0001 | Gustavo A. Madero | 2625 | 016 | 09 |
Supongamos que nos interesa armar una gran base con ambas bases de datos.
1. Identificando la variable llave.
De las tablas anteriores, vemos que la variable que liga las observaciones es la variable ID_INM. Esta variable es el numero identificador del inmueble, y tiene información en ambas tablas.
2. Identificamos el tipo de relación
De las tablas, vemos que centros tiene mas de un registro por ID_INM, esto es, que más de un centro educativo se encuentra dentro de un inmueble. Esto seguramente es por aquellos centros educativos que tienen mas de un turno escolar.
3. Realizamos el join
Como nos interesa tener una base conjuntando la información de los centros educativos con la de sus respectivos inmuebles, hacemos un join conservando todos los datos posibles. Para esto, utilizaremos la función full_join().
## [1] 8601 427
Cuadro 1. Cuadro mostrando los primeros renglones y columnas de la gran base.
| X1 | ID_INM | CLAVE_CT | ENT.x | NOM_ENT.x | MUN.x | NOM_MUN.x | LOC.x | NOM_LOC.x | AGEB.x |
|---|---|---|---|---|---|---|---|---|---|
| 1589 | 198685 | 09FUA0317V2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2729 |
| 1930 | 198685 | 09DPR2673O1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2729 |
| 2198 | 198685 | 09DPR3270B2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2729 |
| 2202 | 198686 | 09DJN1169J5 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3318 |
| 1970 | 198687 | 09DPR0014R5 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3318 |
| 1329 | 198688 | 09PJN5843A1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3322 |
| 1274 | 198689 | 09PJN5608X1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 0027 |
| 1603 | 198690 | 09PES0978R1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2733 |
| 1590 | 198691 | 09PJN5548Z1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2733 |
| 1848 | 198692 | 09DJN1338O1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3248 |
| 2195 | 198692 | 09DJN1375S2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3248 |
| 2261 | 198693 | 09DJN1413E2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3252 |
| 2357 | 198693 | 09DJN0922A1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3252 |
| 2028 | 198694 | 09DTV0144J2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3252 |
| 2105 | 198694 | 09DTV0001M1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 3252 |
| 1360 | 198695 | 09PPR1609L1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2733 |
| 1529 | 198695 | 09PES0980F1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 2733 |
| 2241 | 198696 | 09DJN0880S1 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 0027 |
| 2316 | 198696 | 09DJN1053J2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 0027 |
| 2089 | 198697 | 09DPR0995J2 | 9 | Distrito Federal | 5 | Gustavo A. Madero | 1 | Gustavo A. Madero | 0027 |
De esta manera, observamos que acabamos de juntar ambas tablas en una sola, la cual tiene ahora el mismo numero de renglones que la tabla centros y un numero de columnas equivalente a la suma del numero de columnas de centros y de inmuebles junta, menos 1 (por la variable llave).