Ejemplos de uso de R

Sergio

28/5/2019

Introducción

En esta presentación podrá observar algunos ejemplos básicos sobre como funciona la programación en R para limpiar y manipular bases de datos

Limpieza de datos

Asumo una base de datos disponible

Limpieza de strings

Como importar una base de datos. La segunda parte del código muestra los valores unicos de la columna producto.

cantonal_2017 <- read_excel("D:/OneDrive/desaf/cantonal/2017/consolidad_2017/cantonal_2017.xlsx")
head(cantonal_2017)
## # A tibble: 6 x 10
##   X__1  programa CANTON tipo  producto `valor (benefic~ PROVINCIA REGION
##   <chr> <chr>    <chr>  <chr> <chr>               <dbl> <chr>     <chr> 
## 1 1     BANHVI   SAN J~ BENE~ Constru~               14 SAN JOSE  CENTR~
## 2 2     BANHVI   ESCAZU BENE~ Constru~                0 SAN JOSE  CENTR~
## 3 3     BANHVI   DESAM~ BENE~ Constru~               38 SAN JOSE  CENTR~
## 4 4     BANHVI   PURIS~ BENE~ Constru~               57 SAN JOSE  CENTR~
## 5 5     BANHVI   TARRA~ BENE~ Constru~               39 SAN JOSE  CENTR~
## 6 6     BANHVI   ASERRI BENE~ Constru~               55 SAN JOSE  CENTR~
## # ... with 2 more variables: titulo <chr>, descripcion <chr>
unique(cantonal_2017$producto)
##  [1] "Construcción.en.Lote.Propio"                    
##  [2] "Compra.de.Lote.y.Construcción"                  
##  [3] "Compra.de.Vivienda.Existente"                   
##  [4] "Ampliación..Mejoras.y.Terminación.de.Vivienda"  
##  [5] "TOTAL"                                          
##  [6] "ATENCIÓN.DIRECTA"                               
##  [7] "EQUIPAMIENTO"                                   
##  [8] "CONSTRUCCIÓN"                                   
##  [9] "COMIDAS.SERVIDAS"                               
## [10] "DISTRIBUCIÓN.DE.LECHE"                          
## [11] "DISTRIBUCIÓN.ALIMENTOS.A.FAMILIAS"              
## [12] "NECESIDADES.BÁSICAS.CENTRO.DIURNO"              
## [13] "NECESIDADES.BÁSICAS.HOGAR"                      
## [14] "PROGRAMA.ABANDONADOS"                           
## [15] "RED.DE.CUIDO"                                   
## [16] "ACCESO.A.SERVICIOS"                             
## [17] "ALTERNATIVAS.RESIDENCIALES"                     
## [18] "LEY.8783"                                       
## [19] "F.43.GESTIÓN.RIESGO.Y.EMERGENCIA.PRIMARIA"      
## [20] "F.43.POSTSECUNDARIA"                            
## [21] "F.43.PRIMARIA"                                  
## [22] "CONVENIO.GESTIÓN.RIESGO.Y.EMERGENCIA.PRIMARIA"  
## [23] "CONVENIO.GESTIÓN.RIESGO.Y.EMERGENCIA.SECUNDARIA"
## [24] "CONVENIO.POSTSECUNDARIA"                        
## [25] "CONVENIO.PRIMARIA"                              
## [26] "ATENCIÓN.INTEGRAL"                              
## [27] "SUBSIDIO.PARA.SEGUIMIENTO"                      
## [28] "PARQUES.BIOSALUDABLES"                          
## [29] "PROYECTOS1"                                     
## [30] "PROYECTOS2"                                     
## [31] "PREESCOLARES.Y.ESCOLARES"                       
## [32] "COLEGIALES.CENTROS.ACADEMICOS"                  
## [33] "COLEGIALES.CENTROS.TECNICOS"                    
## [34] "ESTUDIANTES.EDUCACION.ESPECIAL"                 
## [35] "ESTUDIANTES.DE.EDUCACION.DE.JOVENES.Y.ADULTOS"  
## [36] "CAPACITACIÓN"                                   
## [37] "EMPLEATE"                                       
## [38] "IDEAS.PRODUCTIVAS"                              
## [39] "INDÍGENAS.LEY.8783"                             
## [40] "OBRA.COMUNAL"                                   
## [41] "PENSIONES.ORDINARIAS"                           
## [42] "PENSIONES.LEY.8769"

Quitar los acentos

Quitar las tildes de la variable producto

iconv(cantonal_2017$producto,from="UTF-8",to="ASCII//TRANSLIT") %>% unique()
##  [1] "Construccion.en.Lote.Propio"                    
##  [2] "Compra.de.Lote.y.Construccion"                  
##  [3] "Compra.de.Vivienda.Existente"                   
##  [4] "Ampliacion..Mejoras.y.Terminacion.de.Vivienda"  
##  [5] "TOTAL"                                          
##  [6] "ATENCION.DIRECTA"                               
##  [7] "EQUIPAMIENTO"                                   
##  [8] "CONSTRUCCION"                                   
##  [9] "COMIDAS.SERVIDAS"                               
## [10] "DISTRIBUCION.DE.LECHE"                          
## [11] "DISTRIBUCION.ALIMENTOS.A.FAMILIAS"              
## [12] "NECESIDADES.BASICAS.CENTRO.DIURNO"              
## [13] "NECESIDADES.BASICAS.HOGAR"                      
## [14] "PROGRAMA.ABANDONADOS"                           
## [15] "RED.DE.CUIDO"                                   
## [16] "ACCESO.A.SERVICIOS"                             
## [17] "ALTERNATIVAS.RESIDENCIALES"                     
## [18] "LEY.8783"                                       
## [19] "F.43.GESTION.RIESGO.Y.EMERGENCIA.PRIMARIA"      
## [20] "F.43.POSTSECUNDARIA"                            
## [21] "F.43.PRIMARIA"                                  
## [22] "CONVENIO.GESTION.RIESGO.Y.EMERGENCIA.PRIMARIA"  
## [23] "CONVENIO.GESTION.RIESGO.Y.EMERGENCIA.SECUNDARIA"
## [24] "CONVENIO.POSTSECUNDARIA"                        
## [25] "CONVENIO.PRIMARIA"                              
## [26] "ATENCION.INTEGRAL"                              
## [27] "SUBSIDIO.PARA.SEGUIMIENTO"                      
## [28] "PARQUES.BIOSALUDABLES"                          
## [29] "PROYECTOS1"                                     
## [30] "PROYECTOS2"                                     
## [31] "PREESCOLARES.Y.ESCOLARES"                       
## [32] "COLEGIALES.CENTROS.ACADEMICOS"                  
## [33] "COLEGIALES.CENTROS.TECNICOS"                    
## [34] "ESTUDIANTES.EDUCACION.ESPECIAL"                 
## [35] "ESTUDIANTES.DE.EDUCACION.DE.JOVENES.Y.ADULTOS"  
## [36] "CAPACITACION"                                   
## [37] "EMPLEATE"                                       
## [38] "IDEAS.PRODUCTIVAS"                              
## [39] "INDIGENAS.LEY.8783"                             
## [40] "OBRA.COMUNAL"                                   
## [41] "PENSIONES.ORDINARIAS"                           
## [42] "PENSIONES.LEY.8769"

Tomar casos específicos de strings

Como se puede extraer valores específicos de la columna canton utilizando patrones (expresiones regulares)

Dos o más espacios

str_subset(string = cantonal_2017$CANTON, "^V.+\\s.+$" ) %>% unique()
## [1] "VAZQUEZ DE CORONADO" "VALVERDE VEGA"

Dos o más Espacios con una V al inicio

str_subset(string = cantonal_2017$CANTON, "^V.+\\s.+\\s.+$" ) %>% unique()
## [1] "VAZQUEZ DE CORONADO"

Dos espacioes

str_subset(string = cantonal_2017$CANTON, "^[:alpha:]+\\s[:alpha:]+$") %>% unique()
##  [1] "SAN JOSE"      "SANTA ANA"     "PEREZ ZELEDON" "LEON CORTES"  
##  [5] "SAN RAMON"     "SAN MATEO"     "SAN CARLOS"    "VALVERDE VEGA"
##  [9] "LOS CHILES"    "LA UNION"      "EL GUARCO"     "SANTO DOMINGO"
## [13] "SANTA BARBARA" "SAN RAFAEL"    "SAN ISIDRO"    "SAN PABLO"    
## [17] "SANTA CRUZ"    "LA CRUZ"       "BUENOS AIRES"  "COTO BRUS"

Manipulando una base (Pivotes)

Se importa la tabla del tipo de cambio de compra del BCCR. Se imprimen solo las primeras tres filas de la tabla y observa que en las columnas vienen años y en las filas los días, no obstante ocupamos los años tambien en filas para unirlos con los días y tener dos columnas: una para la fecha y otra para el valor del tipode cambio

tipo_cambio1 <- read_excel("tipo_cambio1.xlsx", 
    skip = 4)
head(tipo_cambio1, 10)
## # A tibble: 10 x 38
##    X__1  `1983` `1984` `1985` `1986` `1987` `1988` `1989` `1990` `1991`
##    <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
##  1 1 Ene   45.4   43.6     48   54.0   59.2   69.8     80   84.8   105.
##  2 2 Ene   45.4   43.6     48   54.0   59.2   69.8     80   84.8   105.
##  3 3 Ene   45.4   43.6     48   54.0   59.2   69.8     80   84.8   105.
##  4 4 Ene   45.4   43.6     48   54.0   59.2   69.8     80   85     105.
##  5 5 Ene   45.4   43.6     48   54.0   59.2   69.8     80   85     105.
##  6 6 Ene   45.4   43.6     48   54.0   59.2   69.8     80   85     105.
##  7 7 Ene   45.4   43.6     48   54.0   59.2   69.8     80   85     105.
##  8 8 Ene   45.4   43.6     48   54.0   59.2   69.8     80   85     105.
##  9 9 Ene   45.4   43.6     48   54.0   59.2   69.8     80   85     105.
## 10 10 E~   45.4   43.6     48   54.0   59.2   69.8     80   85     106.
## # ... with 28 more variables: `1992` <dbl>, `1993` <dbl>, `1994` <dbl>,
## #   `1995` <dbl>, `1996` <dbl>, `1997` <dbl>, `1998` <dbl>, `1999` <dbl>,
## #   `2000` <dbl>, `2001` <dbl>, `2002` <dbl>, `2003` <dbl>, `2004` <dbl>,
## #   `2005` <dbl>, `2006` <dbl>, `2007` <dbl>, `2008` <dbl>, `2009` <dbl>,
## #   `2010` <dbl>, `2011` <dbl>, `2012` <dbl>, `2013` <dbl>, `2014` <dbl>,
## #   `2015` <dbl>, `2016` <dbl>, `2017` <dbl>, `2018` <dbl>, `2019` <dbl>
locale=locale("es")

Pasando los años a filas

Se usa la función gather para pasar los años a una columna (especificamos key = “año” para crear una columna con los años como filas de esa columna; y value = “valor” lo cuál crea una columna llamada “valor” con los valores del tipo de cambio)

tipo_cambio1 %>% gather(key = "año", value ="valor", - `X__1`) %>% head(20)
## # A tibble: 20 x 3
##    X__1   año   valor
##    <chr>  <chr> <dbl>
##  1 1 Ene  1983   45.4
##  2 2 Ene  1983   45.4
##  3 3 Ene  1983   45.4
##  4 4 Ene  1983   45.4
##  5 5 Ene  1983   45.4
##  6 6 Ene  1983   45.4
##  7 7 Ene  1983   45.4
##  8 8 Ene  1983   45.4
##  9 9 Ene  1983   45.4
## 10 10 Ene 1983   45.4
## 11 11 Ene 1983   45.4
## 12 12 Ene 1983   45.4
## 13 13 Ene 1983   45.4
## 14 14 Ene 1983   45.4
## 15 15 Ene 1983   45.4
## 16 16 Ene 1983   45.4
## 17 17 Ene 1983   45.4
## 18 18 Ene 1983   45.4
## 19 19 Ene 1983   45.4
## 20 20 Ene 1983   45.4

Seperando una columna en dos

Podemos la columna X__1 que contiene el día y el mes en dos columnas, una con el día y otra con el mes. Se utiliza el comando separate especificando el nombre de la columna que queremos separara **X__1**, el nombre de las dos columnas nuevas y el caracter por el cual están separados (un espacio en blanco). Se imprimen los primeros elementos de la tabla

tipo_cambio1 %>% gather(key = "año", value ="valor", - `X__1`) %>% separate(X__1, c("día", "mes"), sep = " ") %>% head()
## # A tibble: 6 x 4
##   día   mes   año   valor
##   <chr> <chr> <chr> <dbl>
## 1 1     Ene   1983   45.4
## 2 2     Ene   1983   45.4
## 3 3     Ene   1983   45.4
## 4 4     Ene   1983   45.4
## 5 5     Ene   1983   45.4
## 6 6     Ene   1983   45.4

Analizando la base

Este código contiene los código hechos hasta el momento en la primera línea. En la segunda se cambia en la variable mes “Set” por “Sept” en todas las filas y se añade un punto al final del mes. En la tercera parte del código se crea una varialbe llamada fecha con la fecha completa. Se crea una variable grupo1 que especifica el pimer día de cada mes, esto con el fin de tomar el promedio por mes. También se crea grupo2 con el primer día del cuatrimestre para luego tomar el promedio del cuatrimestre

base_lista <- tipo_cambio1 %>% gather(key = "año", value ="valor", - `X__1`) %>% separate(X__1, c("día", "mes"), sep = " ")

base_lista <- base_lista %>% mutate(mes = str_replace(mes, "Set", "Sept" )) %>% mutate(mes = paste(mes, ".", sep =""))

base_lista <- base_lista %>% mutate(fecha = parse_date(tolower(paste(`año`, mes, `día`)),"%Y %b %d",locale=locale("es"))) %>% mutate(grupo1 = floor_date(fecha, unit = "month")) %>% mutate(grupo2 = floor_date(fecha, unit = "quarter"))

head(base_lista, 15)
## # A tibble: 15 x 7
##    día   mes   año   valor fecha      grupo1     grupo2    
##    <chr> <chr> <chr> <dbl> <date>     <date>     <date>    
##  1 1     Ene.  1983   45.4 1983-01-01 1983-01-01 1983-01-01
##  2 2     Ene.  1983   45.4 1983-01-02 1983-01-01 1983-01-01
##  3 3     Ene.  1983   45.4 1983-01-03 1983-01-01 1983-01-01
##  4 4     Ene.  1983   45.4 1983-01-04 1983-01-01 1983-01-01
##  5 5     Ene.  1983   45.4 1983-01-05 1983-01-01 1983-01-01
##  6 6     Ene.  1983   45.4 1983-01-06 1983-01-01 1983-01-01
##  7 7     Ene.  1983   45.4 1983-01-07 1983-01-01 1983-01-01
##  8 8     Ene.  1983   45.4 1983-01-08 1983-01-01 1983-01-01
##  9 9     Ene.  1983   45.4 1983-01-09 1983-01-01 1983-01-01
## 10 10    Ene.  1983   45.4 1983-01-10 1983-01-01 1983-01-01
## 11 11    Ene.  1983   45.4 1983-01-11 1983-01-01 1983-01-01
## 12 12    Ene.  1983   45.4 1983-01-12 1983-01-01 1983-01-01
## 13 13    Ene.  1983   45.4 1983-01-13 1983-01-01 1983-01-01
## 14 14    Ene.  1983   45.4 1983-01-14 1983-01-01 1983-01-01
## 15 15    Ene.  1983   45.4 1983-01-15 1983-01-01 1983-01-01

Promedio por año

Se usa la función group_by para agrupar los valores la variable año y luego la función summarise para tomar el promedio (mean) de la variable valor (osea del tipo de cambio). Observen que quedan valor NA porque no que en los años biciestos la base de datos original tendrá valores NA en los días 29 de febrero. En el código del siguiente slide especifíco mean(valor, na.rm =T) dentro del summairse para que omita estos valores NA.

base_lista %>% group_by(año) %>% summarise(mean(valor)) #ojo los años biciestos
## # A tibble: 37 x 2
##    año   `mean(valor)`
##    <chr>         <dbl>
##  1 1983           NA  
##  2 1984           44.8
##  3 1985           NA  
##  4 1986           NA  
##  5 1987           NA  
##  6 1988           76.3
##  7 1989           NA  
##  8 1990           NA  
##  9 1991           NA  
## 10 1992          135. 
## # ... with 27 more rows

Analizando la base: estadísticas por año

Podría quitar los días adicionales de los años biciestos, o si estoy seguro que son los únicos NA nada más le digo al programam que los omita en el cálculo

base_lista <- base_lista %>% filter(!is.na(valor))

base_lista %>% group_by(`año`) %>% summarise(promedio=mean(valor, na.rm = T), desviacion = sd(valor, na.rm = T)) %>% head()
## # A tibble: 6 x 3
##   año   promedio desviacion
##   <chr>    <dbl>      <dbl>
## 1 1983      44.1      0.861
## 2 1984      44.8      1.60 
## 3 1985      50.7      1.80 
## 4 1986      56.3      1.58 
## 5 1987      63.2      2.97 
## 6 1988      76.3      2.43

ültimos años

Un vistazo a las últimas filas de la tabla (hasta ahora solo he imprimido en la pantalla las primeras filas)

base_lista %>% group_by(`año`) %>% summarise(promedio=mean(valor, na.rm = T), desviacion = sd(valor, na.rm = T)) %>% tail()
## # A tibble: 6 x 3
##   año   promedio desviacion
##   <chr>    <dbl>      <dbl>
## 1 2014      545.      13.7 
## 2 2015      541.       1.96
## 3 2016      551.       7.64
## 4 2017      572.       6.27
## 5 2018      580.      15.7 
## 6 2019      606.       6.85

agrupando por mes y año

Realizando una tabla con el promedio por año y por mes (ojo que dentro de del group_by ahora además del año tenemos grupo1, osea el mes.)

mes <- base_lista %>% group_by(`año`, grupo1) %>% summarise(promedio=mean(valor, na.rm = T), desviacion = sd(valor, na.rm = T), mes = unique(mes)) 
mes
## # A tibble: 437 x 5
## # Groups:   año [?]
##    año   grupo1     promedio desviacion mes  
##    <chr> <date>        <dbl>      <dbl> <chr>
##  1 1983  1983-01-01     45.4     0.0798 Ene. 
##  2 1983  1983-02-01     45.2     0.0489 Feb. 
##  3 1983  1983-03-01     44.9     0.105  Mar. 
##  4 1983  1983-04-01     44.7     0.0365 Abr. 
##  5 1983  1983-05-01     44.6     0.0150 May. 
##  6 1983  1983-06-01     44.5     0.305  Jun. 
##  7 1983  1983-07-01     43.6     0      Jul. 
##  8 1983  1983-08-01     43.6     0      Ago. 
##  9 1983  1983-09-01     43.3     0.450  Sept.
## 10 1983  1983-10-01     42.6     0      Oct. 
## # ... with 427 more rows

Estacionalidad

Se grafica la tabla anterior a partir del año 2013 para ver como varia el promedio por mes para cada año. Se usa el paquete ggplot.

mes %>% filter(año > 2013)%>% ggplot(aes(x = año, y = promedio, color = mes, group = mes))+geom_line()