Hacer juntas con join merge

Librerías

library(readr)
library (dplyr)
## Warning: package 'dplyr' was built under R version 3.6.2
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(sqldf)
## Loading required package: gsubfn
## Loading required package: proto
## Loading required package: RSQLite
#install.packages("plyr")
library(plyr) # installa.packages("plyr")
## Warning: package 'plyr' was built under R version 3.6.2
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
## 
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize

Cargar datos

estados <- read.csv("https://raw.githubusercontent.com/rpizarrog/DBA-Scripts-SQL/master/datostienda/estados.csv", 
                     header = TRUE, 
                     encoding = "UTF-8",
                    quote = "'",
                     stringsAsFactors = T)

municipios <- read.csv("https://raw.githubusercontent.com/rpizarrog/DBA-Scripts-SQL/master/datostienda/municipios.csv", 
                    header = TRUE, 
                    encoding = "UTF-8",
                    quote = "'",
                    stringsAsFactors = T)

Transformar, Depurar, Limpiar datos

names(estados) <- c('estado', 'nombre', 'abreviatura', 'pais')
estados$estado <- as.factor(estados$estado) 

names(municipios) <- c('municipio', 'nombre', 'estado')
municipios$municipio <- as.factor(municipios$municipio)
municipios$estado <- as.factor(municipios$estado)

Explorar datos

str(estados)
## 'data.frame':    32 obs. of  4 variables:
##  $ estado     : Factor w/ 32 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ nombre     : Factor w/ 32 levels "Aguascalientes",..: 1 2 3 4 7 8 5 6 9 10 ...
##  $ abreviatura: Factor w/ 32 levels "Ags.","BC","BCS",..: 1 2 3 4 7 8 6 5 9 10 ...
##  $ pais       : Factor w/ 1 level "MX": 1 1 1 1 1 1 1 1 1 1 ...
summary(estados)
##      estado                   nombre    abreviatura pais   
##  1      : 1   Aguascalientes     : 1   Ags.   : 1   MX:32  
##  2      : 1   Baja California    : 1   BC     : 1          
##  3      : 1   Baja California Sur: 1   BCS    : 1          
##  4      : 1   Campeche           : 1   Camp.  : 1          
##  5      : 1   Chiapas            : 1   Chih.  : 1          
##  6      : 1   Chihuahua          : 1   Chis.  : 1          
##  (Other):26   (Other)            :26   (Other):26
str(municipios)
## 'data.frame':    2466 obs. of  3 variables:
##  $ municipio: Factor w/ 2466 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ nombre   : Factor w/ 2326 levels "Abalá","Abasolo",..: 36 128 240 434 525 764 1079 1174 1299 1342 ...
##  $ estado   : Factor w/ 32 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(municipios)
##    municipio                nombre         estado    
##  1      :   1   Benito Juárez  :   7   20     : 576  
##  2      :   1   Ocampo         :   6   21     : 217  
##  3      :   1   Emiliano Zapata:   5   30     : 213  
##  4      :   1   Hidalgo        :   5   14     : 125  
##  5      :   1   Juárez         :   5   15     : 125  
##  6      :   1   Morelos        :   5   7      : 118  
##  (Other):2460   (Other)        :2433   (Other):1092

Juntar datos: SQL merge y join

Alternativa 1. Por SQL librería sqldf

  • Solo se muestra los primero 6y últimos 6 registros con head() y tail()
estadosmunicipios <- sqldf("select estados.estado, estados.nombre, 
  abreviatura,pais, municipios.municipio, municipios.nombre, 
  municipios.estado
  from estados, municipios 
     where estados.estado = municipios.estado order by estados.abreviatura, municipios.municipio")
head(estadosmunicipios)
##   estado         nombre abreviatura pais municipio          nombre..6 estado..7
## 1      1 Aguascalientes        Ags.   MX         1     Aguascalientes         1
## 2      1 Aguascalientes        Ags.   MX        10 San José de Gracia         1
## 3      1 Aguascalientes        Ags.   MX        11           Tepezalá         1
## 4      1 Aguascalientes        Ags.   MX         2           Asientos         1
## 5      1 Aguascalientes        Ags.   MX         3           Calvillo         1
## 6      1 Aguascalientes        Ags.   MX         4              Cosío         1
tail(estadosmunicipios)
##      estado    nombre abreviatura pais municipio             nombre..6
## 2461     32 Zacatecas        Zac.   MX      2461          Villa de Cos
## 2462     32 Zacatecas        Zac.   MX      2462          Villa García
## 2463     32 Zacatecas        Zac.   MX      2463 Villa González Ortega
## 2464     32 Zacatecas        Zac.   MX      2464         Villa Hidalgo
## 2465     32 Zacatecas        Zac.   MX      2465            Villanueva
## 2466     32 Zacatecas        Zac.   MX      2466             Zacatecas
##      estado..7
## 2461        32
## 2462        32
## 2463        32
## 2464        32
## 2465        32
## 2466        32

Alternativa 2. merge

estadosmunicipios <- merge(estados, municipios, by='estado')
head(estadosmunicipios)
##   estado       nombre.x abreviatura pais municipio       nombre.y
## 1      1 Aguascalientes        Ags.   MX         1 Aguascalientes
## 2      1 Aguascalientes        Ags.   MX         2       Asientos
## 3      1 Aguascalientes        Ags.   MX         3       Calvillo
## 4      1 Aguascalientes        Ags.   MX         4          Cosío
## 5      1 Aguascalientes        Ags.   MX         5       El Llano
## 6      1 Aguascalientes        Ags.   MX         6    Jesús María
tail(estadosmunicipios)
##      estado         nombre.x abreviatura pais municipio            nombre.y
## 2461      9 Distrito Federal          DF   MX       276      Miguel Hidalgo
## 2462      9 Distrito Federal          DF   MX       277          Milpa Alta
## 2463      9 Distrito Federal          DF   MX       278             Tláhuac
## 2464      9 Distrito Federal          DF   MX       279             Tlalpan
## 2465      9 Distrito Federal          DF   MX       280 Venustiano Carranza
## 2466      9 Distrito Federal          DF   MX       281          Xochimilco

Alternativa 3 join librería: plyr

estadosmunicipios <- join(estados, municipios, by='estado', 
                            type='left')
head(estadosmunicipios)
##   estado         nombre abreviatura pais municipio         nombre
## 1      1 Aguascalientes        Ags.   MX         1 Aguascalientes
## 2      1 Aguascalientes        Ags.   MX         2       Asientos
## 3      1 Aguascalientes        Ags.   MX         3       Calvillo
## 4      1 Aguascalientes        Ags.   MX         4          Cosío
## 5      1 Aguascalientes        Ags.   MX         5       El Llano
## 6      1 Aguascalientes        Ags.   MX         6    Jesús María
tail(estadosmunicipios)
##      estado    nombre abreviatura pais municipio                nombre
## 2461     32 Zacatecas        Zac.   MX      2461          Villa de Cos
## 2462     32 Zacatecas        Zac.   MX      2462          Villa García
## 2463     32 Zacatecas        Zac.   MX      2463 Villa González Ortega
## 2464     32 Zacatecas        Zac.   MX      2464         Villa Hidalgo
## 2465     32 Zacatecas        Zac.   MX      2465            Villanueva
## 2466     32 Zacatecas        Zac.   MX      2466             Zacatecas
# Aqui left y right sale igual porque siempre 
# hay municipios de estados

# ALTERNATIVA 3: join: type=right: library(plyr)
estadosmunicipios <- join(estados, municipios, by='estado', 
                          type='right')
head(estadosmunicipios)
##   estado         nombre abreviatura pais municipio         nombre
## 1      1 Aguascalientes        Ags.   MX         1 Aguascalientes
## 2      1 Aguascalientes        Ags.   MX         2       Asientos
## 3      1 Aguascalientes        Ags.   MX         3       Calvillo
## 4      1 Aguascalientes        Ags.   MX         4          Cosío
## 5      1 Aguascalientes        Ags.   MX         5       El Llano
## 6      1 Aguascalientes        Ags.   MX         6    Jesús María
tail(estadosmunicipios)
##      estado    nombre abreviatura pais municipio                nombre
## 2461     32 Zacatecas        Zac.   MX      2461          Villa de Cos
## 2462     32 Zacatecas        Zac.   MX      2462          Villa García
## 2463     32 Zacatecas        Zac.   MX      2463 Villa González Ortega
## 2464     32 Zacatecas        Zac.   MX      2464         Villa Hidalgo
## 2465     32 Zacatecas        Zac.   MX      2465            Villanueva
## 2466     32 Zacatecas        Zac.   MX      2466             Zacatecas

Alternativa 4.1: left_join: library dplyr()

estadosmunicipios <- right_join(estados, municipios, by = 'estado')
head(estadosmunicipios)
##   estado       nombre.x abreviatura pais municipio       nombre.y
## 1      1 Aguascalientes        Ags.   MX         1 Aguascalientes
## 2      1 Aguascalientes        Ags.   MX         2       Asientos
## 3      1 Aguascalientes        Ags.   MX         3       Calvillo
## 4      1 Aguascalientes        Ags.   MX         4          Cosío
## 5      1 Aguascalientes        Ags.   MX         5       El Llano
## 6      1 Aguascalientes        Ags.   MX         6    Jesús María
tail(estadosmunicipios)
##      estado  nombre.x abreviatura pais municipio              nombre.y
## 2461     32 Zacatecas        Zac.   MX      2461          Villa de Cos
## 2462     32 Zacatecas        Zac.   MX      2462          Villa García
## 2463     32 Zacatecas        Zac.   MX      2463 Villa González Ortega
## 2464     32 Zacatecas        Zac.   MX      2464         Villa Hidalgo
## 2465     32 Zacatecas        Zac.   MX      2465            Villanueva
## 2466     32 Zacatecas        Zac.   MX      2466             Zacatecas

Alternativa 4.2: right_join: library dplyr()

estadosmunicipios <- right_join(estados, municipios, by = 'estado')
head(estadosmunicipios)
##   estado       nombre.x abreviatura pais municipio       nombre.y
## 1      1 Aguascalientes        Ags.   MX         1 Aguascalientes
## 2      1 Aguascalientes        Ags.   MX         2       Asientos
## 3      1 Aguascalientes        Ags.   MX         3       Calvillo
## 4      1 Aguascalientes        Ags.   MX         4          Cosío
## 5      1 Aguascalientes        Ags.   MX         5       El Llano
## 6      1 Aguascalientes        Ags.   MX         6    Jesús María
tail(estadosmunicipios)
##      estado  nombre.x abreviatura pais municipio              nombre.y
## 2461     32 Zacatecas        Zac.   MX      2461          Villa de Cos
## 2462     32 Zacatecas        Zac.   MX      2462          Villa García
## 2463     32 Zacatecas        Zac.   MX      2463 Villa González Ortega
## 2464     32 Zacatecas        Zac.   MX      2464         Villa Hidalgo
## 2465     32 Zacatecas        Zac.   MX      2465            Villanueva
## 2466     32 Zacatecas        Zac.   MX      2466             Zacatecas

Alternativa 4.3: inner_join: library dplyr()

estadosmunicipios <- inner_join(estados, municipios, by = 'estado')
head(estadosmunicipios)
##   estado       nombre.x abreviatura pais municipio       nombre.y
## 1      1 Aguascalientes        Ags.   MX         1 Aguascalientes
## 2      1 Aguascalientes        Ags.   MX         2       Asientos
## 3      1 Aguascalientes        Ags.   MX         3       Calvillo
## 4      1 Aguascalientes        Ags.   MX         4          Cosío
## 5      1 Aguascalientes        Ags.   MX         5       El Llano
## 6      1 Aguascalientes        Ags.   MX         6    Jesús María
tail(estadosmunicipios)
##      estado  nombre.x abreviatura pais municipio              nombre.y
## 2461     32 Zacatecas        Zac.   MX      2461          Villa de Cos
## 2462     32 Zacatecas        Zac.   MX      2462          Villa García
## 2463     32 Zacatecas        Zac.   MX      2463 Villa González Ortega
## 2464     32 Zacatecas        Zac.   MX      2464         Villa Hidalgo
## 2465     32 Zacatecas        Zac.   MX      2465            Villanueva
## 2466     32 Zacatecas        Zac.   MX      2466             Zacatecas

Alternativa 5

  • Utilizando libreria data.table
  • data.tabla. Otro tipo de dato.
  • No es un data.frame propiamente aunque se comporta de manera similar
library(data.table) # Otra librería
## 
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
estadosDT <- data.table(estados, key = "estado") 
municipiosDT <- data.table(municipios, key = "municipio")

class(estadosDT)
## [1] "data.table" "data.frame"
class(municipiosDT)
## [1] "data.table" "data.frame"
estadosmunicipios <- join(estadosDT, municipiosDT, by='estado')

head(estadosmunicipios)
##    estado         nombre abreviatura pais municipio         nombre
## 1:      1 Aguascalientes        Ags.   MX         1 Aguascalientes
## 2:      1 Aguascalientes        Ags.   MX         2       Asientos
## 3:      1 Aguascalientes        Ags.   MX         3       Calvillo
## 4:      1 Aguascalientes        Ags.   MX         4          Cosío
## 5:      1 Aguascalientes        Ags.   MX         5       El Llano
## 6:      1 Aguascalientes        Ags.   MX         6    Jesús María
tail(estadosmunicipios)
##    estado    nombre abreviatura pais municipio                nombre
## 1:     32 Zacatecas        Zac.   MX      2461          Villa de Cos
## 2:     32 Zacatecas        Zac.   MX      2462          Villa García
## 3:     32 Zacatecas        Zac.   MX      2463 Villa González Ortega
## 4:     32 Zacatecas        Zac.   MX      2464         Villa Hidalgo
## 5:     32 Zacatecas        Zac.   MX      2465            Villanueva
## 6:     32 Zacatecas        Zac.   MX      2466             Zacatecas

Que sucede si los campos de asociación se llaman de manera diferente?

  • Se ordena el conjunto de datos generado
names(estados) <- c('estado1', 'nombre', 'abreviatura', 'pais')
estados
##    estado1                          nombre abreviatura pais
## 1        1                  Aguascalientes        Ags.   MX
## 2        2                 Baja California          BC   MX
## 3        3             Baja California Sur         BCS   MX
## 4        4                        Campeche       Camp.   MX
## 5        5            Coahuila de Zaragoza       Coah.   MX
## 6        6                          Colima        Col.   MX
## 7        7                         Chiapas       Chis.   MX
## 8        8                       Chihuahua       Chih.   MX
## 9        9                Distrito Federal          DF   MX
## 10      10                         Durango        Dgo.   MX
## 11      11                      Guanajuato        Gto.   MX
## 12      12                        Guerrero        Gro.   MX
## 13      13                         Hidalgo        Hgo.   MX
## 14      14                         Jalisco        Jal.   MX
## 15      15                          México        Mex.   MX
## 16      16             Michoacán de Ocampo       Mich.   MX
## 17      17                         Morelos        Mor.   MX
## 18      18                         Nayarit        Nay.   MX
## 19      19                      Nuevo León          NL   MX
## 20      20                          Oaxaca        Oax.   MX
## 21      21                          Puebla        Pue.   MX
## 22      22                       Querétaro        Qro.   MX
## 23      23                    Quintana Roo      Q. Roo   MX
## 24      24                 San Luis Potosí         SLP   MX
## 25      25                         Sinaloa        Sin.   MX
## 26      26                          Sonora        Son.   MX
## 27      27                         Tabasco        Tab.   MX
## 28      28                      Tamaulipas      Tamps.   MX
## 29      29                        Tlaxcala       Tlax.   MX
## 30      30 Veracruz de Ignacio de la Llave        Ver.   MX
## 31      31                         Yucatán        Yuc.   MX
## 32      32                       Zacatecas        Zac.   MX
estadosmunicipios <- merge(estados, municipios, 
                           by.x = 'estado1', by.y = 'estado')

estadosmunicipios <- arrange(estadosmunicipios, abreviatura)

head(estadosmunicipios)
##   estado1       nombre.x abreviatura pais municipio       nombre.y
## 1       1 Aguascalientes        Ags.   MX         1 Aguascalientes
## 2       1 Aguascalientes        Ags.   MX         2       Asientos
## 3       1 Aguascalientes        Ags.   MX         3       Calvillo
## 4       1 Aguascalientes        Ags.   MX         4          Cosío
## 5       1 Aguascalientes        Ags.   MX         5       El Llano
## 6       1 Aguascalientes        Ags.   MX         6    Jesús María
tail(estadosmunicipios)
##      estado1  nombre.x abreviatura pais municipio              nombre.y
## 2461      32 Zacatecas        Zac.   MX      2461          Villa de Cos
## 2462      32 Zacatecas        Zac.   MX      2462          Villa García
## 2463      32 Zacatecas        Zac.   MX      2463 Villa González Ortega
## 2464      32 Zacatecas        Zac.   MX      2464         Villa Hidalgo
## 2465      32 Zacatecas        Zac.   MX      2465            Villanueva
## 2466      32 Zacatecas        Zac.   MX      2466             Zacatecas

Análisis

Cuantos municipios por estado

  • Hay muchas alternativas, aquí se utiliza table() para genrar una tabla de frecuencia
  • Var1 y Freq son nobre s decolumnas que genera table()
  • Luego convertir ese table() a data.frame para poder graficar
  • Además de hacer factor la variable Var1 que es abreviatura
CuantosMunicipiosEstados <- data.frame(table(estadosmunicipios$abreviatura))
CuantosMunicipiosEstados$Var1 <- as.factor(CuantosMunicipiosEstados$Var1)

CuantosMunicipiosEstados
##      Var1 Freq
## 1    Ags.   11
## 2      BC    5
## 3     BCS    5
## 4   Camp.   11
## 5   Chih.   67
## 6   Chis.  118
## 7   Coah.   38
## 8    Col.   10
## 9      DF   16
## 10   Dgo.   39
## 11   Gro.   81
## 12   Gto.   46
## 13   Hgo.   84
## 14   Jal.  125
## 15   Mex.  125
## 16  Mich.  114
## 17   Mor.   33
## 18   Nay.   20
## 19     NL   51
## 20   Oax.  576
## 21   Pue.  217
## 22 Q. Roo   10
## 23   Qro.   18
## 24   Sin.   18
## 25    SLP   58
## 26   Son.   72
## 27   Tab.   17
## 28 Tamps.   44
## 29  Tlax.   60
## 30   Ver.  213
## 31   Yuc.  106
## 32   Zac.   58

Ordenar de mayor a menor

  • Se utiliza arrange() de librería dplyr
# Ordenar de Mayor a menor por Frecuencia. arrange es de la Librería dplyr
CuantosMunicipiosEstados <- arrange(CuantosMunicipiosEstados, desc(Freq))
CuantosMunicipiosEstados
##      Var1 Freq
## 1    Oax.  576
## 2    Pue.  217
## 3    Ver.  213
## 4    Jal.  125
## 5    Mex.  125
## 6   Chis.  118
## 7   Mich.  114
## 8    Yuc.  106
## 9    Hgo.   84
## 10   Gro.   81
## 11   Son.   72
## 12  Chih.   67
## 13  Tlax.   60
## 14    SLP   58
## 15   Zac.   58
## 16     NL   51
## 17   Gto.   46
## 18 Tamps.   44
## 19   Dgo.   39
## 20  Coah.   38
## 21   Mor.   33
## 22   Nay.   20
## 23   Qro.   18
## 24   Sin.   18
## 25   Tab.   17
## 26     DF   16
## 27   Ags.   11
## 28  Camp.   11
## 29   Col.   10
## 30 Q. Roo   10
## 31     BC    5
## 32    BCS    5

Generar los top y bot 5 con head() y tail()

top5 <- head(CuantosMunicipiosEstados, 5) # Los primeros 5
bot5 <- tail(CuantosMunicipiosEstados, 5) # Los ultimos 5

Visualizar

# Gráfica de Barra para determinar cuantos municipios de cada estado
barplot(top5$Freq, names.arg = top5$Var1)

barplot(bot5$Freq, names.arg = bot5$Var1)

Visualizar utilizando ggplot2

  • Primero cargar librería
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.6.2
# Creando con ggplot
ggplot(data = top5, 
       mapping = aes(x = Var1, y = Freq)) 

# Agregando punto
ggplot(data = top5, 
        mapping = aes(x = Var1, y = Freq)) +
  geom_point()

# Modificando la figura del punto
ggplot(data = top5, 
       mapping = aes(x = Var1, y = Freq)) +
geom_point(shape=21)

Creando gráfica con datos originales

  • Notar que el campo se llama estado1 por la última alternativa de join
# Graficando barra con los datos originales de estadosmunicipios
ggplot(estadosmunicipios, aes(estado1)) +
  geom_bar()

ggplot(estadosmunicipios, aes(x=abreviatura)) +
  geom_bar()