Consejo para escribir “código”"

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)

Importando más datos

¡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.

Desde Excel

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

Desde STATA y SPSS

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

Revisión con dplyr

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.…

Etiquetas importadas y cómo usarlas

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

Leer desde archivos de texto y desde una url

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)

Ejercicio

¡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