class: center, middle, inverse, title-slide # R aplicado a la ECH ## Setiembre 2020
Gabriela Mathieu ###
Creative Commons Attribution 4.0 International License
--- # ¿Qué haremos hoy? - Repaso del segundo taller <br><br> -- - Importar archivos sav y dta (haven) <br><br> -- - Usar etiquetas en variables categóricas (labelled) <br><br> -- - Encadenar funciones: operador %>% <br><br> -- - Ejercicios <!-- - Crear una variable a partir de ciertas condiciones: case_when() --> <!-- <br> --> <!-- -- --> <!-- - Recodificar y renombrar variables --> <!-- <br> --> <!-- -- --> --- class: inverse, center, middle # TidyveRse --- class: hide-logo # tidyverse .pull-left[ <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Conjunto de paquetes</span> para: <br><br> <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Importar</span> <br><br> <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Limpiar y transformar</span> <br><br> <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Procesar y analizar</span> <br><br> <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Visualizar</span> <!-- procesar, analizar y visualizar datos. --> ] .pull-rigth[ <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/tidyverse.png" width="300px" /> Proporciona una forma unificada, armoniosa y más poderosa de trabajar con datos que la que ofrece el paquete base. ] --- class: hide-logo # Importación/Exportación de archivos .pull-left[ Archivos de <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >texto plano</span> (txt, csv, tsv) <!-- ![](img/readr.png){width=180px} --> <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/readr.png" width="120px" style="display: block; margin: auto;" /> Formatos <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >propietarios</span> (dta, sav) <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/haven.png" width="120px" style="display: block; margin: auto;" /> ] .pull-rigth[ <br> Archivos <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Excel</span> (xls, xlsx) <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/readxl.png" width="120px" style="display: block; margin: auto;" /> <br> Paquete jsolite, archivos <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >JSON</span> (JavaScript Object Notation) <img src="img/json.png" width="120px" style="display: block; margin: auto;" /> ] --- class: hide-logo # Manipulación de datos .pull-left[ <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Trasformar </span> estructura de datos <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/tidyr.png" width="140px" style="display: block; margin: auto;" /> Manipular <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >texto</span> <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/stringr.png" width="140px" style="display: block; margin: auto;" /> ] .pull-rigth[ <br> Manipular <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >fechas</span> <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/lubridate.png" width="140px" style="display: block; margin: auto;" /> Manipular <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >data frame</span> <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/dplyr.png" width="140px" style="display: block; margin: auto;" /> ] --- class: hide-logo # Análisis y Visualización de datos .pull-left[ <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Gráficos y mapas</span> <br> <br> <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/ggplot2.png" width="250px" style="display: block; margin: auto;" /> ] .pull-rigth[ <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Modelización</span> <br> <br> <br> <img src="https://raw.githubusercontent.com/rstudio/hex-stickers/master/PNG/broom.png" width="250px" style="display: block; margin: auto;" /> ] --- class: inverse, center, middle # haven --- # Importar datos Stata y SPSS Si usamos get_microdata() solo para descargar los archivos del INE y no exportamos el objeto generado a RData sino a formatos externos a R, es necesario, para leer esos archivos usar el paquete haven. <br><br> -- ```r install.packages("haven") # se instala desde el CRAN library(haven) # lo cargo al entorno de trabajo ``` - El paquete <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >haven es parte de tidyverse</span> y mejora las prestaciones de su antecesor foreign. <br><br> -- - Permite mantener las <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >etiquetas de las variables y sus valores</span> al usar la clase double y haven-labelled, haciendo referencia a los números y etiquetas respectivamente. <!-- https://www.btskinner.io/rworkshop/modules/eda_one.html --> --- class: inverse, center, middle # haven::read_spss() --- # Importar un archivo sav La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >read_spss()</span> permite <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >importar un archivo de SPSS en R</span>. Mantiene las etiquetas de las variables y valores, creando la clase de doble condición haven_labelled y double. <br><br> -- También podemos usar la función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >read_sav()</span>, que es un <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >alias</span> de la anterior. <br><br> -- Abrimos el proyecto donde tenemos los archivos de microdatos y scripts. <br><br> -- ```r # Leemos el archivo descargado con la función get_microdata() que contiene la base hogares. h19 <- read_spss("data/H_2019_Terceros.sav") ``` ```r # Exportamos a dta write_dta(data = h19, path = "data/hogares_2019.dta") ``` --- # Ejercicio - Importa el archivo de la base de hogares y personas en formato dta, y guarda en un objeto llamado ech2019. Usar la función read_dta(). - Exporta el objeto en un archivo SPSS. Usar la función write_sav(). --- class: inverse, center, middle # %>% --- # Encadenamiento de funciones en lugar de anidación El operador <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >%>%</span>, llamado <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >pipe</span> (significa tubería) permitirá <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >encadenar funciones</span> en lugar de colocar una dentro de otra sin una a continuación de la otra. <br><br> -- - El pipe estructura una secuencia de operaciones sobre los datos de <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >izquierda a derecha</span>. <br><br> -- - A diferencia de la anidación de funciones que implica operaciones de adentro para afuera. <br><br> -- - En lugar de f(x): <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >x %>% f()</span> <br><br> -- --- # Pipe: atajo de teclado en Linux/Windows ![](img/linux_pipe.png) --- # Pipe: atajo de teclado en Mac ![](img/mac_pipe.png) --- # Armar un mate con y sin 'pipe' El <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >mate</span> es el <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >data frame</span>, los <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >verbos</span> de dplyr (así se llaman a las funciones que vimos) son las acciones que necesitamos para armarlo: poner la yerba, poner un poco de agua, dejarlo hinchar, poner la bombilla, cebar. -- ```r # Mate con 'pipe' mate %>% poner_yerba() %>% hinchar() %>% colocar_bombilla() %>% cebar() ``` -- En R base y sin el pipe tendríamos que concatenar estas funciones. Cuando las funciones están concatenadas el orden se obtiene de adentro hacia afuera. ```r # Mate sin 'pipe' cebar(colocar_bombilla(hinchar(poner_yerba(mate)))) ``` <!-- [magrittr](https://github.com/tidyverse/magrittr/blob/master/vignettes/magrittr.Rmd) --> --- # Rehacemos los ejemplos usando %>% - Agrupo por barrio y calculo el promedio de precio -- - Sin el pipe teníamos: ```r *summarise(group_by(ech19, nomdpto), promedio_dpto = mean(ht11)) ``` -- - Con el pipe tenemos: ```r *ech19 %>% * group_by(nomdpto) %>% * summarise(promedio_dpto = mean(ht11)) ``` --- class: inverse, center, middle # dplyr::ungroup() --- # Agrupo y desagrupo - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >ungroup()</span> sirve para desagrupar un data frame agrupado. -- - Usarla me permite que <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >la información de los grupos no quede guardada en el objeto</span> (si realización una asignación al resultado), lo cual conllevaría a que todos los demás cálculos se hagan sobre esos grupos. -- - No es necesario indicarle ningún argumento. ```r ech19 <- ech19 %>% * group_by(region_3) %>% mutate(media_y_region = mean(ht11)) %>% * ungroup() ``` -- Podemos confirmar que la nueva variable promedio toma un valor para cada uno de las categorías de `region_3`. ```r ech19 %>% count(region_3, media_y_region) ``` --- # Desagrupo y agrupo - La función `ungroup()` permite desagrupar para volver agrupar por otra variable dentro de la misma concatenación de acciones. - Luego de calcular la(s) variables vuelvo a desagrupar. ```r ech19 <- ech19 %>% * group_by(region_3) %>% mutate(media_y_region = mean(ht11)) %>% * ungroup() %>% * group_by(dpto) %>% mutate(media_y_dpto = mean(ht11)) %>% * ungroup() ``` --- # Ejercicio (6') - Rehacer ejercicio 2 del práctico pasado usando el pipe - Calcular el promedio de edad según sexo. - Calcular la cantidad de jefas de hogar. <!-- - Calcular el tamaño medio de los hogares según departamento y luego el --> --- class: inverse, center, middle # labelled --- # Manejar etiquetas - El paquete [labelled](https://larmarange.github.io/labelled/) se instala cuando instalamos haven. - Trae una serie de funciones que nos permiten trabajar fácilmente con variables que tienen etiquetas, por ejemplo, cuando importamos datos de SPSS o STATA con las variables de clase <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >haven-labelled</span>. ```r # install.packages("labelled") # se instala desde el CRAN library(labelled) ``` --- class: inverse, center, middle # labelled::var_label() --- # Variables <dbl+lbl> - Las funciones de dplyr cuando una variable es de clase double y haven-labelled solo muestra los valores y no las etiquetas, por ejemplo, cuando hacemos una tabla con la función count(). Para <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >ver las etiquetas de la variable</span> usamos la función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >var_label()</span>. Ahora que sabemos usar el pipe (%>%), conviene usarlo al final de la cadena de comandos. ```r ## muestra las etiquetas de un grupo de variables ech19 %>% select(c2, c3, c4) %>% var_label() ``` ``` $c2 [1] "Material predominante en las paredes externas" $c3 [1] "Material predominante en el techo" $c4 [1] "Material predominante en los pisos" ``` --- class: inverse, center, middle # labelled::val_labels() --- # Variables <dbl+lbl> Para ver las etiquetas de los valores usamos la función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >val_labels()</span>. ```r ## see value labels for bysex ech19 %>% select(region_4) %>% val_labels() ``` ``` $region_4 Montevideo 1 Interior - Localidades de 5.000 habitantes o más 2 Interior - Localidades de menos de 5.000 habitantes 3 Zona rural 4 ``` --- class: inverse, center, middle # haven::as_factor() --- # Mostrar etiquetas en tablas La función as_factor() combinada con count() permite mostrar las<span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" > etiquetas al hacer una tabla</span>. ```r ech19 %>% count(region_4) %>% as_factor() ``` ``` # A tibble: 4 x 2 region_4 n <fct> <int> 1 Montevideo 38207 2 Interior - Localidades de 5.000 habitantes o más 50854 3 Interior - Localidades de menos de 5.000 habitantes 12019 4 Zona rural 6791 ``` --- <!-- Now we can see what the numbers represent. Why aren’t there any counts for the three missing labels, the ones with braces, while there are a number of NA values? Checking how the labels are assigned using the val_labels() function… --> <!-- ## table of parental education levels --> <!-- table(as_factor(df$bypared), as_factor(df$bysex)) --> <!-- Para hacer una tabla de doble entrada, podemos combinar group_by() y count() --> <!-- ```{r eval = FALSE} --> <!-- df %>% --> <!-- group_by(bysex) %>% --> <!-- count(bypared) %>% --> <!-- as_factor() --> <!-- ``` --> <!-- Para hacer una tabla más parecida la que podemos hacer con base R, podemos usar la función spread() del paquete tidyr. --> <!-- ```{r eval = FALSE} --> <!-- ## spread to look like other table --> <!-- df %>% --> <!-- group_by(bysex) %>% --> <!-- count(bypared) %>% --> <!-- as_factor() %>% --> <!-- spread(bysex, n) --> <!-- ``` --> <!-- library(devtools) --> <!-- install_github('<github handle>/<repo name>') --> <!-- --- --> <!-- # Calculo una variable a nivel de grupos --> <!-- - Además, la función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >ungroup()</span> me permite encadenar dos agrupaciones diferentes y realizar un cálculo para cada una, como en el ejemplo que sigue. --> <!-- ```{r} --> <!-- ech19 <- ech19 %>% --> <!-- group_by(numero) %>% #<< --> <!-- mutate(promedio = max(e27)) %>% --> <!-- ungroup() %>% #<< --> <!-- group_by(dpto) %>% #<< --> <!-- mutate(maximo = mean(price)) %>% --> <!-- ungroup() #<< --> <!-- ``` --> <!-- Debo recordar de desagrupar si no quiero que el objeto ech19 guarde la información de la agrupación. --> <!-- --- --> <!-- class: inverse, center, middle --> <!-- # dplyr::recode() --> <!-- --- --> <!-- # Recodificar una variable --> <!-- - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >recode()</span> permite recodificar una variable. --> <!-- -- --> <!-- - recode(<span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><df></span>, <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><variable></span>, <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><categoria_actual></span> = <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><categoria_nueva></span>) --> <!-- -- --> <!-- - Recodifico la variable `room_type`, pasando sus categorías a español. --> <!-- ```{r} --> <!-- ech19 <- ech19 %>% --> <!-- mutate(room_type_sp = recode(room_type, #<< --> <!-- "Entire home/apt" = "Casa/Apto entero",#<< --> <!-- "Hotel room" = "Habitación hotel",#<< --> <!-- "Private room" = "Habitación privada",#<< --> <!-- "Shared room" = "Habitación compartida"))#<< --> <!-- ``` --> <!-- - Chequeo --> <!-- ```{r eval = FALSE} --> <!-- ech19 %>% count(room_type_sp) --> <!-- ``` --> <!-- --- --> <!-- class: inverse, center, middle --> <!-- # dplyr::rename() --> <!-- --- --> <!-- # rename --> <!-- - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >rename()</span> renombra variables. --> <!-- <br><br> --> <!-- -- --> <!-- - rename(<span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><df></span>, <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><nuevo></span> = <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><actual></span>) --> <!-- <br><br> --> <!-- -- --> <!-- - Renombro las variables latitude y longitude --> <!-- <br><br> --> <!-- -- --> <!-- ```{r} --> <!-- ech19 <- ech19 %>% --> <!-- rename(lat = latitude, #<< --> <!-- lon = longitude) #<< --> <!-- ``` --> <!-- --- --> <!-- class: inverse, center, middle --> <!-- # %<>% --> <!-- --- --> <!-- # Pipe de asignación --> <!-- Para no repetir el nombre del data frame todas las veces --> <!-- ```{r eval = FALSE} --> <!-- ech19 <- ech19 %>% ... --> <!-- ``` --> <!-- - Podemos usar un pipe de asignación que pertenece al paquete magrittr: `%<>%`. --> <!-- ```{r eval = FALSE} --> <!-- ech19 %<>% ... --> <!-- ``` --> <!-- - Queda menos repetitivo el código pero la asignación queda oculta. -->