Sergio
28/5/2019
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
Asumo una base de datos disponible
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>
## [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 las tildes de la variable producto
## [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"
Como se puede extraer valores específicos de la columna canton utilizando patrones (expresiones regulares)
Dos o más espacios
## [1] "VAZQUEZ DE CORONADO" "VALVERDE VEGA"
Dos o más Espacios con una V al inicio
## [1] "VAZQUEZ DE CORONADO"
Dos espacioes
## [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"
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
## # 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>
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)
## # 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
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
## # 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
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
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.
## # 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
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
Un vistazo a las últimas filas de la tabla (hasta ahora solo he imprimido en la pantalla las primeras filas)
## # 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
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
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.