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><font style='color:#E495A5'>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 05-EJ-manipulacionII.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> ## Datos ordenados El entorno tidyverse esta basado en el concepto de datos ordenados Un dataset está ordenado si: - Cada variable está en una columna - Cada observacion está una fila - Cada valor se encuentra en una celda <center><img src="img/tidy.png" height="300"></center> --- <div class="my-header"></div> ## Transformando a tidy Veamos la siguiente tabla de la cantidad total de los pedidos de asilo recibidas. Las variables involucradas son país, año y cantidad de cados. Está ordenada la tabla? <table> <thead> <tr> <th style="text-align:left;"> Pais </th> <th style="text-align:right;"> 2011 </th> <th style="text-align:right;"> 2012 </th> <th style="text-align:right;"> 2013 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:right;"> 7000 </td> <td style="text-align:right;"> 6900 </td> <td style="text-align:right;"> 7000 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:right;"> 5800 </td> <td style="text-align:right;"> 6000 </td> <td style="text-align:right;"> 6200 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:right;"> 15000 </td> <td style="text-align:right;"> 14000 </td> <td style="text-align:right;"> 13000 </td> </tr> </tbody> </table> Me gustaría que estuviera así: <table> <thead> <tr> <th style="text-align:left;"> Pais </th> <th style="text-align:left;"> Anio </th> <th style="text-align:right;"> cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:right;"> 7000 </td> </tr> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:right;"> 6900 </td> </tr> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:right;"> 7000 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:right;"> 5800 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:right;"> 6000 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:right;"> 6200 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:right;"> 15000 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:right;"> 14000 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:right;"> 13000 </td> </tr> </tbody> </table> --- <div class="my-header"></div> ## Transformando a tidy: `pivot_longer` La funcion `pivot_longer` se encarga de esto! Pasa de una tabla ancha a una table mas larga. Hay que idenfificar cuáles son las columnas que dejarán de ser fila y pasarán a ser los valores de una nueva columna. Estas columnas serán la llave de la transformación .pull-left[ <table> <thead> <tr> <th style="text-align:left;"> Pais </th> <th style="text-align:right;"> 2011 </th> <th style="text-align:right;"> 2012 </th> <th style="text-align:right;"> 2013 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:right;"> 7000 </td> <td style="text-align:right;"> 6900 </td> <td style="text-align:right;"> 7000 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:right;"> 5800 </td> <td style="text-align:right;"> 6000 </td> <td style="text-align:right;"> 6200 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:right;"> 15000 </td> <td style="text-align:right;"> 14000 </td> <td style="text-align:right;"> 13000 </td> </tr> </tbody> </table> ] .pull-right[ <table> <thead> <tr> <th style="text-align:left;"> Pais </th> <th style="text-align:left;"> Anio </th> <th style="text-align:right;"> cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;background-color: yellow !important;"> 2011 </td> <td style="text-align:right;"> 7000 </td> </tr> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;background-color: yellow !important;"> 2012 </td> <td style="text-align:right;"> 6900 </td> </tr> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;background-color: yellow !important;"> 2013 </td> <td style="text-align:right;"> 7000 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;background-color: yellow !important;"> 2011 </td> <td style="text-align:right;"> 5800 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;background-color: yellow !important;"> 2012 </td> <td style="text-align:right;"> 6000 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;background-color: yellow !important;"> 2013 </td> <td style="text-align:right;"> 6200 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;background-color: yellow !important;"> 2011 </td> <td style="text-align:right;"> 15000 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;background-color: yellow !important;"> 2012 </td> <td style="text-align:right;"> 14000 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;background-color: yellow !important;"> 2013 </td> <td style="text-align:right;"> 13000 </td> </tr> </tbody> </table> ] --- <div class="my-header"></div> ## Transformando a tidy: `pivot_longer` ```r pedidos_asilo_tidy <- pivot_longer(pedidos_asilo, cols = c(2, 3, 4), names_to = "Anio", values_to = "cantidad") ``` - data corresponde a la tabla a modificar - cols corresponde a las **columnas a ser pivoteadas** - names_to corresponde al **nombre** que agrupará a las columnas de interés - values_to corresponde al **nombre** de la variable que agrupará a los valores <table> <thead> <tr> <th style="text-align:left;"> Pais </th> <th style="text-align:left;"> Anio </th> <th style="text-align:right;"> cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;background-color: yellow !important;"> 2011 </td> <td style="text-align:right;"> 7000 </td> </tr> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;background-color: yellow !important;"> 2012 </td> <td style="text-align:right;"> 6900 </td> </tr> <tr> <td style="text-align:left;"> ARG </td> <td style="text-align:left;background-color: yellow !important;"> 2013 </td> <td style="text-align:right;"> 7000 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;background-color: yellow !important;"> 2011 </td> <td style="text-align:right;"> 5800 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;background-color: yellow !important;"> 2012 </td> <td style="text-align:right;"> 6000 </td> </tr> <tr> <td style="text-align:left;"> PER </td> <td style="text-align:left;background-color: yellow !important;"> 2013 </td> <td style="text-align:right;"> 6200 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;background-color: yellow !important;"> 2011 </td> <td style="text-align:right;"> 15000 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;background-color: yellow !important;"> 2012 </td> <td style="text-align:right;"> 14000 </td> </tr> <tr> <td style="text-align:left;"> TUR </td> <td style="text-align:left;background-color: yellow !important;"> 2013 </td> <td style="text-align:right;"> 13000 </td> </tr> </tbody> </table> --- <div class="my-header"></div> ## `pivot_longer`: idea del funcionamiento desde el **formato ancho** al **formato largo** <center><img src="img/ancho-a-largo.png" height="450"></center> <p style="color: gray; font-size:15px"> Imagen del curso "R para Clima" - Paola Corrales y Elio Campitelli <br> https://eliocamp.github.io/r-clima/index.html </p> --- <div class="my-header"></div> ## Transformando a tidy: `pivot_wider` Por otro lado, tenemos <table> <thead> <tr> <th style="text-align:left;"> ciudad </th> <th style="text-align:left;"> tamanio_particula </th> <th style="text-align:right;"> cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Cusco </td> <td style="text-align:left;"> p grande </td> <td style="text-align:right;"> 23 </td> </tr> <tr> <td style="text-align:left;"> Cusco </td> <td style="text-align:left;"> p pequenia </td> <td style="text-align:right;"> 14 </td> </tr> <tr> <td style="text-align:left;"> London </td> <td style="text-align:left;"> p grande </td> <td style="text-align:right;"> 22 </td> </tr> <tr> <td style="text-align:left;"> London </td> <td style="text-align:left;"> p pequenia </td> <td style="text-align:right;"> 16 </td> </tr> <tr> <td style="text-align:left;"> Beijing </td> <td style="text-align:left;"> p grande </td> <td style="text-align:right;"> 121 </td> </tr> <tr> <td style="text-align:left;"> Beijing </td> <td style="text-align:left;"> p pequenia </td> <td style="text-align:right;"> 121 </td> </tr> </tbody> </table> --- <div class="my-header"></div> ## Transformando a tidy: `pivot_wider` Que tampoco esta ordenada, pero en el sentido contrario (es larga en este caso !). Me gustaría que estuviera así: <table> <thead> <tr> <th style="text-align:left;"> ciudad </th> <th style="text-align:right;"> p grande </th> <th style="text-align:right;"> p pequenia </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Cusco </td> <td style="text-align:right;"> 23 </td> <td style="text-align:right;"> 14 </td> </tr> <tr> <td style="text-align:left;"> London </td> <td style="text-align:right;"> 22 </td> <td style="text-align:right;"> 16 </td> </tr> <tr> <td style="text-align:left;"> Beijing </td> <td style="text-align:right;"> 121 </td> <td style="text-align:right;"> 121 </td> </tr> </tbody> </table> Debo identificar a las dos columnas que esconden más de una variable. En este caso, tamanio_particula contiene los nombres de las futuras variables (names_from), y cantidad esconde el nombre de la segunda variable ```r contaminacion_tidy <- pivot_wider(contaminacion, names_from = tamanio_particula, values_from = cantidad) ``` me devuelve el resultado deseado --- <div class="my-header"></div> ## Tu turno 1: `pivot_wider` Covertir paises_largo al formato ordenado (variables como columnas) ```r paises_largo <- read_csv("data/paises_largo.csv") knitr::kable(paises_largo[1:6,]) ``` <table> <thead> <tr> <th style="text-align:left;"> pais </th> <th style="text-align:left;"> continente </th> <th style="text-align:right;"> anio </th> <th style="text-align:left;"> variable </th> <th style="text-align:right;"> valor </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Afganistán </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1952 </td> <td style="text-align:left;"> esperanza_de_vida </td> <td style="text-align:right;"> 28.801 </td> </tr> <tr> <td style="text-align:left;"> Afganistán </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1957 </td> <td style="text-align:left;"> esperanza_de_vida </td> <td style="text-align:right;"> 30.332 </td> </tr> <tr> <td style="text-align:left;"> Afganistán </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1962 </td> <td style="text-align:left;"> esperanza_de_vida </td> <td style="text-align:right;"> 31.997 </td> </tr> <tr> <td style="text-align:left;"> Afganistán </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1967 </td> <td style="text-align:left;"> esperanza_de_vida </td> <td style="text-align:right;"> 34.020 </td> </tr> <tr> <td style="text-align:left;"> Afganistán </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1972 </td> <td style="text-align:left;"> esperanza_de_vida </td> <td style="text-align:right;"> 36.088 </td> </tr> <tr> <td style="text-align:left;"> Afganistán </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1977 </td> <td style="text-align:left;"> esperanza_de_vida </td> <td style="text-align:right;"> 38.438 </td> </tr> </tbody> </table> --- <div class="my-header"></div> ## Combinando tablas de datos! Hasta ahora todo lo que usamos de `dplyr` involucra trabajar y modificar con una sola tabla a la vez En ese caso, tenemos que unir estas tablas. a partir de una o más variables en común o keys. **En Excel**: “VLOOKUP” o “BUSCARV” **En R:** familia de funciones *_join(). Hay una función cada tipo de unión que queramos hacer. --- <div class="my-header"></div> ## familia `join` <center><img src="img/join.png" height="180"></center> - `full_join():` devuelve todas las filas y todas las columnas de ambas tablas `x` e `y`. Cuando no coinciden los elementos, devuelve `NA` (dato faltante). Esto significa que no se pierden filas de ninguna de las dos tablas aún cuando no hay coincidencia. - `left_join():` devuelve todas las filas de `x` y todas las columnas de `x` e `y`. Las filas en `x` que no tengan coincidencia con `y` tendrán `NA` en las nuevas columnas. Si hay múltiples coincidencias entre `x` e `y`, devuelve todas las coincidencias posibles. - `inner_join():` devuelve todas las filas de `x` donde hay coincidencias con `y` y todas las columnas de `x` e `y`. Si hay múltiples coincidencias entre `x` e `y`, entonces devuelve todas las coincidencias. Eliminará las filas (observaciones) que no coincidan en ambas tablas. --- <div class="my-header"></div> ## full_join <center><img src="img/join_family.png" height="450"></center> <p style="color: gray; font-size:15px"> Imagen del curso "R para Clima" - Paola Corrales y Elio Campitelli <br> https://eliocamp.github.io/r-clima/index.html </p> --- <div class="my-header"></div> ## Tu turno 2: para practicar después Unir la tabla de países obtenida en Tu turno 1 con la tabla de decisiones de asilo (decisiones_asilo_colombia). Utiliza como llave a las columnas con el nombre del país y el año. --- <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`.