background-color: #272822 <br> <br> <br> <br> <br> <br> <h1 style='color:white'> <center> R para contextos humanitarios de emergencia</center></h1> ## <center><font style='color:#E495A5'>M</font><font style='color:#D89F7F'>a</font><font style='color:#BDAB66'>n</font><font style='color:#96B56C'>i</font><font style='color:#65BC8C'>p</font><font style='color:#39BEB1'>u</font><font style='color:#55B8D0'>l</font><font style='color:#91ACE1'>a</font><font style='color:#C29DDE'>c</font><font style='color:#DE94C8'>i</font><font style='color:#E495A5'>ó</font><font style='color:#D89F7F'>n</font> <font style='color:#BDAB66'>d</font><font style='color:#96B56C'>e</font> <font style='color:#65BC8C'>d</font><font style='color:#39BEB1'>a</font><font style='color:#55B8D0'>t</font><font style='color:#91ACE1'>o</font><font style='color:#C29DDE'>s</font> <font style='color:#DE94C8'>I</font></center> ### <center><font style='color:#E495A5'>V</font><font style='color:#D89F7F'>i</font><font style='color:#BDAB66'>o</font><font style='color:#96B56C'>l</font><font style='color:#65BC8C'>e</font><font style='color:#39BEB1'>t</font><font style='color:#55B8D0'>a</font> <font style='color:#91ACE1'>R</font><font style='color:#C29DDE'>o</font><font style='color:#DE94C8'>i</font><font style='color:#E495A5'>z</font><font style='color:#D89F7F'>m</font><font style='color:#BDAB66'>a</font><font style='color:#96B56C'>n</font></center> --- background-color: #272822 <br> <br> <br> <br> <br> <br> <h1 style='color:white'> <center> Abrir el archivo 03-EJ-manipulacion.Rmd</center></h1> ## <center><font style='color:#E495A5'>P</font><font style='color:#D89F7F'>a</font><font style='color:#BDAB66'>r</font><font style='color:#96B56C'>a</font> <font style='color:#65BC8C'>i</font><font style='color:#39BEB1'>r</font> <font style='color:#55B8D0'>h</font><font style='color:#91ACE1'>a</font><font style='color:#C29DDE'>c</font><font style='color:#DE94C8'>i</font><font style='color:#E495A5'>e</font><font style='color:#D89F7F'>n</font><font style='color:#BDAB66'>d</font><font style='color:#96B56C'>o</font> <font style='color:#65BC8C'>l</font><font style='color:#39BEB1'>o</font><font style='color:#55B8D0'>s</font> <font style='color:#91ACE1'>E</font><font style='color:#C29DDE'>J</font></center> --- <div class="my-header"></div> ## Manipulación de datos El paquete `dplyr` provee una enorme cantidad de funciones útiles para manipular datos <center> <img src="img/hex-dplyr.png" alt="Hex sticker del paquete dplyr." height="100"></center> Las funciones más comunes: - `select()`: selecciona columnas de una tabla - `filter()` y `slice()`: selecciona (o filtra) filas de una tabla - `mutate()`: agrega nuevas columnas a una tabla - `arrange()`: ordena las filas según los valores de una columna - `group_by()`: agrupa una tabla en base al valor de una o más columnas - `summarise()`: calcula estadísticas para cada grupo de una tabla. --- <div class="my-header"></div> ## `dplyr` y tablas dinámicas A rasgos generales, las operaciones de `dplyr` permiten hacer lo que se hace en tablas dinámicas (pivot tables) en Excel. .pull-left[ Funcion de `dplyr` - `filter()` - `group_by()` - `select()` - `summarise()` ] .pull-right[ Sección de tabla dinámica - "Filtros" - "Filas" - "Columnas" - "Valores" ] --- <div class="my-header"></div> ## Tu turno 1 Te dieron una tabla con datos de decisiones a pedidos de asilo tomadas por los distintos países del mundo. Las columnas son: `anio`, `pais_origen`, `pais_asilo`, `pedidos_aceptados` y `pedidos_rechazados`. En base a esos datos, te piden que computes la cantidad total de pedidos de asilo recibidas por Colombia en cada año. ¿En qué orden ejecutarías estos pasos para obtener el resultado deseado? - usar `summarise()` para calcular el total sum(`total_pedidos`) por cada grupo - usar `group_by()` para agrupar por la columna `anio` - usar `mutate()` para generar una columna llamada `total_pedidos` que sea `aceptados + rechazados` - usar `filter()` para seleccionar solo las filas donde la columna `pais_origen` es igual a "Colombia" --- <div class="my-header"></div> ## Los datos Retomamos el dataset sobre decisiones de Colombia frente a los pedidos de asilo (es una traducción y simplificación del dataset de UNHCR sobre decisiones de Colombia: [https://data.humdata.org/dataset/unhcr-population-data-for-col](https://data.humdata.org/dataset/unhcr-population-data-for-col)) ```r decisiones <- read_csv("data/decisiones_asilo_colombia.csv") decisiones ``` ``` ## # A tibble: 133 x 15 ## Anio `Codigo Pais Or~ `Codigo Pais As~ `Nombre Pais de~ `Nombre Pais As~ ## <dbl> <chr> <chr> <chr> <chr> ## 1 2002 CUB COL Cuba Colombia ## 2 2002 IRQ COL Iraq Colombia ## 3 2003 IRN COL Iran (Islamic R~ Colombia ## 4 2003 IRN COL Iran (Islamic R~ Colombia ## 5 2003 VEN COL Venezuela (Boli~ Colombia ## 6 2004 CUB COL Cuba Colombia ## 7 2004 PER COL Peru Colombia ## 8 2004 UZB COL Uzbekistan Colombia ## 9 2005 CUB COL Cuba Colombia ## 10 2005 CUB COL Cuba Colombia ## # ... with 123 more rows, and 10 more variables: `Tipo de procedimiento` <chr>, ## # `Nombre del Procedimiento` <chr>, `Codigo de Tipo de Decision` <chr>, `Tipo ## # de Datos de Decision` <chr>, `Datos de Decision` <chr>, `Promedio de ## # Personas de decision por Caso` <dbl>, Reconocidas <dbl>, `Proteccion ## # Complementaria` <dbl>, `Cerradas de otra forma` <dbl>, Rechazadas <dbl> ``` --- <div class="my-header"></div> ## Seleccionando columnas: función `select()` Si nos interesan menos columnas podemos usar `select()` así: > `select(dataset, c(columna1, columna4))` o por número de columnas `select(dataset, c(1, 4))`. También podemos excluir un conjunto de columnas: > `select(dataset, -c(columna1, columna2))` Supongamos que solo nos interesan: año, país de origen, decisión tomada(4) Entonces redefinimos el dataset de la siguiente forma ```r decisiones <- select(decisiones, c(Anio, `Codigo Pais Origen`, Reconocidas, Rechazadas, `Proteccion Complementaria`, `Cerradas de otra forma`)) decisiones ``` ``` ## # A tibble: 133 x 6 ## Anio `Codigo Pais Or~ Reconocidas Rechazadas `Proteccion Com~ ## <dbl> <chr> <dbl> <dbl> <dbl> ## 1 2002 CUB 0 5 0 ## 2 2002 IRQ 0 0 0 ## 3 2003 IRN 0 5 0 ## 4 2003 IRN 5 0 0 ## 5 2003 VEN 5 0 0 ## 6 2004 CUB 10 0 0 ## 7 2004 PER 0 5 0 ## 8 2004 UZB 5 0 0 ## 9 2005 CUB 0 5 0 ## 10 2005 CUB 22 10 0 ## # ... with 123 more rows, and 1 more variable: `Cerradas de otra forma` <dbl> ``` --- <div class="my-header"></div> ## Seleccionando filas: funcion `filter()` Supongamos que solo nos interesan los pedidos provenientes de Venezuela Podemos usar la función filter mas una condición lógica > filter(dataset, condicion) En este caso seria: ```r decisiones_venezuela <- filter(decisiones, `Codigo Pais Origen`=="VEN") decisiones_venezuela ``` ``` ## # A tibble: 22 x 6 ## Anio `Codigo Pais Or~ Reconocidas Rechazadas `Proteccion Com~ ## <dbl> <chr> <dbl> <dbl> <dbl> ## 1 2003 VEN 5 0 0 ## 2 2005 VEN 0 5 0 ## 3 2005 VEN 5 10 0 ## 4 2005 VEN 5 0 0 ## 5 2006 VEN 0 0 0 ## 6 2007 VEN 11 0 0 ## 7 2008 VEN 5 0 0 ## 8 2009 VEN 0 5 0 ## 9 2009 VEN 0 13 0 ## 10 2011 VEN 0 5 0 ## # ... with 12 more rows, and 1 more variable: `Cerradas de otra forma` <dbl> ``` --- <div class="my-header"></div> ## funcion `filter()`: condiciones Las condiciones para `filter()` pueden expresarse en función de una columna del dataset o de un vector de longitud igual a la cantidad de filas del dataset. Si quiero las decisiones tomadas después de 2010: ```r decisiones_despues_2010 <- filter(decisiones, Anio > 2010) ``` Si quiero cualquier decisión menos las de los años 2010 y 2015: ```r decisiones_2010_2015 <- filter(decisiones, !(Anio %in% c(2010, 2015))) ``` Si quiero solo las entradas de donde se rechazaron más que las que se aceptaron: ```r decisiones_mas_rechazos <- filter(decisiones, Rechazadas > Reconocidas) ``` --- <div class="my-header"></div> ## funcion `filter()`: posibles operadores en las condiciones | expresión | significado | |:----:|:-----------------:| | & | y | | | | o | | ! | negación | | %in% | pertenece? | | == | es igual? | | \> | es mayor? | | \>= | es mayor o igual? | | < | menor | --- <div class="my-header"></div> ## Tu turno 2: verbos `select` y `filter` 1. Seleccionar solo las variables Anio y `Codigo Pais Origen ` 2. Filtrar las filas para quedarse solo con los pedidos de los países Turquía y Cuba **TIP:** No sobreescribir el dataset. --- <div class="my-header"></div> ## Creando nuevas variables: función `mutate()` <center><img src="img/dplyr_mutate_es.png" alt="Caricatura de Allison Horst que representa a la función mutate, perteneciente al paquete dplyr." height="450"></center> <p style="color: gray; font-size:15px"> Ilustración traducida de Allison Horst. </p> --- <div class="my-header"></div> ## Creando nuevas variables: función `mutate()` - Queremos agregar a `decisiones` una columna con el total de pedidos de asilo correspondientes a cada fila (mas allá de la decisión tomada). - Podemos definirla como la suma de las posibles decisiones ```r decisiones <- mutate(decisiones, total = Reconocidas + `Proteccion Complementaria` + `Cerradas de otra forma` + Rechazadas) #View(decisiones) ``` --- <div class="my-header"></div> ## Tu turno 3: verbo `mutate` 3. Generar una nueva columna con la cantidad de pedidos rechazados o con proteccion complementaria 2. Generar una nueva columna que indique para cada fila si el tipo de procedimiento es UNHCR 1. Generar una nueva columna que indique para cada fila si fueron rechazados mas pedidos que los aceptados --- <div class="my-header"></div> ## Ordenando los datos según valores: función `arrange()` Si quiero ordenar una tabla según los valores de una o más variables puedo > `arrange(dataset, columna)` Por ejemplo, si quiero saber cuales fueron los años y países con mas pedidos de asilo ```r arrange(decisiones, desc(Reconocidas)) ``` ``` ## # A tibble: 133 x 7 ## Anio `Codigo Pais Or~ Reconocidas Rechazadas `Proteccion Com~ ## <dbl> <chr> <dbl> <dbl> <dbl> ## 1 2019 VEN 332 0 0 ## 2 2018 VEN 32 5 0 ## 3 2005 CUB 22 10 0 ## 4 2017 VEN 19 5 0 ## 5 2007 CUB 11 75 0 ## 6 2007 VEN 11 0 0 ## 7 2009 ETH 11 39 0 ## 8 2004 CUB 10 0 0 ## 9 2005 ECU 10 0 0 ## 10 2009 SOM 10 83 0 ## # ... with 123 more rows, and 2 more variables: `Cerradas de otra forma` <dbl>, ## # total <dbl> ``` --- <div class="my-header"></div> ## Combinando funciones Queremos: > Una tabla de las decisiones tomadas por Colombia frente a pedidos de asilo, ordenada por la cantidad de total de pedidos por país cada año. Podemos obtenerla así: ```r decisiones_venezuela <- filter(decisiones, `Codigo Pais Origen` == "VEN") decisiones_venezuela <- mutate(decisiones_venezuela, total = Reconocidas + `Proteccion Complementaria` + `Cerradas de otra forma` + Rechazadas) decisiones_venezuela <- arrange(decisiones_venezuela, desc(total)) ``` Pero estamos repitiendo demasiadas veces la variable venezuela, existe una herramienta que nos ayuda a combinar funciones encadenadas: <center>pipe (o tubo)</center> --- <div class="my-header"></div> ## Combinando funciones <img src="img/diagrama_pipe-colombia.png" width="900"> --- <div class="my-header"></div> ## Combinando funciones con pipe <center> <img src="img/estoesunpipe.png" alt="Imagen de un pipe." width="250"> </center> Si reemplazamos los tubos por esto `%>%` obtenemos el resultado deseado ```r decisiones %>% filter(`Codigo Pais Origen` == "VEN") %>% mutate(total = Reconocidas + `Proteccion Complementaria` + `Cerradas de otra forma` + Rechazadas) %>% arrange(desc(total)) ``` ``` ## # A tibble: 22 x 7 ## Anio `Codigo Pais Or~ Reconocidas Rechazadas `Proteccion Com~ ## <dbl> <chr> <dbl> <dbl> <dbl> ## 1 2019 VEN 332 0 0 ## 2 2017 VEN 19 5 0 ## 3 2018 VEN 32 5 0 ## 4 2015 VEN 5 16 0 ## 5 2016 VEN 5 0 0 ## 6 2014 VEN 10 10 0 ## 7 2015 VEN 5 12 0 ## 8 2005 VEN 5 10 0 ## 9 2013 VEN 0 14 0 ## 10 2009 VEN 0 13 0 ## # ... with 12 more rows, and 2 more variables: `Cerradas de otra forma` <dbl>, ## # total <dbl> ``` --- <div class="my-header"></div> **Encuesta:** [PollEv.com/violetaroizm482](PollEv.com/violetaroizm482) Cómo modificarias `decisiones` para que contenga las decisiones correspondientes a pedidos de cuban@s ordenadas por cantidad de rechazos? a) ```r decisiones <- decisiones %>% filter(decisiones, `Codigo Pais Origen` == "CUB") %>% arrange(decisiones, desc(Rechazadas)) ``` b) ```r decisiones <- decisiones %>% filter(`Codigo Pais Origen` == "CUB") %>% arrange(desc(Rechazadas)) ``` c) ```r decisiones %>% filter(`Codigo Pais Origen` == "CUB") %>% arrange(desc(Rechazadas)) ``` --- <div class="my-header"></div> ## Resumir datos: `group_by` y `summarise` Para agrupar los datos usamos `group_by()` Supongamos que queremos saber cuantos asilos aceptados en total corresponden a cada país de origen .pull-left[ ```r decisiones ``` . ![](img/tibblegroupby1.png) ] .pull-right[ ```r decisiones %>% group_by(`Codigo Pais Origen`) ``` ![](img/tibblegroupby2.png) ] Los datos no se modifican, solo se agrega un indicador de que esta agrupado --- <div class="my-header"></div> ## Resumir datos: `group_by` y `summarise` Una vez que están agrupados queremos elegir como resumirlo ```r decisiones %>% group_by(`Codigo Pais Origen`) %>% summarise(total_aceptado = sum(Reconocidas)) ``` ``` ## # A tibble: 31 x 2 ## `Codigo Pais Origen` total_aceptado ## * <chr> <dbl> ## 1 AFG 5 ## 2 BGD 0 ## 3 BOL 5 ## 4 BTN 0 ## 5 CIV 0 ## 6 COD 0 ## 7 CUB 58 ## 8 ECU 20 ## 9 ERI 5 ## 10 ETH 16 ## # ... with 21 more rows ``` --- <div class="my-header"></div> ## Resumir datos: `group_by` y `summarise` Cual es el TOP 3 de país de origen aceptado? -- ```r decisiones %>% group_by(`Codigo Pais Origen`) %>% summarise(total_aceptado = sum(Reconocidas)) %>% arrange(desc(total_aceptado)) ``` ``` ## # A tibble: 31 x 2 ## `Codigo Pais Origen` total_aceptado ## <chr> <dbl> ## 1 VEN 439 ## 2 CUB 58 ## 3 ECU 20 ## 4 ETH 16 ## 5 SLV 10 ## 6 SOM 10 ## 7 AFG 5 ## 8 BOL 5 ## 9 ERI 5 ## 10 HND 5 ## # ... with 21 more rows ``` --- <div class="my-header"></div> ## `summarise` por separado También `summarise` solo ```r decisiones %>% summarise(total_aceptados = sum(Reconocidas)) ``` ``` ## # A tibble: 1 x 1 ## total_aceptados ## <dbl> ## 1 608 ``` --- <div style="margin:auto; display:flex; flex-direction:column; height:650px; max-width:700px"> <iframe border="0" src="https://crosswordlabs.com/embed/dplyr-funciones?clue_height=32" style="flex:1; width:100%; padding:5px 0px 0 5px; border:3px solid black; "></iframe> <a target="_blank" style="align-self:center; font-size:12px; color:black; padding-top:10px; text-decoration:none;text-align:center" href="https://crosswordlabs.com">Crossword Puzzle Maker</a> </div> --- <div class="my-header"></div> ## Tu turno 4: verbos `dplyr` 1. Obtener una tabla con la cantidad de pedidos de asilo rechazados por Colombia durante cada año 2. Ordena esta tabla de mayor a menor según la cantidad de pedidos aceptados 3. Que cantidad de pedidos fueron rechazados en total durante el período estudiado? --- <div class="my-header"></div> ## Tu turno 5: verbos `dplyr` con un dataset conocido <center> <img src="img/producto_4W.png" alt="Informe correspondiente a septiembre 2020 para los datos 4W Colombia." height="450"> </center> --- <div class="my-header"></div> ## Tu turno 5: verbos `dplyr` <center> <img src="img/producto_4W.png" alt="Informe correspondiente a septiembre 2020 para los datos 4W Colombia." width="250"> </center> 1. Ve al documento compartido: url 2. Resuelve el ejercicio que utiliza los data 4W Colombia **TIP:** si quieres probar puedes ejecutar el código en el último chunk de la notebook --- <div class="my-header"></div> ## Resumen de esta sección: - Seleccionamos variables con `select()` - Filtramos filas con `filter()` - Ordenamos tablas con `arrange()` - Hacemos tablas resumen con `summarise()` - Creamos nuevas variables con `mutate()` - Hacemos operaciones por grupos con `group_by()` --- <div class="my-header"></div> ## Licencia y material usado Licencia: [Creative Commons Attribution-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/deed.es_ES). Este material está inspirado y utiliza explicaciones de: - [R para Clima](https://eliocamp.github.io/r-clima/) de Paola Corrales y Elio Campitelli - [Master the Tidyverse](https://github.com/rstudio-education/master-the-tidyverse-instructors) de Garrett Grolemund Las diapositivas fueron creadas con el paquete `xaringan`.