class: center, middle, inverse, title-slide .title[ # Seminario de Instrumentos Computacionales ] .subtitle[ ## R - Clase 3 ] .author[ ### Cristian Bonavida ] --- <style> p.caption { font-size: 0.6em; } </style> <style> div.remark-slide-content { padding: 1em; /*default is 1em 4em*/ } .dataTables_wrapper { font-size: .5em; } </style> <style> pre { white-space: pre !important; overflow-y: auto !important; max-height: 25vh !important; } </style> ## Repaso Clase 2 En la clase 2, nos metimos de lleno a manipular datos. Aprendimos el ABC de dplyr para realizar las transformaciones esenciales que necesitamos al trabajar con datos tabulares -- Entre otras cosas aprendimos a: - filtrar observaciones - seleccionar y renombrar columnas - crear o modificar columnas - agrupar la base según alguna/s variables - generar tabla resumen - operar sobre múltiples columnas a la vez --- ## Manipular bases En esencia, estuvimos viendo cómo manipular filas (filtrar y generar subconjuntos de datos), cómo manipular columnas (transformarlas y generar nuevas) y cómo agrupar los datos para generar estimaciones o cálculos por grupo -- <br> Ahora veamos cómo **manipular el dataframe como conjunto**, para relacionarlo con otros -- Tipicamente existen dos tipos de operaciones entre bases de datos - Combinar bases de datos - Cruzar bases (Join) - Extender bases (Append) -- - Reshape de una base de datos --- ## Manipular bases En esencia, estuvimos viendo cómo manipular filas (filtrar y generar subconjuntos de datos), cómo manipular columnas (transformarlas y generar nuevas) y cómo agrupar los datos para generar estimaciones o cálculos por grupo <br> Ahora veamos cómo **manipular el dataframe como conjunto**, para relacionarlo con otros Tipicamente existen dos tipos de operaciones entre bases de datos - **Combinar bases de datos** - **Cruzar bases (Join)** - Extender bases (Append) - Reshape de una base de datos --- ## Manipular bases: join El análisis de datos no implica trabajar, con una sola tabla o dataframe, mas bien se suele trabajar con múltiples bases y la mayoría de las veces es necesario combinarlos parar poder dar respuestas a las preguntas que motivan el análisis -- Varias tablas de datos se denominan **datos relacionales** por que para **vincularlas** es necesario establecer algún tipo de relación. -- Este trabajo relacional de combinar bases tiene como objetivo agregar nuevas variables a un marco de datos a partir de observaciones coincidentes en otro, lo que se conoce como *mutating joins* Realizamos esta operación cuando necesitamos juntar columnas que están en dataframes diferentes -- Por ejemplo, en la EPH individual tenemos columnas diferentes de las que tenemos en la EPH por hogar y (casi) siempre necesitamos juntarlas --- ## Manipular bases: join Para combinar dos bases necesitamos un **atributo en común**, es decir que haya una columna que se repita en ambas, que nos permita identificar a cada unidad en cada base para poder mantener las columnas de la base X y adosar las columnas de la base Y Si pensamos en el caso de la base EPH individual y la EPH hogar tendríamos una estructura de este estilo: <img src="inputs/Clase3/join_intro_eph.png" width="50%" height="30%" style="display: block; margin: auto;" /> --- ## Manipular bases: join En la base de individuos cada hogar se repite *n* veces, siendo *n* la cantidad de miembros del hogar. -- En este caso el hogar `1` tiene un miembro, el hogar `2` tiene tres miembros y el hogar `3` tiene dos. -- Mientras que en la base de hogar tenemos una sola observación por hogar -- **La estructura de las bases son distintas**. Y entender cuál es la estructura de cada base en términos del identificador que las vincula, es importante para entender qué estamos haciendo. -- Estamos combinando una base que tiene varias observaciones **para un mismo identificador** junto con otra que tiene una sola observación por identificador --- ## Manipular bases: join Según como sea la estructura de las bases a combinar tendremos 4 posibilidades diferentes: - **1-1 (one to one)** -- Ambas bases de datos tienen una sola observación por id -- - **1-m (one to many)** -- La base de la izquierda tiene una única obs por id y a la derecha múltiples -- - **m-1 (many to one)** -- La base de la izquierda tiene múltiples obs por id y a la derecha una única -- - **m-m (many to many)** -- Ambas bases tiene múltilpes observaaciones por id --- ## Manipular bases: join La estructura de la base resultante dependerá de la estructura de cada una -- Apliquemos el ejemplo de la PEH individual, a la cual queremos adosar algunas columnas de la EPH de hogares. -- Carguemos primero la base y seleccionemos 4 variables en cada una, aparte de las identificadoras -- ```r eph_ind <- read.csv("datos/Clase2/EPH_3T_22/usu_individual_T322.txt", sep=";", dec=",") eph_ind <- eph_ind %>% select(CODUSU, NRO_HOGAR, AGLOMERADO, CH03, CH04, CH06) %>% rename_with(tolower) %>% rename(relacion=ch03, sexo=ch04, edad=ch06) ``` ```r eph_hog <- read.csv("datos/Clase2/EPH_3T_22/usu_hogar_T322.txt", sep=";", dec=",") eph_hog <- eph_hog %>% select(CODUSU, NRO_HOGAR, AGLOMERADO, IV1, IV2, IV6, IV8) %>% rename_with(tolower) %>% rename(tipo_viv=iv1, n_ambiente=iv2, agua=iv6, baño=iv8) ``` --- ## Manipular bases: join La función `inner_join()` nos permite realizar esta combinación. Para ello debemos especificar 3 argumentos esenciales - `x=` dataframe de la izquierda - `y=` dataframe de la derecha - `by=` variable/s identificadora -- El atributo para vincular ambas bases será el **identificador único** que es la combinación de las variables CODUSU Y NRO_HOGAR, ```r eph_all <- inner_join(x=eph_ind, y=eph_hog, by=c("codusu", "nro_hogar")) ``` <br /> -- Revisemos la dimensión de la base resultante. Debería tener cuantas filas?... --- ## Manipular bases: join Pensemos en la estructura de los datos. -- Realizamos una combinación del tipo **m-1 (many to one)** -- . Si logramos asignarle correctamente a cada miembro las variables de su hogar, deberíamos tener la misma cantidad de filas que la base individual ```r nrow(eph_all)==nrow(eph_ind) ``` ``` ## [1] TRUE ``` Pero ahora nuestra base tiene el agregado de las columnas adosadas: ```r names(eph_all) ``` ``` ## [1] "codusu" "nro_hogar" "aglomerado.x" "relacion" "sexo" ## [6] "edad" "aglomerado.y" "tipo_viv" "n_ambiente" "agua" ## [11] "baño" ``` -- En la base resultante tenemos para cada persona, las variables que corresponden a nivel hogar. -- **Nuestro join fue exitoso!** --- ## Manipular bases: join En el output de nombres vemos que R no duplicó las columnas que funcionaban de id, pero la columna de aglomerado que estaba presente en ambas bases quedó duplicada indicada con un subíndice por default. -- A veces es útil mantener una misma columna de bases distintas, para chequear que el merge funcionó bien o simplemente porque necesitamos compararlas -- . En estos casos el argumento `suffix=` nos permite agregar un sufijo a elección, por ejemplo: ```r eph_all <- inner_join(x=eph_ind, y=eph_hog, by=c("codusu", "nro_hogar"), suffix = c("_ind", "_hog")) names(eph_all) ``` ``` ## [1] "codusu" "nro_hogar" "aglomerado_ind" "relacion" ## [5] "sexo" "edad" "aglomerado_hog" "tipo_viv" ## [9] "n_ambiente" "agua" "baño" ``` --- ## Manipular bases: join El ejemplo con la EPH es una caso particular donde por construcción todas las observaciones en la base de individuos encuentran una correspondencia con el id por hogar -- En un mismo trimestre nunca tendremos el caso de que en la base de la izquierda **hay observaciones que no matcheen con al menos una** de la derecha, ni viceversa -- Sin embargo esto sí es algo muy común al trabajar con cualquier otra bases de datos. Es probable que al combinar dos dataframes nos encontremos con un caso como este o similar: <img src="inputs/Clase3/join_intro.png" width="40%" height="20%" style="display: block; margin: auto;" /> --- ## Manipular bases: join Pero qué pasa si tenemos **observaciones diferentes** en cada base. -- Es decir en la base X tenemos filas que no están presentes en la base Y, o viceversa, o ambos casos en simultaneo -- **¿Queremos mantener todas, solo las de la base X, o solo las de la base Y?** -- Cómo combinamos o preservamos las filas entre bases depende del tipo de cruce que haremos. Es decir del criterio con el que definimos este emparejamiento o match entre filas. -- En el ejemplo anterior utilizamos el `inner_join()`, pero en realidad este es una de 4 las opciones que podemos emplear para **definir un match** - **Inner join** mantiene solo las observaciones comunes entre x e y - **Left join** mantiene todas las observaciones que están en x - **Right join** mantiene todas las observaciones que están en y - **Full join** mantiene todas las observaciones que están tanto en x como en y --- ## Manipular bases: join En la figura anterior ilustramos un caso donde las observaciones difieren entre bases, incluso cuando tengamos una relación de 1-1 (one to one) -- La figura nos ayuda a clarificar que, el tipo de relación o **correspondencia entre observaciones** y **los casos de observaciones faltantes** entre bases, aunque puedan confundirse, son en realidad son **dos cuestinoes diferentes** - El tipo de relación o correspondencia: refiere a si *un mismo id matchea con mas de una fila* en alguna de las bases -- - Las observaciones faltantes o diferentes: responde al criterio de qué hacer con las *filas que no encuentran un match* -- --- ## Manipular bases: join Más allá del tipo de relación entre bases (1-1; m-1; 1-m; m-m) podemos tener filas que no encuentren un match <img src="inputs/Clase3/join_intro_eph_caso2.png" width="40%" height="20%" style="display: block; margin: auto;" /> -- Entonces debemos **definir un criterio** para tratar estas filas sin match, es decir para preservarlas o descartarlas según en qué base se encuentren. Esto es lo que hacemos con laos 4 tipos de funciones join: `inner_join()` `left_join()` `right_join()` `full_join()` -- Veamos cada una en detalle. Para ilustrar usaremos la relación mas simple de 1-1 y haremos la aplicación con un sampleo de las bases de EPH, por lo que la relación sera de m-1 --- ## Manipular bases: inner_join Comencemos con esta función que ya empleamos antes. <img src="inputs/Clase3/inner_join.png" width="60%" height="40%" style="display: block; margin: auto;" /> --- ## Manipular bases: inner_join Este es el caso mas estricto, donde solo mantenemos las filas que encuentran un match <img src="inputs/Clase3/inner_join_comp.png" width="80%" height="60%" style="display: block; margin: auto;" /> --- ## Manipular bases: inner_join Para aplicar el caso, como la EPH por construcción no presenta id faltantes en las bases, generamos un ejemplo artificial con un sampleo aleatorio del 75% la base de individuos y de hogares. -- - base X: random sample de la base de individuos - base y: random sample de la base de hogares -- ```r eph_ind_samp <- sample_frac(eph_ind, 0.75, replace = FALSE) eph_hog_samp <- sample_frac(eph_hog, 0.75, replace = FALSE) ``` De esta forma tendremos algunas observaciones faltantes en cada base --- ## Manipular bases: inner_join La función en este caso es `inner_join()` y los argumentos a especificar son los mismos que antes - `x=` dataframe de la izquierda - `y=` dataframe de la derecha - `by=` variable/s identificadora ```r comunes <- inner_join(eph_ind_samp, eph_hog_samp, by=c("codusu", "nro_hogar")) ``` --- ## Manipular bases: inner_join La funcion `setdiff()` nos devuelve las filas que aparecen en un vector pero no en otro. De esta forma, si resumimos "codusu" y "nro_hogar" en una sola columna "id" podemos testear facilmente nuestro resultado ```r eph_hog_samp$id <- paste(eph_hog_samp$codusu, eph_hog_samp$nro_hogar, sep="-") eph_ind_samp$id <- paste(eph_ind_samp$codusu, eph_ind_samp$nro_hogar, sep="-") #Rows that appear in "ind" but not "hog" out_izq <- setdiff(eph_ind_samp$id, eph_hog_samp$id) #Rows that appear in "hog" but not "ind" out_der <- setdiff(eph_hog_samp$id, eph_ind_samp$id) #Check si los id en el inner_join están en las lista de los "out" comunes$id <- paste(comunes$codusu, comunes$nro_hogar, sep="-") nrow( comunes %>% filter(id %in% out_izq | id %in% out_der) ) ``` ``` ## [1] 0 ``` Vemos que ninguno de los "id" que no encuentran match entre bases, están incluidos en el dataframe resultante del inner_join --- ## Manipular bases: left_join En este segundo criterio mantendremos siempre las filas presentes en la base x <img src="inputs/Clase3/left_join.png" width="60%" height="40%" style="display: block; margin: auto;" /> --- ## Manipular bases: left_join En este segundo criterio mantendremos siempre las filas presentes en la base x <img src="inputs/Clase3/left_join_comp.png" width="80%" height="60%" style="display: block; margin: auto;" /> --- ## Manipular bases: left_join Como pueden intuir la función es `left_join()` y los argumentos a especificar son los mismos que antes ```r todas_x <- left_join(eph_ind_samp, eph_hog_samp, by=c("codusu", "nro_hogar")) ``` -- La cantidad de filas de la base resultante tiene que ser la misma que la base indicada como `x` ```r nrow(todas_x)==nrow(eph_ind_samp) ``` ``` ## [1] TRUE ``` -- Pero la cantidad de columnas ser mayor, ```r dim(todas_x) ``` ``` ## [1] 36924 13 ``` --- ## Manipular bases: right_join Bajo este criterio mantendremos siempre las filas presentes en la base y <img src="inputs/Clase3/right_join.png" width="60%" height="40%" style="display: block; margin: auto;" /> --- ## Manipular bases: right_join Bajo este criterio mantendremos siempre las filas presentes en la base y <img src="inputs/Clase3/right_join_comp.png" width="80%" height="60%" style="display: block; margin: auto;" /> --- ## Manipular bases: right_join La función a emplear es `right_join()` ```r todas_y <- right_join(eph_ind_samp, eph_hog_samp, by=c("codusu", "nro_hogar")) ``` La cantidad de filas de la base resultantes tiene que ser la misma que en la base indicada como `y`? -- ```r nrow(todas_y)==nrow(eph_hog_samp) ``` ``` ## [1] FALSE ``` -- La cantidad de filas ** no duplicadas** de la base resultantes tiene que ser la misma que en la base indicada como `y` -- . Y la cantidad de columnas tiene que ser mayor, ```r nrow(distinct(todas_y, codusu, nro_hogar))==nrow(eph_hog_samp) dim(todas_y) ``` ``` ## [1] TRUE ## [1] 28610 13 ``` --- ## Manipular bases: full_join Este criterio es el mas abarcativo de todos, ya que considera todas las filas <img src="inputs/Clase3/full_join.png" width="60%" height="40%" style="display: block; margin: auto;" /> --- ## Manipular bases: full_join Este criterio es el mas abarcativo de todos, ya que considera todas las filas <img src="inputs/Clase3/full_join_comp.png" width="80%" height="60%" style="display: block; margin: auto;" /> --- ## Manipular bases: full_join La función en este caso es `full_join()` ```r todas <- full_join(eph_ind_samp, eph_hog_samp, by=c("codusu", "nro_hogar")) ``` Chequemos que esta df sea el conjunto mas amplio de todos los joins anteriores y que contenga tanto a los id faltantes de la base de individuos como los de hogares -- ```r nrow(todas)>nrow(comunes) nrow(todas)>nrow(todas_y) nrow(todas)>nrow(todas_x) ``` ``` ## [1] TRUE ## [1] TRUE ## [1] TRUE ``` -- ```r #Check si los id sin correspondencia están incluidos en la base resultante todas$id <- paste(todas$codusu, todas$nro_hogar, sep="-") nrow( todas %>% filter(id %in% out_izq | id %in% out_der) ) ``` ``` ## [1] 10268 ``` --- ## Manipular bases: tips for join Antes de pasar al tema siguiente, recomiendo poder examinar otros ejemplos y aplicaciones de joins mas allá de este ejemplo que hemos presentado con la EPH. -- Este tipo de operaciones es de las operaciones mas frecuentes al trabajar con datos y son fuente de errores o modificaciones no deseadas en los datos -- Siempre es recomendable tomarse unos minutos para analizar lo siguiente antes de un join: - Averiguar cómo es la correspondencia entre las observaciones de cada base? 1-1; m-1; 1-m? - Evitar cruces que implique relaciones m-m, la base resultante es difícil de interpretar y rara vez es necesario este tipo de combinaciones - Averiguar si tengo filas diferentes en cada base? Siempre es bueno realizar un check de filas faltantes con `setdiff()` - Entender cuál es la estructura del dataframe resultante que necesito - En base a ellos pensar que criterio de join se debe emplear - Lo mas importante, chequear que el resultado sea el correcto y no darlo por hecho --- ## Manipular bases: errores mas comunes en join --- ## Manipular bases: append Pasemos ahora a otro tipo de operaciones, que implicar combinar bases, pero no matchear sino que juntatarlas Tipicamente existen dos tipos de operaciones entre bases - **Combinar bases de datos** - Cruzar bases (Join) - **Extender bases (Append)** - Reshape de una base de datos --- ## Manipular bases: append Cuando tenemos dos o mas bases de datos y queremos juntarlas en una sola, lo que estamos buscando es extender la base, es decir **sumar las filas de bases diferentes** <img src="inputs/Clase3/bind_rows.png" width="60%" height="35%" style="display: block; margin: auto;" /> -- Por lo general, y en la mayoría de los casos estas bases comparten las mismas columnas y lo que precisamos es apilarlas -- Siguiendo con la EPH el ejemplo más tipico, ocurre cuando para una base de individuos u hogares de un trimestre, queremos sumarle la misma base de un trimestre anterior --- ## Manipular bases: append Veamos cómo hacer esto en R. -- La función para este tipo de operaciones como su nombre lo indica es `bind_rows()` -- . Y requiere solo dos argumentos, los dataframes que queremos juntar -- Para nuestra aplicación, a la base de individuos del 3er trimestre 2022 con las columnas elegidas antes, agreguemosle la base del 2do trimestre -- Primero carguemos la base y renombramos la EPH individual que ya estaba cargada en nuestro entorno de trabajo ```r eph_ind_2t <- read.csv("datos/Clase3/EPH_2T_22/usu_individual_T222.txt", sep=";", dec=",") eph_ind_2t <- eph_ind_2t %>% select(CODUSU, NRO_HOGAR, AGLOMERADO, CH03, CH04, CH06) %>% rename_with(tolower) %>% rename(relacion=ch03, sexo=ch04, edad=ch06) eph_ind_3t <- eph_ind ``` --- ## Manipular bases: append Ya estamos listos para hacer el append ```r eph_ind_append <- bind_rows(eph_ind_2t, eph_ind_3t) ``` Corroboremos que la cantidad de filas corresponden a la suma de cada base ```r nrow(eph_ind_append)==( nrow(eph_ind_2t) + nrow(eph_ind_3t) ) ``` ``` ## [1] TRUE ``` Listo! --- ## Manipular bases: append ¿Y que ocurre en el caso de que las columnas que tenemos en cada base sean distintas y queramos apilar las bases sin perder las columnas propias de cada base? Bueno, en realidad no pasa nada, la función puede lidiar con estos casos -- Cuando se hace un append de filas, las columnas se emparejan por nombre y las columnas faltantes se completarán con `NA` ```r eph_ind_3t <- eph_ind_3t %>% select(-edad) eph_ind_2t <- eph_ind_2t %>% select(-sexo) eph_ind_append <- bind_rows(eph_ind_2t, eph_ind_3t) ``` --- ## Manipular bases: append Con `head()` veremos las primeras observaciones que son las del 2do-trim y con `tail()` nos devuelve las ultimas observaciones, que corresponden a las filas del 3er-trim, en ambos casos con `NA` en la variable faltante ```r head(eph_ind_append, 5) ``` ``` ## codusu nro_hogar aglomerado relacion edad sexo ## 1 TQRMNOPWWHMMLNCDEFPCH00700147 1 9 1 50 NA ## 2 TQRMNOPXVHLMLMCDEIJAH00706342 1 33 1 52 NA ## 3 TQRMNOPXVHLMLMCDEIJAH00706342 1 33 2 45 NA ## 4 TQRMNOPXVHLMLMCDEIJAH00706342 1 33 3 21 NA ## 5 TQRMNOPXVHLMLMCDEIJAH00706342 1 33 3 12 NA ``` ```r tail(eph_ind_append, 5) ``` ``` ## codusu nro_hogar aglomerado relacion edad sexo ## 99842 TQRMNOQTYHLNKPCDEIHJF00707321 1 31 1 NA 1 ## 99843 TQRMNOSVTHLNMQCDEIJAH00785774 1 33 3 NA 1 ## 99844 TQRMNOSVTHLNMQCDEIJAH00785774 1 33 3 NA 2 ## 99845 TQRMNOSVTHLNMQCDEIJAH00785774 1 33 1 NA 2 ## 99846 TQRMNOSVTHLNMQCDEIJAH00785774 1 33 2 NA 1 ``` --- ## Manipular bases: append Un tip adicional sobre `bind_rows()` - Pueden explorar el argumento adicional `id`, que indica que se cree una columna nueva para identifcar de qué dataframe provino cada observación. -- Esto en ciertos contextos resulta muy útil -- ```r eph_ind_append <- bind_rows(eph_ind_2t, eph_ind_3t, .id = "origen") table(eph_ind_append$origen) ``` ``` ## ## 1 2 ## 50614 49232 ``` --- ## Manipular bases: append Existe también la función `bind_cols()` que permite juntar las columnas de bases distintas. -- Sin embargo deben ser cuidadosos a la hora de usarla ya que al juntar columnas **se toma en cuenta la posición de las filas**. Solo es recomendable cuando están seguros de que las observaciones son las mismas y están ordenadas con la misma posición en cada base de datos -- <img src="inputs/Clase3/bind_cols.png" width="70%" height="70%" style="display: block; margin: auto;" /> -- En caso contrario, y para evitar asiganciones incorrectas, es mejor usar los *mutating joins*! --- ## Manipular bases: pivot Pasemos a otro tipo de operaciones que se dan cuando necesitamos cambiar la estructura de la base. - Combinar bases de datos - Cruzar bases (Join) - Extender bases (Append) - **Reshape de una base de datos** --- ## Manipular bases: pivot Un mismo dataframe puede almacenar los mismos datos, pero en estructuras distintas. Realizar un *reshape* o *pivotar* una base de datos, implica mantener tal cual los valores y la información de la tabla, alterando la forma o la disposición de esos datos: -- Existen dos formatos para una dataframe: - **long**: en el cual los datos estan apilados, una misma observación se repite ya que los distintos valores de la columna se ordenan uno debajo del otro -- - **wide**: los datos están dispuestos en sentido horizontal, con múltiples columnas y con observaciones que no se repiten --- ## Manipular bases: pivot Para ver un caso, trabajemos con una base ejemplo que tiene para cada región los distintos valores del ingreso laboral en distintos años: ```r inc_reg <- read.csv("datos/Clase3/inc_region.csv") ``` Visualicemos nuestra base -- Qué formato tiene -- ¿Wide o long? <table class="table table-condensed table-responsive" style="font-size: 15px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Region </th> <th style="text-align:right;"> ila2010 </th> <th style="text-align:right;"> ila2011 </th> <th style="text-align:right;"> ila2012 </th> <th style="text-align:right;"> ila2013 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:right;"> 1181.42 </td> <td style="text-align:right;"> 1200.50 </td> <td style="text-align:right;"> 1380.58 </td> <td style="text-align:right;"> 1449.60 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:right;"> 929.61 </td> <td style="text-align:right;"> 1002.58 </td> <td style="text-align:right;"> 1223.15 </td> <td style="text-align:right;"> 1302.65 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:right;"> 769.69 </td> <td style="text-align:right;"> 780.30 </td> <td style="text-align:right;"> 850.53 </td> <td style="text-align:right;"> 927.07 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:right;"> 692.52 </td> <td style="text-align:right;"> 705.89 </td> <td style="text-align:right;"> 875.30 </td> <td style="text-align:right;"> 901.56 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:right;"> 1505.07 </td> <td style="text-align:right;"> 1710.60 </td> <td style="text-align:right;"> 2223.78 </td> <td style="text-align:right;"> 2490.63 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:right;"> 613.58 </td> <td style="text-align:right;"> 652.40 </td> <td style="text-align:right;"> 841.60 </td> <td style="text-align:right;"> 967.84 </td> </tr> </tbody> </table> -- Wide! Las regiones no se repiten y hay una columna distinta para cada año --- ## Manipular bases: pivot_longer ¿Cómo podemos convertirla a long? -- Hagamos un pivot de nuestra base. Es decir vamos a **"alargar" los datos** colapsando **múltiples columnas** del ingreso **en una sola** y apilando cada uno de sus valores en una misma columna -- Cada una de las columnas que estamos reconviertiendo, son ahora valores por fila de la columna única en la que colapsamos la base -- <img src="inputs/Clase3/pivot_longer.png" width="70%" height="70%" style="display: block; margin: auto;" /> --- ## Manipular bases: pivot_longer La función para realizar esta operación es `pivot_longer()` y conocer sus argumentos es muy importante: - `data` -- :dataframe -- - `cols` -- : columnas que queremos pivotar -- - `names_to = "name"` -- : nombra la nueva variable que almacena los nombres de las actuales columnas -- - `values_to = "value"` -- : nombra la nueva variable que almacena los valores de cada columna actual -- Ahora sí, podemos aplicar la función y hacer un reshape **de wide a long** de la base ```r inc_reg_long <- inc_reg %>% pivot_longer(cols = c(ila2010, ila2011, ila2012, ila2013), names_to = "anio", values_to = "ila") ``` --- ## Manipular bases: pivot_longer .pull-left[ <table class="table table-condensed table-responsive" style="font-size: 12.5px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> anio </th> <th style="text-align:right;"> ila </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila2010 </td> <td style="text-align:right;"> 1181.42 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila2011 </td> <td style="text-align:right;"> 1200.50 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila2012 </td> <td style="text-align:right;"> 1380.58 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila2013 </td> <td style="text-align:right;"> 1449.60 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila2010 </td> <td style="text-align:right;"> 929.61 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila2011 </td> <td style="text-align:right;"> 1002.58 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila2012 </td> <td style="text-align:right;"> 1223.15 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila2013 </td> <td style="text-align:right;"> 1302.65 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila2010 </td> <td style="text-align:right;"> 769.69 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila2011 </td> <td style="text-align:right;"> 780.30 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila2012 </td> <td style="text-align:right;"> 850.53 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila2013 </td> <td style="text-align:right;"> 927.07 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila2010 </td> <td style="text-align:right;"> 692.52 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila2011 </td> <td style="text-align:right;"> 705.89 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila2012 </td> <td style="text-align:right;"> 875.30 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila2013 </td> <td style="text-align:right;"> 901.56 </td> </tr> </tbody> </table> ] .pull-right[ Excelente! Logramos alargar nuestra base - Ahora cada región se repite 4 veces (1 por año) -- - Tenemos una columna que condensa lo que antes eran nombres de columnas separadas -- - Tenemos una columna que condensa los valores de las columnas anteriores ] --- ## Manipular bases: pivot_longer Veamos un argumento adicional que suele ser muy útil. De la tabla de datos pueden notar que la columna año contiene el string *"ila"* seguido por el año en números -- Para tener una base limpia no quisieramos repetir ese string, sino solo quedarnos con una columna numérica de años. -- La función posee un argumento opcional `names_prefix=` que justamente hace este trabajo, tomando el patron indicado y quitandolo de los valores de la nueva columna -- ```r inc_reg_long_v2 <- inc_reg %>% pivot_longer(cols = starts_with("ila"), #check this names_to = "anio", * names_prefix = "ila", values_to = "ila") ``` -- Ahora comparemos resultados y veamos como mejora nuestra tabla --- ## Manipular bases: pivot_longer .pull-left[ Antes: <table class="table table-condensed table-responsive" style="font-size: 12px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> anio </th> <th style="text-align:right;"> ila </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila2010 </td> <td style="text-align:right;"> 1181.42 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila2011 </td> <td style="text-align:right;"> 1200.50 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila2012 </td> <td style="text-align:right;"> 1380.58 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila2013 </td> <td style="text-align:right;"> 1449.60 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila2010 </td> <td style="text-align:right;"> 929.61 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila2011 </td> <td style="text-align:right;"> 1002.58 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila2012 </td> <td style="text-align:right;"> 1223.15 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila2013 </td> <td style="text-align:right;"> 1302.65 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila2010 </td> <td style="text-align:right;"> 769.69 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila2011 </td> <td style="text-align:right;"> 780.30 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila2012 </td> <td style="text-align:right;"> 850.53 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila2013 </td> <td style="text-align:right;"> 927.07 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila2010 </td> <td style="text-align:right;"> 692.52 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila2011 </td> <td style="text-align:right;"> 705.89 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila2012 </td> <td style="text-align:right;"> 875.30 </td> </tr> </tbody> </table> ] .pull-right[ Después: <table class="table table-condensed table-responsive" style="font-size: 12px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Region </th> <th style="text-align:left;"> anio </th> <th style="text-align:right;"> ila </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:right;"> 1181.42 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:right;"> 1200.50 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:right;"> 1380.58 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:right;"> 1449.60 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:right;"> 929.61 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:right;"> 1002.58 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:right;"> 1223.15 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:right;"> 1302.65 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:right;"> 769.69 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:right;"> 780.30 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:right;"> 850.53 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:right;"> 927.07 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:right;"> 692.52 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:right;"> 705.89 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:right;"> 875.30 </td> </tr> </tbody> </table> ] --- ## Manipular bases: pivot_wider Bien, ahora que tenemos nuestra base en formato long, aprendamos como pasar a wide. Queremos ahora **"ampliar" la base** de datos **expandiendo una columna en varias**. Para un mismo grupo, cada valor distinto que tomaba la columna que estamos reconviertiendo, es ahora una columna de la base resultante -- <img src="inputs/Clase3/pivot_wider.png" width="70%" height="70%" style="display: block; margin: auto;" /> --- ## Manipular bases: pivot_wider La función para realizar esta operación es `pivot_wider` y sus argumentos son distintos a la función anterior -- - `data` -- : indica el dataframe -- - `names_from = "name"` -- : qué columna buscamos convertir en múltiples columnas -- - `values_from = "value"` -- : qué columna almacena los valores de las nuevas columnas -- Apliquemos la función para pasar de **long a wide** ```r inc_reg_wide <- inc_reg_long %>% pivot_wider(names_from = anio, values_from = ila ) ``` --- ## Manipular bases: pivot_wider Veamos cómo resultó -- <table class="table table-condensed table-responsive" style="font-size: 15px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Region </th> <th style="text-align:right;"> ila2010 </th> <th style="text-align:right;"> ila2011 </th> <th style="text-align:right;"> ila2012 </th> <th style="text-align:right;"> ila2013 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:right;"> 1181.42 </td> <td style="text-align:right;"> 1200.50 </td> <td style="text-align:right;"> 1380.58 </td> <td style="text-align:right;"> 1449.60 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:right;"> 929.61 </td> <td style="text-align:right;"> 1002.58 </td> <td style="text-align:right;"> 1223.15 </td> <td style="text-align:right;"> 1302.65 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:right;"> 769.69 </td> <td style="text-align:right;"> 780.30 </td> <td style="text-align:right;"> 850.53 </td> <td style="text-align:right;"> 927.07 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:right;"> 692.52 </td> <td style="text-align:right;"> 705.89 </td> <td style="text-align:right;"> 875.30 </td> <td style="text-align:right;"> 901.56 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:right;"> 1505.07 </td> <td style="text-align:right;"> 1710.60 </td> <td style="text-align:right;"> 2223.78 </td> <td style="text-align:right;"> 2490.63 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:right;"> 613.58 </td> <td style="text-align:right;"> 652.40 </td> <td style="text-align:right;"> 841.60 </td> <td style="text-align:right;"> 967.84 </td> </tr> </tbody> </table> Bien, volvimos a nuestro formato wide original: - Las regiones no se repiten -- - Y para cada año tenemos una columna --- ## Manipular bases: pivot Hasta ahora vimos un caso relativamente simple, siempre condensamos muchas columnas en una sola -- . Suele darse casos mas desafiantes, donde la estructura de los datos requiere realizar un reshape hacia multiples columnas -- Para ver un ejemplo, carguemos también una base de ingreso a nivel de regiones, pero ahora tenemos mas columnas: ```r inc_reg_ext <- read.csv("datos/Clase3/inc_region_ext.csv", sep=";") ``` <div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:250px; overflow-x: scroll; width:100%; "><table class="table table-condensed table-responsive" style="font-size: 13px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Region </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> ila_2010_ars </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> ila_2011_ars </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> ila_2012_ars </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> ila_2013_ars </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> ila_2010_usd </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> ila_2011_usd </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> ila_2012_usd </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> ila_2013_usd </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> inola_2010_ars </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> inola_2011_ars </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> inola_2012_ars </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> inola_2013_ars </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> inola_2010_usd </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> inola_2011_usd </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> inola_2012_usd </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> inola_2013_usd </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:right;"> 118142 </td> <td style="text-align:right;"> 12005 </td> <td style="text-align:right;"> 138058 </td> <td style="text-align:right;"> 14496 </td> <td style="text-align:right;"> 303 </td> <td style="text-align:right;"> 31 </td> <td style="text-align:right;"> 354 </td> <td style="text-align:right;"> 37 </td> <td style="text-align:right;"> 23628 </td> <td style="text-align:right;"> 2401 </td> <td style="text-align:right;"> 27612 </td> <td style="text-align:right;"> 2899 </td> <td style="text-align:right;"> 61 </td> <td style="text-align:right;"> 6 </td> <td style="text-align:right;"> 71 </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:right;"> 92961 </td> <td style="text-align:right;"> 100258 </td> <td style="text-align:right;"> 122315 </td> <td style="text-align:right;"> 130265 </td> <td style="text-align:right;"> 238 </td> <td style="text-align:right;"> 257 </td> <td style="text-align:right;"> 314 </td> <td style="text-align:right;"> 334 </td> <td style="text-align:right;"> 18592 </td> <td style="text-align:right;"> 20052 </td> <td style="text-align:right;"> 24463 </td> <td style="text-align:right;"> 26053 </td> <td style="text-align:right;"> 48 </td> <td style="text-align:right;"> 51 </td> <td style="text-align:right;"> 63 </td> <td style="text-align:right;"> 67 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:right;"> 76969 </td> <td style="text-align:right;"> 7803 </td> <td style="text-align:right;"> 85053 </td> <td style="text-align:right;"> 92707 </td> <td style="text-align:right;"> 197 </td> <td style="text-align:right;"> 20 </td> <td style="text-align:right;"> 218 </td> <td style="text-align:right;"> 238 </td> <td style="text-align:right;"> 15394 </td> <td style="text-align:right;"> 1561 </td> <td style="text-align:right;"> 17011 </td> <td style="text-align:right;"> 18541 </td> <td style="text-align:right;"> 39 </td> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 44 </td> <td style="text-align:right;"> 48 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:right;"> 69252 </td> <td style="text-align:right;"> 70589 </td> <td style="text-align:right;"> 8753 </td> <td style="text-align:right;"> 90156 </td> <td style="text-align:right;"> 178 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 22 </td> <td style="text-align:right;"> 231 </td> <td style="text-align:right;"> 13850 </td> <td style="text-align:right;"> 14118 </td> <td style="text-align:right;"> 1751 </td> <td style="text-align:right;"> 18031 </td> <td style="text-align:right;"> 36 </td> <td style="text-align:right;"> 36 </td> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 46 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:right;"> 150507 </td> <td style="text-align:right;"> 17106 </td> <td style="text-align:right;"> 222378 </td> <td style="text-align:right;"> 249063 </td> <td style="text-align:right;"> 386 </td> <td style="text-align:right;"> 44 </td> <td style="text-align:right;"> 570 </td> <td style="text-align:right;"> 639 </td> <td style="text-align:right;"> 30101 </td> <td style="text-align:right;"> 3421 </td> <td style="text-align:right;"> 44476 </td> <td style="text-align:right;"> 49813 </td> <td style="text-align:right;"> 77 </td> <td style="text-align:right;"> 9 </td> <td style="text-align:right;"> 114 </td> <td style="text-align:right;"> 128 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:right;"> 61358 </td> <td style="text-align:right;"> 6524 </td> <td style="text-align:right;"> 8416 </td> <td style="text-align:right;"> 96784 </td> <td style="text-align:right;"> 157 </td> <td style="text-align:right;"> 17 </td> <td style="text-align:right;"> 22 </td> <td style="text-align:right;"> 248 </td> <td style="text-align:right;"> 12272 </td> <td style="text-align:right;"> 1305 </td> <td style="text-align:right;"> 1683 </td> <td style="text-align:right;"> 19357 </td> <td style="text-align:right;"> 31 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 50 </td> </tr> </tbody> </table></div> --- ## Manipular bases: pivot Ahora ya no solo tenemos el ingreso laboral para distintos años, sino que en este nuevo dataframe los nombres de las columnas indican además del año otras distintas opciones para el ingreso: - ingreso laboral e ingreso no laboral - expresado en pesos o en dolares -- Tenemos 4 años, 2 tipos de monedas y 2 tipos de ingreso, en total son 16 columnas -- Que podemos re-organizar en 3 columnas diferentes: "ingreso", "años" y "moneda" -- ¿Cómo lograr identifcar esta separación?. Cada una de las opciones está indicada luego de un `"_"` -- Este patrón nos permite seprar las columnas -- Veamos como escribir el código: --- ## Manipular bases: pivot Ahora queremos pivotear todas las columnas y mantener la de región, esto mismo es lo que especificamos en el código. -- El argumento clave es `names_sep="_"` ```r inc_reg_long <- inc_reg_ext %>% pivot_longer( cols = !(Region), names_to = c("ingreso", "año", "moneda"), * names_sep = "_", values_to = "monto" ) ``` --- ## Manipular bases: pivot Veamos nuestro resultado <div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:450px; overflow-x: scroll; width:100%; "><table class="table table-condensed table-responsive" style="font-size: 13px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Region </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> ingreso </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> año </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> moneda </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> monto </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 118142 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 12005 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 138058 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 14496 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 303 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 31 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 354 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 37 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 23628 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 2401 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 27612 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 2899 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 61 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 6 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 71 </td> </tr> <tr> <td style="text-align:left;"> GBA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 92961 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 100258 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 122315 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 130265 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 238 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 257 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 314 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 334 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 18592 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 20052 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 24463 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 26053 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 48 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 51 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 63 </td> </tr> <tr> <td style="text-align:left;"> Pampeana </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 67 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 76969 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 7803 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 85053 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 92707 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 197 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 20 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 218 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 238 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 15394 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 1561 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 17011 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 18541 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 39 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 4 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 44 </td> </tr> <tr> <td style="text-align:left;"> Cuyo </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 48 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 69252 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 70589 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 8753 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 90156 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 178 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 181 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 22 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 231 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 13850 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 14118 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 1751 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 18031 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 36 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 36 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 4 </td> </tr> <tr> <td style="text-align:left;"> NOA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 46 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 150507 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 17106 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 222378 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 249063 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 386 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 44 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 570 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 639 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 30101 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 3421 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 44476 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 49813 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 77 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 9 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 114 </td> </tr> <tr> <td style="text-align:left;"> Patagonia </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 128 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 61358 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 6524 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 8416 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 96784 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 157 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 17 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 22 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> ila </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 248 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 12272 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 1305 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 1683 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> ars </td> <td style="text-align:right;"> 19357 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2010 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 31 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2011 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 3 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2012 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 4 </td> </tr> <tr> <td style="text-align:left;"> NEA </td> <td style="text-align:left;"> inola </td> <td style="text-align:left;"> 2013 </td> <td style="text-align:left;"> usd </td> <td style="text-align:right;"> 50 </td> </tr> </tbody> </table></div> --- ## Gestionar bases: Para finalizar veamos como importar y exportar multiples tipos de bases de datos, y cómo gestionar los path y carpetas para trabajar ordenadamente El primer paso para gestionar bases de datos es poder ordenarnos: -- Para eso nos resulta de ayuda gestionar los directorios desde los cuales vamos a trabajar. -- --- ## Gestionar bases: directorio Una primera opción es fijar los directorios con las funciones -`setwd()`: permite fijar el directorio de trabajo -`getwd()`: devuelve el directorio actual de trabajo ```r #defino path setwd("C:/Users/HP/Dropbox/Educ Mobility - Censos IPUMS/") #return actual path getwd() ``` --- ## Gestionar bases: directorio Una primera opción es fijar los directorios con las funciones -`setwd()`: permite fijar el directorio de trabajo -`getwd()`: devuelve el directorio actual de trabajo ```r #defino path setwd("C:/Users/HP/Dropbox/Educ Mobility - Censos IPUMS/") #set folders path data_dir <- paste(getwd(), "Data/") script_dir <- paste(getwd(), "Codes/R-scripts/auxiliar codes/") ``` --- ## Gestionar bases: directorio Un tip que utilizo mucho es definir una simbolo que cumpla la función de paste, de concatenar strings pero de manera mas directa -- Como si fuera un "pipe para strings" ```r "%+%" <- function(x,y) paste(x,y,sep = "") #defino path setwd("C:/Users/HP/Dropbox/Educ Mobility - Censos IPUMS/") #set folders path data_dir <- getwd() %+% "Data/") script_dir <- getwd() %+% "Codes/R-scripts/auxiliar codes/") ``` --- ## Gestionar bases: directorio Otra opción es definir el path en un objeto y luego llamarlo cuando vayamos a acceder a un archivo o para setear subcarpetas -- Definamos el objeto `root` como path general y luego las subcarpetas donde queremos guardar las bases y exportar los resultados ```r "%+%" <- function(x,y) paste(x,y,sep = "") #defino path root <- "C:/Users/HP/Dropbox/Educ Mobility - Censos IPUMS/" #set folders path data_dir <- root %+% "Data/" script_dir <- root %+% "Codes/R-scripts/auxiliar codes/" ``` Noten que, a diferencia de usar `setwd()`, en esta alternativa cada vez que quieran moverse en la carpeta deben invocar a `root`. -- Ese directorio queda en un objeto y no como directorio por defecto, a menos que lo fijen con `setwd()` --- ## Gestionar bases: importar En la segunda clase vimos dos funciones funciones de `R base` para importar base de datos - `read.csv()` - `read.xls()` -- Para cargar archivos en extensión csv, las funciones básicas funcionan bien, y estos archivos son bastante estandard -- Para archivos de Excel es recomendable sumar la librería `readxl`, que contempla distintos formatos ```r library(readxl) eph_ind_old <- read_xls(data_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.xls") eph_ind_new <- read_xlsx(data_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.xlsx") ``` --- ## Gestionar bases: importar Para otros formatos externos, precisamos la libreria `haven`, que incorpora funciones `read` para extensiones no nativas ```r library(haven) eph_ind_stat <- read_dta(data_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.dta") eph_ind_sas <- read_sas(data_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.sas") eph_ind_spss <- read_spss(data_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.spss") ``` --- ## Gestionar bases: importar Pero no está demás aclarar que también existe el formato nativo de R, es decir, podemos cargar y exportar bases en el formato "original" de R -- Estos formatos son dos: `.Rdata` y `RDS` ```r eph_ind_rdata <- load(data_dir %+% "/Clase3/eph_R.RData") eph_ind_rds <- readRDS(data_dir %+% "/Clase3/eph_R.RDS") ``` --- ## Gestionar bases: exportar Para exportar en formato R, también es muy simple, con las funciones `save()` y `saveRDS()` ```r save(df, file = ouput_dir %+% "df.RData") saveRDS(df, file = ouput_dir %+% "df.RDS") ``` -- Para exportar en un lenguaje no nativo también usamos la librería `haven`, con las funciónes del tipo `write_` ```r library(haven) write_dta(df, output_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.dta") write_dta_sas(df, output_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.sas") write_dta_spss(df, output_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.spss") ``` --- ## Gestionar bases: exportar Lo mismo aplica para exportar un archivo de texto ```r write.csv(df, output_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.csv") ``` -- Para exportar un archivo en excel, así como para importar usábamos `readxl` para exportar existe la librería `writexl` ```r write_xlsx(df, output_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.xlsx") ``` --- ## Gestionar bases: exportar Un uso muy útil de esta función es cuando queremos exportar múltiples dataframes en distintas hojas Para ello, definimos una lista, donde especificamos el nombre de la hoja de excel y el dataframe que exportamos allí ```r write_xlsx(list( "Estimación A" = df_1, "Estimación B" = df_2, "Estimación C" = df_3 ) output_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.xlsx") ``` --- ## Gestionar bases: exportar Dado que existen muchas funciones distintas para importar y cargar, siempre es bueno estar atentos a que la función que usamos proviene de la libería que queremos usar, y no de otra que tiene una función nombre similar -- Sino directamente podemos llamar a las funciones de esa librería ```r eph_ind_new <- readxl::read_xlsx(data_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.xlsx") writexl::write_xlsx(df, output_dir %+% "/Clase3/EPH_3T_22/usu_individual_T322.xlsx") ``` --- ## Gestionar bases: Workflow y repaso Ahora que sabemos declarar directorios, manejar subcarpetas, importar y exportar en múltiples formatos, hagamos un repaso de cómo sería un workflow completo en un código de R -- Para ello abrimos el archivo [scipt_modelo](https://www.dropbox.com/s/8xxwzhuzeqfeip9/script_modelo.R?dl=0)