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? - Exportar objetos a archivos RData. Importar archivos RData. <br><br> -- - Definir una función para encontrar un dato faltante <br><br> -- - Definir una función para encontrar un caso duplicado <br><br> -- - Introducción al paquete dplyr para manipular un data frame <br><br> -- - Operadores lógicos y de comparación. Operador %in%. <br><br> -- - Trabajar en proyecto (.Rproj) --- class: inverse, center, middle # RData --- # Guardar un objeto a un archivo RData - <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >RData</span> es un formato propio de R. <br><br> -- - Sirve para <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >guardar objetos de R</span>. Los archivos ocupan mucho menos espacio que otros formatos. <br><br> -- ![](https://raw.githubusercontent.com/calcita/Curso-rECH/master/images/formatos.png) --- # Guardar un objeto a un archivo RData La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >save()</span> permite guardar un <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >objeto</span> en un <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >archivo RData</span> ```r # guardar un objeto (data frame) en formato R save(ech19, file = "data/ech19.RData") ``` -- - Debo escribir el argumento <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >file</span> de lo contrario me dará error porque no es el segundo argumento de la función. Allí especifico el nombre del archivo que voy a crear. - Adicionalmente puede incluir la ruta donde se creará el archivo. Si solo se define el nombre del archivo, se guarda en el directorio de trabajo actual: **getwd()** <br><br> -- - El <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >nombre</span> del objeto y el archivo pueden coincidir, pero no necesariamente. <br><br> -- - Es posible guardar más de un objeto en el mismo archivo RData. --- # Leer un archivo RData - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >load()</span> permite cargar archivos RData. <br><br> -- - <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >No lo asigno a ningún objeto</span> a diferencia del resto de las funciones de importación/lectura. <br><br> -- ```r load("data/ech19.RData") ``` - En este caso puedo prescindir de nombrar el argumento file porque es el primero de la función. --- # Leer un archivo RData ¿Qué pasa si lo asigno a un objeto? <br><br> ![](https://raw.githubusercontent.com/calcita/Curso-rECH/master/images/load.gif) - Si existe como archivo RData tuvo que crearse primero como objeto. <br><br> --- # Leo los datos de ECH 2019 Es una nueva sesión así que no tengo los objetos en memoria que tenía ayer. Voy a usar la función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >load()</span> que viene en R-base. ```r load("/home/calcita/Desktop/ech19.RData") #cargo los datos ``` Nunca asigno a un objeto cuando uso la función load() --- # Datos faltantes (NA) - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >is.na()</span> chequea si hay un dato faltante (<span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >NA: not available</span>) para cada elemento de un vector. <br><br> -- ```r *x <- c(-22, 4, -1, 8, NA) x ``` ``` [1] -22 4 -1 8 NA ``` - ¿Cuántos datos faltantes tiene x? -- - Devuelve un <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >vector lógico</span>, donde el TRUE indica que no hay dato y el FALSE que sí hay dato. ```r *is.na(x) ``` ``` [1] FALSE FALSE FALSE FALSE TRUE ``` --- # Ejemplo: Datos faltantes (NA) ```r sin_pobpcoac <- is.na(ech19$pobpcoac) ``` -- - ¿Cuántos son los valores faltantes de `pobpcoac`? ```r table(sin_pobpcoac) ``` ``` sin_pobpcoac FALSE 107871 ``` ```r *sum(sin_pobpcoac) ``` ``` [1] 0 ``` El valor lógico <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >TRUE</span> representa al <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >1</span> y el valor <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >FALSE</span> representa al <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >0</span> por eso puedo usar la función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >sum()</span>. --- # Observaciones duplicadas La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >duplicated()</span> determina cuales elementos de un vector o data frame están duplicados, devuelve un vector lógico: TRUE si es duplicado y FALSE en caso contrario. <br><br> -- - <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Compara un elemento del vector con todos los anteriores</span>, va asignando el valor FALSE hasta que se encuentra con un caso duplicado y en este caso le asigna TRUE y sigue comparando. ```r *x <- c(-22, 4, 8, 8, NA) x ``` ``` [1] -22 4 8 8 NA ``` -- ```r *duplicated(x) ``` ``` [1] FALSE FALSE FALSE TRUE FALSE ``` --- # Ejemplo: observaciones duplicadas - Chequeo que haya algún <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >caso duplicado</span>, reviso todas las variables ```r *repetidos <- duplicated(ech19) # el argumento es el data frame *sum(repetidos) # los sumo, recordar: TRUE es 1 y FALSE es 0 ``` ``` [1] 0 ``` - Chequeo que haya algún <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >valor duplicado</span> en la <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >variable identificatoria de cada caso</span> ```r *repetidos <- duplicated(ech19$numero) # el argumento es una variable *sum(repetidos) ``` ``` [1] 65364 ``` Si nombro a un objeto igual a uno existente, lo sobreescribo. --- class: inverse, center, middle # dplyr --- # Manipular datos con dplyr - El paquete dplyr permite representar la información de un <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >data frame</span> en forma de <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >tabla</span>, donde cada fila representa una observación y cada columna represente una variable. <br><br> -- - dplyr no provee ninguna funcionalidad que no pueda ser realizada con las funciones del paquete base, sin embargo, es más simple y rápido (está escrito en C++). <br><br> -- - Todas las funciones del paquete tiene la particularidad de que su <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >primer argumento es un data frame</span> al que le realizará la operación, mientras que los subsiguiente argumentos describen como realizar tal operación. - Finalmente el <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >resultado</span> de todas estas funciones es un nuevo <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >data frame</span>. Esto no ocurre con las funciones de base. --- class: center, middle # ~~Base R vs. Tidyverse~~ ![](img/base_tidy.png) --- # Instalar y cargar dplyr - La instalación es por única vez en una computadora. ```r # install.packages("dplyr") # ya lo tengo instalado ``` - Comenté esa línea porque ya lo tengo instalado -- - En cada nueva sesión de RStudio lo debo cargar para poder usar sus funciones ```r *library(dplyr) ``` Notar que en la función de instalación el nombre del paquete se escribe entre comillas pero en la función de carga va sin comillas. No hagas ~~library("dplyr")~~. --- # Manipular datos - Seleccionar columnas/variables <br><br> -- - Cambiar nombre de variables <br><br> -- - Transformar variables <br><br> -- - Crear nuevas variables <br><br> -- - Filtrar o eliminar observaciones <br><br> -- - Chequear existencia de observaciones duplicadas <br><br> -- - Chequear existencia de datos faltantes <br><br> -- - Reestructurar los datos --- class: inverse, center, middle # dplyr::select() --- # Seleccionar columnas/variables - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >select()</span> selecciona columnas de un data frame -- - El primer argumento es el data frame y luego la(s) variable(s) separadas por coma. -- - `select`(<span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><dataframe></span>, <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><variable></span>) <br><br> -- .pull-left[ ```r *select(ech19, numero) ``` ``` # A tibble: 107,871 x 1 numero <chr> 1 2019000001 2 2019000001 3 2019000002 4 2019000002 5 2019000003 6 2019000003 7 2019000004 8 2019000004 9 2019000005 10 2019000005 # … with 107,861 more rows ``` ] .pull-rigth[ ```r *select(ech19, numero, nper) ``` ``` # A tibble: 107,871 x 2 numero nper <chr> <dbl> 1 2019000001 1 2 2019000001 2 3 2019000002 1 4 2019000002 2 5 2019000003 1 6 2019000003 2 7 2019000004 1 8 2019000004 2 9 2019000005 1 10 2019000005 2 # … with 107,861 more rows ``` ] Las funciones de tidyverse permiten llamar a las variables de un data frame sin usar comillas pero esto no es aplicable al resto de los paquetes de R, incluido los del base. --- # Seleccionar columnas/variables .pull-left[ Seleccionar un rango de columnas: select(<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;" ><desde>:<hasta></span>) ```r select(ech19, dpto:region_3) ``` ] .pull-right[ Seleccionar todas las columnas menos una: select(<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>) ```r select(ech19, -nper) ``` ] --- class: inverse, center, middle # dplyr::slice() --- # Seleccionar filas/observaciones por su posición - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >slice()</span> selecciona observaciones/filas según su posición. -- - Esto no es robusto a un reordenamiento de las observaciones. Sirve para "ver" algunos casos. -- - `slice`(<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;" ><nro_fila></span>, <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><nro_fila></span>) <br><br> -- .pull-left[ ```r # selecciono las filas 1 y 5 *slice(ech19, 1, 5) ``` ] .pull-right[ ```r # selecciono las filas de 1 a 5 *slice(ech19, 1:5) ``` ] --- class: inverse, center, middle # dplyr::filter() --- # Selecciona observaciones según condición - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >filter()</span> selecciona observaciones/filas según una condición. -- - Puede ser una condición que involucre a una o varias variables. Condiciono a que tome o no tome ciertos valores. -- - `filter`(<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;" ><condicion></span>) <br><br> -- ```r *mdeo <- filter(ech19, dpto == 1) # me quedo con los casos de Montevideo head(mdeo) ``` ``` # A tibble: 6 x 9 numero nper dpto nomdpto region_3 e26 e27 ht19 pobpcoac <chr> <dbl> <dbl+lbl> <chr> <dbl+lbl> <dbl+l> <dbl> <dbl> <dbl+lbl> 1 2019000… 1 1 [Montev… MONTEVI… 1 [Montev… 2 [Muj… 32 2 2 [Ocupado… 2 2019000… 2 1 [Montev… MONTEVI… 1 [Montev… 1 [Hom… 9 2 1 [Menores… 3 2019000… 1 1 [Montev… MONTEVI… 1 [Montev… 2 [Muj… 53 2 2 [Ocupado… 4 2019000… 2 1 [Montev… MONTEVI… 1 [Montev… 2 [Muj… 13 2 1 [Menores… 5 2019000… 1 1 [Montev… MONTEVI… 1 [Montev… 2 [Muj… 85 1 10 [Inactiv… 6 2019000… 1 1 [Montev… MONTEVI… 1 [Montev… 2 [Muj… 45 1 2 [Ocupado… ``` --- class: inverse, center, middle # Operadores comparativos --- # Operadores de comparación .pull-left[ Mayor que: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >></span> ```r *filter(ech19, e27 > 90) # personas mayores de 90 ``` ] .pull-rigth[ Mayor igual que: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >>=</span> ```r *filter(ech19, e27 >= 90) # personas mayores de 90 o mas ``` ] --- # Operadores de comparación .pull-left[ Menor que: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><</span> ```r *filter(ech19, e27 < 10) ``` ] .pull-rigth[ Menor igual que: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><=</span> ```r *filter(ech19, e27 <= 10) ``` ] --- # Operadores de comparación .pull-left[ Igual que: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >==</span> ```r *filter(ech19, e27 == 90) ``` ] .pull-rigth[ Diferente que: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >!=</span> ```r *filter(ech19, e27 != 90) ``` ] --- class: inverse, center, middle # Operadores lógicos --- # Operadores lógicos O lógico: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >|</span> ```r # selecciono personas menores a 10 o mayores a 90 *filter(ech19, e27 < 10 | e27 > 90) ``` --- # Operadores lógicos Y lógico: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >&</span> ```r # selecciono menores a 10 y de Salto *filter(ech19, e27 < 10 & nomdpto == "FLORES") ``` -- --- # Operadores lógicos No lógico: <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >!</span> ```r # selecciono todas las personas que no tienen 90 *filter(ech19, !e27 == 90) ``` --- class: inverse, center, middle # %in% --- # Operador %in% - <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >Compara cada elemento</span> de un vector con los elementos de otro vector. -- - <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><x> %in% <y></span>, el primer elemento de x se compara con todos los elementos de y, el segundo elemento de x se compara con todos los elementos de y, así sucesivamente. -- - Devuelve un TRUE o un FALSE en cada comparación. TRUE cuando el elemento de x está en y, FALSE en caso contrario. -- - Cuando lo uso <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >en filter() se queda con los TRUE</span>. ```r # selecciono personas Durazno y Rocha filter(ech19, nomdpto %in% c("DURAZNO", "ROCHA")) ``` En este caso es lo mismo que: ```r # selecciono alojamientos menor a 60 y que el tipo sea Private room filter(ech19, nomdpto == "DURAZNO" | nomdpto == "ROCHA") ``` --- # Ejercicio (10') - Selecciona los casos que tienen entre 3 y 5 años de edad y guarda en un objeto llamado `menores_3_5`. La variable e27 es la edad. <!-- review_10_20 <- filter(ech19, number_of_reviews >= 10 & number_of_reviews <= 20) --> - Selecciona los casos cuya vivienda tiene 4 o 6 habitaciones y guarda en un objeto llamado `habitaciones_4`. La variable d9 es el número de habitaciones. <!-- availability_3_5 <- filter(ech19, availability_365 %in% c(3,5)) --> <!-- availability_3_5 <- filter(ech19, availability_365 == 3 | availability_365 == 5) --> - Selecciona los últimos 5 casos de ech19 y guarda en un objeto llamado `ultimos_5`. <!-- last_5 <- slice(ech19, (nrow(ech19)-4):nrow(ech19)) --> <!-- last_5 <- slice_tail(ech19, n = 5) --> <!-- - Selecciona las variables referidas a reviews y guarda en un objeto llamado `reviews_name`. --> <!-- reviews_name <- ech19 %>% select(contains("review")) --> - Selecciona un registro por hogar y guarda en un objeto llamado `hogares`. <!-- hogares <- filter(ech19, nper == 1) --> - ¿De cuál departamento es el hogar con mayor cantidad de personas? Ver ?slice_max <!-- select(slice_max(hogares, ht19), nomdpto) --> --- class: inverse, center, middle # dplyr::arrange() --- # Ordenar las observaciones según una variable ```r ech19 <- select(ech19, ht11, numero, nomdpto) ``` La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >arrange()</span> <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >ordena</span> un data frame de acuerdo a una(s) variable(s) de manera <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >creciente</span> por defecto. -- ```r *arrange(ech19, ht11) ``` -- Para ordenar de manera <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >decreciente</span> debo incluir la función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >desc()</span>: ```r *arrange(ech19, desc(ht11)) ``` -- Para ordenar por más de una variable: ```r arrange(ech19, desc(ht11), e27) ``` --- class: inverse, center, middle # dplyr::summarise() --- # Calcular un resumen de una variable - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >summarise()</span> o <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >summarize()</span> calcula un resumen de variables - summarise(<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;" ><column></span> = <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><function></span>(<span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><variable></span>)) - El resultado será una data frame con una fila, a menos que los datos estén agrupados, y una columna por cada estadístico de resumen. ```r *summarise(ech19, promedio = mean(ht19)) ``` - Se puede utilizar cualquier función que cumpla con que lo datos de entrada sean numéricos y como salida se entregue una constante. Por ejemplo las funciones de resumen que vimos de R base: `mean`(), `max`(), `min`(), `median`(), `var`(), `sd`(), `sum`(), etc. Existen otras específicas de `dplyr` que iremos viendo. --- # Calcular un resumen de una variable - Se pueden aplicar diferentes funciones a la misma o diferentes variables ```r # la función n() devuelve la cantidad de observaciones *summarise(ech19, promedio = mean(ht19), varianza = var(ht19), total = n()) ``` - Suele ser más claro escribirlo hacia abajo ```r *summarise(ech19, promedio = mean(ht19), * varianza = var(ht19), * total = n()) ``` --- class: inverse, center, middle # dplyr::count() --- # Cálculo frecuencias de una variable - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >count()</span> es la función de dplyr para hacer una tabla de frecuencias, el resultado es siempre un data frame de menor dimensión que el original. -- - count(<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>) -- - En R base usamos <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >table()</span> pero el resultado no es un data frame y la salida no es muy amigable. -- -- ```r *count(ech19, region_3) ``` ``` # A tibble: 3 x 2 region_3 n <dbl+lbl> <int> 1 1 [Montevideo] 38207 2 2 [Interior - Localidades de 5000 habitantes o más] 50854 3 3 [Interior - Localidades de menos de 5000 habitantes y zona ru] 18810 ``` --- # Cálculo frecuencias entre dos variables ```r *count(ech19, region_3, e26) ``` ``` # A tibble: 6 x 3 region_3 e26 n <dbl+lbl> <dbl+lbl> <int> 1 1 [Montevideo] 1 [Hombr… 17397 2 1 [Montevideo] 2 [Mujer] 20810 3 2 [Interior - Localidades de 5000 habitantes o más] 1 [Hombr… 23860 4 2 [Interior - Localidades de 5000 habitantes o más] 2 [Mujer] 26994 5 3 [Interior - Localidades de menos de 5000 habitantes y zona … 1 [Hombr… 9348 6 3 [Interior - Localidades de menos de 5000 habitantes y zona … 2 [Mujer] 9462 ``` --- class: inverse, center, middle # dplyr::mutate() --- # Calculo una nueva variable - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >mutate()</span> permite calcular nuevas variables -- - mutate(<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;" ><nombre></span> = <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" ><calculo></span>) -- - El resultado será de la <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >misma cantidad de observaciones</span> que el data frame original -- - Conviene guardarlo en el mismo objeto (data frame original) -- ```r *ech19 <- mutate(ech19, media_edad = mean(e27)) head(ech19$media_edad) ``` ``` [1] 39.87829 39.87829 39.87829 39.87829 39.87829 39.87829 ``` --- class: inverse, center, middle # dplyr::case_when() --- # Crear una variable a partir de varias condiciones La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >case_when()</span> permite calcular una nueva variable a partir de condicionar los valores de otra ```r ech19 <- mutate(ech19, * mayor = case_when( * e27 < 18 ~ "Menor", * e27 >= 18 ~ "Mayor")) ``` --- # Agrupo los casos por cierta variable - La función <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: #b3e2cd !important;" >group_by()</span> permite agrupar las observaciones por cierta variable. -- - Permite hacer operaciones por grupos para posteriormente realizar otros cálculos. -- - group_by(<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>) -- ```r # promedio de precio por barrio *ech19_gr <- group_by(ech19, nomdpto) *summarise(ech19_gr, promedio = mean(ht19)) ``` ``` # A tibble: 19 x 2 nomdpto promedio <chr> <dbl> 1 ARTIGAS 3.70 2 CANELONES 3.38 3 CERRO LARGO 3.25 4 COLONIA 3.12 5 DURAZNO 3.68 6 FLORES 3.23 7 FLORIDA 3.19 8 LAVALLEJA 3.26 9 MALDONADO 3.25 10 MONTEVIDEO 3.21 11 PAYSANDU 3.46 12 RIO NEGRO 3.40 13 RIVERA 3.43 14 ROCHA 3.11 15 SALTO 3.80 16 SAN JOSE 3.39 17 SORIANO 3.42 18 TACUAREMBO 3.45 19 TREINTA Y TRES 3.24 ``` --- # Agrupo los casos por cierta variable - También lo puedo hacer concatenando funciones ```r *summarise(group_by(ech19, nomdpto), promedio = mean(ht19)) ``` ``` # A tibble: 19 x 2 nomdpto promedio <chr> <dbl> 1 ARTIGAS 3.70 2 CANELONES 3.38 3 CERRO LARGO 3.25 4 COLONIA 3.12 5 DURAZNO 3.68 6 FLORES 3.23 7 FLORIDA 3.19 8 LAVALLEJA 3.26 9 MALDONADO 3.25 10 MONTEVIDEO 3.21 11 PAYSANDU 3.46 12 RIO NEGRO 3.40 13 RIVERA 3.43 14 ROCHA 3.11 15 SALTO 3.80 16 SAN JOSE 3.39 17 SORIANO 3.42 18 TACUAREMBO 3.45 19 TREINTA Y TRES 3.24 ``` -- - En la línea anterior anidamos funciones para obtener el promedio según barrios. - La anidación de funciones tiende a volver confuso el código...veremos luego cómo superar este inconveniente con el operador `%>%`. --- # Ejercicio (5') - Calcular el promedio de edad según sexo. - Calcular la cantidad de jefas de hogar. --- # Trabajar en proyecto .pull-left[ Permite ordenar los diferentes archivos de un análisis y prescindir de usar setwd() y/o escribir rutas larguísimas. Si el archivo `tesis.Rproj` está ubicado en: `/home/calcita/Escritorio/tesis`, todos los archivos que estén en la carpeta tesis voy a poder cargarlos sin definir una ruta del archivo. ```r load("datos.csv") ``` ] .pull-right[ <img src="img/fd1.png" width="335" /> ] --- # Crear proyecto <img src="https://raw.githubusercontent.com/calcita/Curso-rECH/master/images/create_project.gif" width="850" height="450"/> --- # Abrir proyecto <img src="https://raw.githubusercontent.com/calcita/Curso-rECH/master/images/open_project.gif" width="850" height="450"/> --- # Crear script <img src="https://raw.githubusercontent.com/calcita/Curso-rECH/master/images/create_file.gif" width="850" height="450"/> --- # Ejercicio (5') .left-column[ <img src="https://raw.githubusercontent.com/calcita/Curso-rECH/master/images/folder.png" width="80px" /> <br><br> <img src="https://raw.githubusercontent.com/calcita/Curso-rECH/master/images/rproj.png" width="80px" /> <br><br> <img src="https://raw.githubusercontent.com/calcita/Curso-rECH/master/images/web-programming.png" width="80px" /> ] .rigth-column[ <br><br> Crear una carpeta llamada "Curso ECH" <br><br> Abrir Rstudio y crear un proyecto. Elegir como directorio la carpeta recién creada. <br><br> Crear un script de R donde guardaremos el código de este taller. Agregar a la carpeta los materiales del curso. ]