ULTIMA ACTUALIZACIÓN:
La última actualización de este artículo se realizó el 3 de November del 2019.
Para subir una base de datos (BD), debes antes haber instalado una serie de paquetes que permiten leer la base de datos sin importar en que formato este. Existen varios paquetes que nos pueden ayudar con eso. En este tutorial trabajaremos con rio
, que nos permite abrir distintos tipos de base de datos con facilidad.
Segundo, llamamos a nuestra base de datos.
IMPORTANTE antes de interacturar con folders (subir data, grabar resultados, gráficos, etc) tienes que establecer tu directorio de trabajo. La forma más rápida es con la rueda con la etiqueta “more” en el panel derecho.
La base de datos debe estar en nuestro espacio de trabajo.
La Base de Datos que usaremos es una muestra de 1000 casos de la base sumaria-2018.dta de ENAHO - PERU (Encuesta Nacional de Hogares del Peru) del 2017. Aquí esta el link de donde pueden descargarla en formato STATA. Tenemos informacion sobre ingresos, y gastos de los hogares en Perú.
Dado que tenemos el paquete rio
, no necesitamos decirle a R que nuestra base de datos está en STATA, R lo entiende.
Vamos a usar la función import()
y asignarle un nombre a nuestra base de datos. Lo llamaremos s2018
. Abajo podemos ver las primeras 4 variables y primeras 10 observaciones.
Podemos usar head()
en nuestra data para ver las primeras seis observaciones. Debido a que esta data cuenta con 158 columnas, usamos [,1:5]
para que nos muestre sólo las 5 primeras.
## aÑo mes nconglome conglome vivienda
## 1 2018 06 021521 007584 078
## 2 2018 02 033493 006483 274
## 3 2018 10 039710 010344 056
## 4 2018 08 000909 008845 136
## 5 2018 04 015685 009752 010
## 6 2018 09 018285 006146 027
Siempre es bueno mirar la base de datos con la cual estamos trabajando para darnos una idea mas concreta de que estamos haciendo. Primero debemos saber con que tipo de objeto estamos lidiando. La función str()
nos brinda informaciòn útil sobre el objeto en cuestión y sus elementos. En el siguiente código, usamos [,1:6]
para limitar la vista a las 6 primeras variables
## 'data.frame': 1000 obs. of 6 variables:
## $ aÑo : chr "2018" "2018" "2018" "2018" ...
## ..- attr(*, "label")= chr "año de la encuesta"
## ..- attr(*, "format.stata")= chr "%4s"
## $ mes : chr "06" "02" "10" "08" ...
## ..- attr(*, "label")= chr "mes de ejecución de la encuesta"
## ..- attr(*, "format.stata")= chr "%2s"
## $ nconglome: chr "021521" "033493" "039710" "000909" ...
## ..- attr(*, "label")= chr "número de conglomerado (proveniente del marco)"
## ..- attr(*, "format.stata")= chr "%6s"
## $ conglome : chr "007584" "006483" "010344" "008845" ...
## ..- attr(*, "label")= chr "número de conglomerado"
## ..- attr(*, "format.stata")= chr "%6s"
## $ vivienda : chr "078" "274" "056" "136" ...
## ..- attr(*, "label")= chr "número de selección de vivienda"
## ..- attr(*, "format.stata")= chr "%3s"
## $ hogar : chr "11" "11" "11" "12" ...
## ..- attr(*, "label")= chr "número secuencial del hogar"
## ..- attr(*, "format.stata")= chr "%2s"
Vemos que las variables son de tipo ‘chr’, que quiere decir character o texto. Asimismo, podemos ver que cada variable cuenta con dos espacios de attr()
, estos son sus atributos. Más adelante veremos qué son y cómo utilizarlos. También vemos que el objeto s2018
es un data.frame
.
## [1] TRUE
En este caso s2018
es un objeto de tipo data.frame
, por lo que tiene dos dimensiones, saber esto es importante por que así podemos manipularlas. La función dim()
nos permite ver ambas. El primer número se refiere a la cantidad de observaciones o casos (las filas) y el segundo a la cantidad de variables (las columnas).
## [1] 1000 158
En el código debajo estamos seleccionando los 20 primeros casos (1:20), y las tres primeras variables (1:3). Conocer las dimensiones es útil para luego filtrar la base de datos.
## aÑo mes nconglome
## 1 2018 06 021521
## 2 2018 02 033493
## 3 2018 10 039710
## 4 2018 08 000909
## 5 2018 04 015685
## 6 2018 09 018285
## 7 2018 08 011964
## 8 2018 04 030180
## 9 2018 06 009642
## 10 2018 03 032546
## 11 2018 11 035275
## 12 2018 07 004174
## 13 2018 05 014759
## 14 2018 06 044238
## 15 2018 06 032325
## 16 2018 05 013461
## 17 2018 05 007615
## 18 2018 08 011434
## 19 2018 10 042844
## 20 2018 07 014755
Si eres ansioso y quieres ver toda la base de datos puedes usar el siguiente código:
Podriamos mirar una muestra de nuestra base de datos con la opcion head. Abajo, le pedimos que nos puestre las 300 primeras observaciones.
La función import()
de rio permite subir archivos en distintos formatos. Existen otros paquetes como foreign
que también hacen lo mismo. Pero rio
me parece más conveniente.
En esta secciones aprenderemos algunas de los pasos mas frecuentes que hacemos al encontrarnos con una nueva base de datos: limpiar y manipular algunas variables para que pueda analizarse. Debemos limpiar nuestra base de datos por muchas razones; quizas para calcular las variables que queremos, para desacernos de grupos de observaciones que no nos interesan o para hacer mas fácil el juntar nuestra base de datos con otras.
Podemos llamar nuestras variables en la BD con la función names()
o también ls()
## [1] "aÑo" "mes" "nconglome" "conglome" "vivienda"
## [6] "hogar" "ubigeo" "dominio" "estrato" "percepho"
## [11] "mieperho" "totmieho" "ia01hd" "ia02hd" "ig03hd1"
## [16] "ig03hd2" "ig03hd3" "ig03hd4" "ga03hd" "ga04hd"
## [21] "sg23" "sig24" "sg25" "sig26" "sg42"
## [26] "sg421" "sg422" "sg423" "sg42d" "sg42d1"
## [31] "sg42d2" "sg42d3" "ingbruhd" "ingnethd" "pagesphd"
## [36] "ingindhd" "ingauthd" "insedthd" "insedlhd" "paesechd"
## [41] "ingseihd" "isecauhd" "ingexthd" "ingtrahd" "ingtexhd"
## [46] "ingrenhd" "ingoexhd" "g05hd" "ig06hd" "g05hd1"
## [51] "ig06hd1" "g05hd2" "ig06hd2" "g05hd3" "ig06hd3"
## [56] "g05hd4" "ig06hd4" "g05hd5" "ig06hd5" "g05hd6"
## [61] "ig06hd6" "g07hd" "ig08hd" "ingtprhd" "ingtpuhd"
## [66] "ingtpu01" "ingtpu02" "ingtpu03" "ingtpu04" "ingtpu05"
## [71] "gru11hd" "gru12hd1" "gru12hd2" "gru13hd1" "gru13hd2"
## [76] "gru13hd3" "gru13hd4" "gru14hd" "gru14hd1" "gru14hd2"
## [81] "gru14hd3" "gru14hd4" "gru14hd5" "gru14hd6" "gru21hd"
## [86] "gru22hd1" "gru22hd2" "gru23hd1" "gru23hd2" "gru23hd3"
## [91] "gru24hd" "gru31hd" "gru32hd1" "gru32hd2" "gru33hd1"
## [96] "gru33hd2" "gru33hd3" "gru34hd" "gru41hd" "gru42hd1"
## [101] "gru42hd2" "gru43hd1" "gru43hd2" "gru43hd3" "gru44hd"
## [106] "gru51hd" "gru52hd1" "gru53hd1" "gru53hd2" "gru53hd3"
## [111] "gru53hd4" "gru54hd" "gru61hd" "gru62hd1" "gru62hd2"
## [116] "gru63hd1" "gru63hd2" "gru63hd3" "gru64hd" "gru71hd"
## [121] "gru72hd1" "gru72hd2" "gru73hd1" "gru73hd2" "gru73hd3"
## [126] "gru74hd" "gru81hd" "gru82hd1" "gru82hd2" "gru83hd1"
## [131] "gru83hd2" "gru83hd3" "gru83hd4" "gru84hd" "gru84hd1"
## [136] "gru85hd1" "gru86hd1" "gru86hd2" "gru87hd" "ingotrhd"
## [141] "ingmo1hd" "ingmo2hd" "inghog1d" "inghog2d" "gashog1d"
## [146] "gashog21" "gashog22" "gashog23" "gashog24" "gashog26"
## [151] "gashog25" "gashog2d" "ld" "estrsocial" "linpe"
## [156] "linea" "pobreza" "factor07"
## [1] "aÑo" "conglome" "dominio" "estrato" "estrsocial"
## [6] "factor07" "g05hd" "g05hd1" "g05hd2" "g05hd3"
## [11] "g05hd4" "g05hd5" "g05hd6" "g07hd" "ga03hd"
## [16] "ga04hd" "gashog1d" "gashog21" "gashog22" "gashog23"
## [21] "gashog24" "gashog25" "gashog26" "gashog2d" "gru11hd"
## [26] "gru12hd1" "gru12hd2" "gru13hd1" "gru13hd2" "gru13hd3"
## [31] "gru13hd4" "gru14hd" "gru14hd1" "gru14hd2" "gru14hd3"
## [36] "gru14hd4" "gru14hd5" "gru14hd6" "gru21hd" "gru22hd1"
## [41] "gru22hd2" "gru23hd1" "gru23hd2" "gru23hd3" "gru24hd"
## [46] "gru31hd" "gru32hd1" "gru32hd2" "gru33hd1" "gru33hd2"
## [51] "gru33hd3" "gru34hd" "gru41hd" "gru42hd1" "gru42hd2"
## [56] "gru43hd1" "gru43hd2" "gru43hd3" "gru44hd" "gru51hd"
## [61] "gru52hd1" "gru53hd1" "gru53hd2" "gru53hd3" "gru53hd4"
## [66] "gru54hd" "gru61hd" "gru62hd1" "gru62hd2" "gru63hd1"
## [71] "gru63hd2" "gru63hd3" "gru64hd" "gru71hd" "gru72hd1"
## [76] "gru72hd2" "gru73hd1" "gru73hd2" "gru73hd3" "gru74hd"
## [81] "gru81hd" "gru82hd1" "gru82hd2" "gru83hd1" "gru83hd2"
## [86] "gru83hd3" "gru83hd4" "gru84hd" "gru84hd1" "gru85hd1"
## [91] "gru86hd1" "gru86hd2" "gru87hd" "hogar" "ia01hd"
## [96] "ia02hd" "ig03hd1" "ig03hd2" "ig03hd3" "ig03hd4"
## [101] "ig06hd" "ig06hd1" "ig06hd2" "ig06hd3" "ig06hd4"
## [106] "ig06hd5" "ig06hd6" "ig08hd" "ingauthd" "ingbruhd"
## [111] "ingexthd" "inghog1d" "inghog2d" "ingindhd" "ingmo1hd"
## [116] "ingmo2hd" "ingnethd" "ingoexhd" "ingotrhd" "ingrenhd"
## [121] "ingseihd" "ingtexhd" "ingtprhd" "ingtpu01" "ingtpu02"
## [126] "ingtpu03" "ingtpu04" "ingtpu05" "ingtpuhd" "ingtrahd"
## [131] "insedlhd" "insedthd" "isecauhd" "ld" "linea"
## [136] "linpe" "mes" "mieperho" "nconglome" "paesechd"
## [141] "pagesphd" "percepho" "pobreza" "sg23" "sg25"
## [146] "sg42" "sg421" "sg422" "sg423" "sg42d"
## [151] "sg42d1" "sg42d2" "sg42d3" "sig24" "sig26"
## [156] "totmieho" "ubigeo" "vivienda"
Por ejemplo la variable inghog1d
(posición 141) es el ingreso bruto anual queremos cambiar el nombre a “ingreso_bruto”.
La forma más rápida es:
Si no tenemos la ubicación, quizás son miles de variables, podemos también usar
names(s2018[names(s2018) == "inghog1d"]) <-"ingreso_bruto"
# Si ya corriste el código anterior este te va a dar error, ya que
# está buscando un nombre que no existe ;)
Pedimos el nombre de variables denuevo
## [1] "ingotrhd" "ingreso_bruto" "ingmo2hd" "inghog1d"
## [5] "inghog2d" "gashog1d"
Etiquetas
Si subimos la base de datos desde STATA, estas pueden tener etiquetas.
Por ejemplo, veamos la etiqueta de nuestra variables “ingreso_bruto”
## [1] "ingreso monetario (bruto)"
Queremos cambiarla a “ingreso monetario (bruto) anual”
attributes(s2018$ingreso_bruto)$label<-"ingreso monetario (bruto) anual"
#Veamos el cambio!
attributes(s2018$ingreso_bruto)$label
## [1] "ingreso monetario (bruto) anual"
Ahora recodificaremos los valores de la variable con que estamos trabajando.
Usamos la funcion abajo para ver los valores y las etiquetas de la variable que creamos.
## a b c d e rural
## 1 2 3 4 5 6
Queremos recodificar los valores de rural de 6 a 0.
Si pedimos una tabla vemos que el cambio se realizo:
##
## 0 1 2 3 4 5
## 383 17 34 81 226 259
Pero las etiquetas siguen mostrando el orden anterior
## a b c d e rural
## 1 2 3 4 5 6
## a b c d e rural
## 0 2 3 4 5 6
Ahora vamos a generar distintos tipos de variables. Empecemos con una variable dicotomica. Vamos a usar informacion sobre el ingreso reportado
Generemos una variable que toma el valor de 1 si es que el informante gana más de 800 soles y 0 si es menos o igual. Creamos una variable vacia y le incluimos los argumentos:
s2018$minimo<-NA
s2018[s2018$ingreso_bruto<=800,]$minimo<-0
s2018[s2018$ingreso_bruto>800,]$minimo<-1
table(s2018$minimo)
##
## 0 1
## 16 984
##
## 0 1
## 16 984
Dplyr es un paquete que es muy útil para manipular data, es relativamente nuevo y cada vez está siendo más usado.
Dplyr y Tydir son muy populares, así que es bueno ir familiarizandose con ellos.
Lo especial de Dplyr es que tiene sus propias funciones y además que conecta funciones usando %>%. De esa manera puede ser más eficiente con el espacio de trabajo, evitando crear muchos objetos.
En este caso la función es mutate
##
## 0 1
## 16 984
Por ejemplo queremos calcular el promedio de cada grupo. Usaremos dplyr para calcular el promedio de ingreso y la desviación estandar por cada ubigeo (municipalidad)
arrange()
es para ordernar los ubigeosselect()
para quedarnos con algunas variables (son más de 150)head()
para pedir los 6 primeros casos.s2018%>%group_by(ubigeo)%>%
mutate(promedio=mean(ingreso_bruto),
desv=sd(ingreso_bruto))%>%
arrange(ubigeo)%>%
select(c(1:3,160,161))%>%head()
## Adding missing grouping variables: `ubigeo`
## # A tibble: 6 x 6
## # Groups: ubigeo [3]
## ubigeo aÑo mes nconglome promedio desv
## <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 010101 2018 10 007100 80756. 43287.
## 2 010101 2018 06 007066 80756. 43287.
## 3 010112 2018 12 007151 22392 NA
## 4 010201 2018 08 006599 10520. 4929.
## 5 010201 2018 04 006618 10520. 4929.
## 6 010201 2018 08 006641 10520. 4929.
Ahora bien los cambios no se han guardado en la base de datos para hacerlo debemos remplazar el objeto o crear uno nuevo.
resumen<-s2018%>%group_by(ubigeo)%>%
summarise(promedio=mean(ingreso_bruto),
desv=sd(ingreso_bruto))
head(resumen)
## # A tibble: 6 x 3
## ubigeo promedio desv
## <chr> <dbl> <dbl>
## 1 010101 80756. 43287.
## 2 010112 22392 NA
## 3 010201 10520. 4929.
## 4 010202 3746. 2255.
## 5 010203 17275 NA
## 6 010205 11892 14875.
La diferencia aquí es que hemos usado summarise
en lugar de mutate
. Ya que no estamos agregando una variable a la base. Estamos creando una nueva base.
## [1] 514
Ahora juntemos las bases de datos. El proceso es más conocido como “merge” o “join”
## hogar minimo promedio
## 1 11 1 20971.317
## 2 11 1 4007.568
## 3 11 1 8651.279
## 4 12 1 39084.833
## 5 11 1 4224.000
## 6 11 1 30128.250
Existen diferentes tipos de “join”
left_join()
rigth_join()
inner_join()