En general, cuando hacemos nuestro código querremos verificar que nuestras librerías estén instaladas. Si actualizamos nuestro R y Rstudio es probable (sobre todo en MAC) que hayamos perdido alguno.
Este es un ejemplo de un código. Listamos los paquetes que sabemos que usamos en nuestro código en un vector
paquetes<-c("foreign","tidyverse", "sjlabelled", "stargazer", "sjPlot", "survey", "questionr")
Y con este código instalamos los paquetes del vector
nuevos.paquetes<- paquetes[!(paquetes %in% installed.packages()[,"Package"])]
if(length(nuevos.paquetes)) install.packages(nuevos.paquetes, dependencies = T)
¡Recuerda establecer tu directorio!
setwd("/Users/anaescoto/Dropbox/2019/Cursos ESA/UCA_R")
Hay muchos formatos de almacenamiento de bases de datos. Vamos a aprender a importar información desde ellos.
El paquete más compatible con RStudio es readxl. A veces, otros paquetes tienen más problemas de configuración entre R y el Java.
library(readxl) # Recuerda que hay llamar al paquete
Vamos a trabajar con el “Índice de Precios al Consumidor” (mayor info aquí).
Cuando trabajamos con consultas en banco de datos, a veces queremos aplicar un formato más amigable a las bases de datos
IPC <- read_excel("./datos/IPC.xlsx", sheet = "para_importar")
#View(IPC)
Como el nombre de paquete lo indica, sólo lee. Para escribir en este formato, recomiendo el paquete “openxlsx”. Lo instalamos anteriormente.
library(openxlsx)
Si quisiéramos exportar un objeto a Excel
openxlsx::write.xlsx(IPC, file = "Mi_Exportación.xlsx")
## Note: zip::zip() is deprecated, please use zip::zipr() instead
Si bien también se puede realizar desde el paquete foreign. Pero este no importa algunas características como las etiquetas y tampoco funciona con las versiones más nuevas de STATA. Vamos a instalar otro paquete, compatible con el mundo tidyverse.
library(haven) #¡Recuerda llamar el paquete!
Recuerda que no hay que instalarlo (viene adentro de tidyverse). Se instalasólo la primera vez. Una vez instalado un paquete, lo llamamos con el comando “library”
ehpm2017 <- read_dta("datos/ehpm2017.dta")
!Importante, a R no le gustan los objetos con nombres que empiezan en números
El paquete haven sí exporta información.
write_dta(ehpm2017 , "datos/mi_exportación.dta", version = 12)
Con SSPS es muy parecido. Dentro de “haven” hay una función específica para ello.
ehpm_2016_sec01 <- read_sav("datos/EHPM 2016 SEC01.sav")
Para escribir
write_sav(ehpm_2016_sec01 , "mi_exportacion.sav")
Checa que en todas las exportaciones en los nombres hay que incluir la extensión del programa. Si quieres guardar en un lugar diferente al directorio del trabajo, hay que escribir toda la ruta dentro de la computadora.
Recordemos nuestra base importada desde .dbf
library(foreign) #Recuerda llamar la librería!
sdemt119<-read.dbf("./datos/SDEMT119.dbf")
Vamos a revisar la base, brevemente la base
class(sdemt119) # tipo de objeto
## [1] "data.frame"
names(sdemt119) # lista las variables
## [1] "R_DEF" "LOC" "MUN" "EST" "EST_D"
## [6] "AGEB" "T_LOC" "CD_A" "ENT" "CON"
## [11] "UPM" "D_SEM" "N_PRO_VIV" "V_SEL" "N_HOG"
## [16] "H_MUD" "N_ENT" "PER" "N_REN" "C_RES"
## [21] "PAR_C" "SEX" "EDA" "NAC_DIA" "NAC_MES"
## [26] "NAC_ANIO" "L_NAC_C" "CS_P12" "CS_P13_1" "CS_P13_2"
## [31] "CS_P14_C" "CS_P15" "CS_P16" "CS_P17" "N_HIJ"
## [36] "E_CON" "CS_AD_MOT" "CS_P20_DES" "CS_AD_DES" "CS_NR_MOT"
## [41] "CS_P22_DES" "CS_NR_ORI" "UR" "ZONA" "SALARIO"
## [46] "FAC" "CLASE1" "CLASE2" "CLASE3" "POS_OCU"
## [51] "SEG_SOC" "RAMA" "C_OCU11C" "ING7C" "DUR9C"
## [56] "EMPLE7C" "MEDICA5C" "BUSCAR5C" "RAMA_EST1" "RAMA_EST2"
## [61] "DUR_EST" "AMBITO1" "AMBITO2" "TUE1" "TUE2"
## [66] "TUE3" "BUSQUEDA" "D_ANT_LAB" "D_CEXP_EST" "DUR_DES"
## [71] "SUB_O" "S_CLASIFI" "REMUNE2C" "PRE_ASA" "TIP_CON"
## [76] "DISPO" "NODISPO" "C_INAC5C" "PNEA_EST" "NIV_INS"
## [81] "EDA5C" "EDA7C" "EDA12C" "EDA19C" "HIJ5C"
## [86] "DOMESTICO" "ANIOS_ESC" "HRSOCUP" "INGOCUP" "ING_X_HRS"
## [91] "TPG_P8A" "TCCO" "CP_ANOC" "IMSSISSSTE" "MA48ME1SM"
## [96] "P14APOYOS" "SCIAN" "T_TRA" "EMP_PPAL" "TUE_PPAL"
## [101] "TRANS_PPAL" "MH_FIL2" "MH_COL" "SEC_INS"
head(sdemt119) # muestra las primeras 6 líneas
## R_DEF LOC MUN EST EST_D AGEB T_LOC CD_A ENT CON UPM D_SEM
## 1 00 0001 002 10 117 00000 1 01 09 40001 0900471 101
## 2 00 0001 002 10 117 00000 1 01 09 40001 0900471 101
## 3 00 0001 002 10 117 00000 1 01 09 40001 0900471 101
## 4 00 0001 002 10 117 00000 1 01 09 40001 0900471 101
## 5 00 0001 002 10 117 00000 1 01 09 40001 0900471 101
## 6 00 0001 002 10 117 00000 1 01 09 40001 0900471 101
## N_PRO_VIV V_SEL N_HOG H_MUD N_ENT PER N_REN C_RES PAR_C SEX EDA NAC_DIA
## 1 0001 01 1 0 1 119 01 1 101 1 46 27
## 2 0001 01 1 0 1 119 02 1 201 2 48 15
## 3 0001 01 1 0 1 119 03 1 301 1 16 05
## 4 0001 01 1 0 1 119 04 1 301 2 12 12
## 5 0001 01 1 0 1 119 05 1 415 2 76 10
## 6 0023 02 1 0 1 119 01 1 101 2 43 11
## NAC_MES NAC_ANIO L_NAC_C CS_P12 CS_P13_1 CS_P13_2 CS_P14_C CS_P15 CS_P16
## 1 12 1972 009 1 06 2 2814 2 1
## 2 01 1970 009 1 07 4 5313 3 1
## 3 12 2002 009 1 03 3 <NA> <NA> <NA>
## 4 06 2006 009 1 02 6 <NA> <NA> <NA>
## 5 12 1942 300 1 07 3 5711 3 2
## 6 08 1975 009 1 07 4 5441 3 1
## CS_P17 N_HIJ E_CON CS_AD_MOT CS_P20_DES CS_AD_DES CS_NR_MOT CS_P22_DES
## 1 2 <NA> 5 <NA> <NA> <NA> <NA> <NA>
## 2 2 02 5 <NA> <NA> <NA> <NA> <NA>
## 3 1 <NA> 6 <NA> <NA> <NA> <NA> <NA>
## 4 1 00 6 <NA> <NA> <NA> <NA> <NA>
## 5 2 05 4 <NA> <NA> <NA> <NA> <NA>
## 6 2 03 6 <NA> <NA> <NA> <NA> <NA>
## CS_NR_ORI UR ZONA SALARIO FAC CLASE1 CLASE2 CLASE3 POS_OCU SEG_SOC RAMA
## 1 <NA> 1 2 3080 475 1 1 1 2 2 4
## 2 <NA> 1 2 3080 475 1 1 1 1 1 3
## 3 <NA> 1 2 3080 475 2 4 0 0 0 0
## 4 <NA> 1 2 3080 475 2 4 0 0 0 0
## 5 <NA> 1 2 3080 475 2 4 0 0 0 0
## 6 <NA> 1 2 3080 475 1 1 1 1 1 4
## C_OCU11C ING7C DUR9C EMPLE7C MEDICA5C BUSCAR5C RAMA_EST1 RAMA_EST2
## 1 3 7 8 2 1 4 3 6
## 2 3 7 3 5 3 4 3 5
## 3 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0
## 6 4 7 3 6 3 2 3 11
## DUR_EST AMBITO1 AMBITO2 TUE1 TUE2 TUE3 BUSQUEDA D_ANT_LAB D_CEXP_EST
## 1 5 2 3 1 2 0 2 0 0
## 2 3 2 5 1 1 0 2 0 0
## 3 0 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0 0
## 6 3 2 7 2 4 2 2 0 0
## DUR_DES SUB_O S_CLASIFI REMUNE2C PRE_ASA TIP_CON DISPO NODISPO C_INAC5C
## 1 0 0 0 0 0 0 0 0 0
## 2 0 0 0 1 1 3 0 0 0
## 3 0 0 0 0 0 0 0 3 1
## 4 0 0 0 0 0 0 0 3 1
## 5 0 0 0 0 0 0 0 3 2
## 6 0 1 5 1 1 2 0 0 0
## PNEA_EST NIV_INS EDA5C EDA7C EDA12C EDA19C HIJ5C DOMESTICO ANIOS_ESC
## 1 0 3 3 4 7 12 0 4 11
## 2 0 4 3 4 7 12 2 3 16
## 3 4 3 1 1 1 6 0 8 9
## 4 4 2 0 0 0 5 1 8 6
## 5 4 4 4 6 11 18 3 8 15
## 6 0 4 2 4 6 11 3 3 16
## HRSOCUP INGOCUP ING_X_HRS TPG_P8A TCCO CP_ANOC IMSSISSSTE MA48ME1SM
## 1 65 0 0 0 0 0 4 0
## 2 24 0 0 0 0 0 1 0
## 3 0 0 0 0 0 0 0 0
## 4 0 0 0 0 0 0 0 0
## 5 0 0 0 0 0 0 0 0
## 6 24 0 0 1 0 0 2 0
## P14APOYOS SCIAN T_TRA EMP_PPAL TUE_PPAL TRANS_PPAL MH_FIL2 MH_COL
## 1 0 18 1 2 2 0 3 6
## 2 0 6 1 2 2 0 3 2
## 3 0 0 1 0 0 0 0 0
## 4 0 0 1 0 0 0 0 0
## 5 0 0 1 0 0 0 0 0
## 6 0 20 1 2 2 0 3 2
## SEC_INS
## 1 4
## 2 2
## 3 0
## 4 0
## 5 0
## 6 5
table(sdemt119$CLASE2) # un tabulado simple
##
## 0 1 2 3 4
## 84634 176997 6326 18681 119398
library(dplyr)
##
## 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
Operador de “pipe” o “tubería” %>% (Ctrl+Shift+M) Antes de continuar, presentemos el operador “pipe” %>%. dplyr importa este operador de otro paquete (magrittr). Este operador le permite canalizar la salida de una función a la entrada de otra función. En lugar de funciones de anidamiento (lectura desde adentro hacia afuera), la idea de la tubería es leer las funciones de izquierda a derecha.
ehpm2017 %>%
select(r103, money) %>%
head
## # A tibble: 6 x 2
## r103 money
## <dbl+lbl> <dbl>
## 1 1 [Jefe(a)] 0
## 2 7 [Nieto(a)] 420.
## 3 9 [Otros familiares] 0
## 4 9 [Otros familiares] 0
## 5 11 [Otros] 0
## 6 1 [Jefe(a)] 0
ehpm2017 %>%
select(r103, money) %>%
glimpse
## Observations: 75,133
## Variables: 2
## $ r103 <dbl+lbl> 1, 7, 9, 9, 11, 1, 1, 2, 3, 3, 3, 5, 9, 1, 2, 3, 3, 1,…
## $ money <dbl> 0.00, 420.38, 0.00, 0.00, 0.00, 0.00, 600.00, 433.33, 270.…
Podemos ver que los objetos “data.frame”(spoiler, ya hablaremos de ellos), tiene una clase que se llama “haven_labelled”
class(ehpm2017$r104)
## [1] "haven_labelled"
class(ehpm_2016_sec01$r104)
## [1] "haven_labelled"
¿Esto que significa? Que en el programa original hay alguna etiqueta que podemos usar.
library(sjlabelled)
##
## Attaching package: 'sjlabelled'
## The following object is masked from 'package:dplyr':
##
## as_label
## The following objects are masked from 'package:haven':
##
## as_factor, read_sas, read_spss, read_stata, write_sas,
## zap_labels
table(ehpm2017$r104)
##
## 1 2
## 35538 39595
table(as_label(ehpm2017$r104))
##
## Hombre Mujer
## 35538 39595
Desde el portal de datos.org.sv tenemos acceso a directo a varias fuentes de información.
Leeremos parte de esa información
Vamos a importar a un objeto la información del censos escolar 2017 https://datos.gob.sv/dataset/centros-educativos
library(readr) #librería para leer archivos desde .csv
matricula_inicial_2017 <- read_csv("https://datos.gob.sv/dataset/7f750755-a7e6-4bf3-969e-edbe26b6bb45/resource/dfe2dc78-a530-4491-bdea-1a53c91e68e1/download/matricula-inicial-2017.csv")
## Parsed with column specification:
## cols(
## .default = col_double(),
## CE = col_character(),
## SECTOR = col_character(),
## ZONA = col_character(),
## MODALIDAD = col_character(),
## DEPARTAMENTO = col_character(),
## MUNICIPIO = col_character()
## )
## See spec(...) for full column specifications.
#View(matricula_inicial_2017)
¡Sin resolución! Escoja una base de <datos.org.sv> Replique la exploración de la práctica * Utilice al menos un comando con dplyr
Mandar el código a la siguiente liga: https://tinyurl.com/Ej2-ESA-R