library(fs)
library(tidyverse)
[30m── [1mAttaching packages[22m ──────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──[39m
[30m[32m✔[30m [34mggplot2[30m 3.2.1 [32m✔[30m [34mpurrr [30m 0.3.2
[32m✔[30m [34mtibble [30m 2.1.3 [32m✔[30m [34mdplyr [30m 0.8.3
[32m✔[30m [34mtidyr [30m 1.0.0 [32m✔[30m [34mstringr[30m 1.4.0
[32m✔[30m [34mreadr [30m 1.3.1 [32m✔[30m [34mforcats[30m 0.4.0[39m
[30m── [1mConflicts[22m ─────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31m✖[30m [34mpurrr[30m::[32mis_null()[30m masks [34mtestthat[30m::is_null()
[31m✖[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()
[31m✖[30m [34mdplyr[30m::[32mmatches()[30m masks [34mtidyr[30m::matches(), [34mtestthat[30m::matches()[39m
library(openxlsx)
library(glue)
Attaching package: ‘glue’
The following object is masked from ‘package:dplyr’:
collapse
Ejemplo 1: Iterando en la EPH
Lo primero que necesitamos es definir un vector o lista sobre el que iterar.
Por ejemplo, podemos armar un vector con los path a las bases individuales, con el comando fs::dir_ls
bases_individuales_path <- dir_ls(path = '../../Fuentes/', regexp= 'individual')
bases_individuales_path
[01;32m../../Fuentes/usu_individual_t117.txt[0m ../../Fuentes/usu_individual_t216.txt ../../Fuentes/usu_individual_t316.txt
../../Fuentes/usu_individual_t416.txt
Luego, como en la función que usamos para leer las bases definimos muchos parametros, nos podemos armar una función wrapper que sólo necesite un parámetro, y que simplifique la escritura del map
leer_base_eph <- function(path) {
read.table(path,sep=";", dec=",", header = TRUE, fill = TRUE) %>%
select(ANO4,TRIMESTRE,REGION,P21,CH04, CH06)
}
bases_df <- tibble(bases_individuales_path) %>%
mutate(base = map(bases_individuales_path, leer_base_eph))
bases_df
El resultado es un DF donde la columna base tiene en cada fila, otro DF con la base de la EPH de ese perÃodo. Esto es lo que llamamos un nested DF o dataframe nesteado pa les pibes.
Si queremos juntar todo, podemos usar unnest()
bases_df <- bases_df %>% unnest()
bases_df
¿Qué pasa si los DF que tenemos nesteados no tienen la misma cantidad de columnas?
Esto mismo lo podemos usar para fragmentar el datastet por alguna variable, con el group_by()
bases_df %>%
group_by(REGION) %>%
nest()
NA
AsÃ, para cada región tenemos un DF.
¿ De qué sirve todo esto?
No todo en la vida es un Dataframe. Hay estucturas de datos que no se pueden normalizar a filas y columnas. En esos casos recurrÃamos tradicionalmente a los loops. Con MAP podemos tener los elementos agrupados en un sólo objeto y aún conservar sus formas diferentes.
Ejemplo 2: Gráficos en serie
Veamos un tercer ejemplo con otra base de datos que ya conocemos: Gapminder, que muestra algunos datos sobre la población de los paÃses por año.
El objetivo de este ejercicio es hacer un gráfico por paÃs de forma automática.
library(gapminder)
gapminder_unfiltered %>%
sample_n(10)
NA
la base tiene la siguiente info:
data_argentina <- gapminder_unfiltered %>%
filter(country=='Argentina')
ggplot(data_argentina, aes(year, lifeExp, size= pop, color=gdpPercap))+
geom_point()+
geom_line(alpha=0.6)+
labs(title = unique(data_argentina$country))

- Ahora que tenemos una idea de lo que queremos gráficar lo podemos poner adentro de una función que grafique.
# definimos la función
graficar_pais <- function(data, pais){
ggplot(data, aes(year, lifeExp, size= pop, color=gdpPercap))+
geom_point()+
geom_line(alpha=0.6)+
labs(title = pais)
}
probamos la función para un caso
graficar_pais(data_argentina, 'Argentina')

- Nos armamos un dataset nesteado
gapminder_nest <- gapminder_unfiltered %>%
group_by(country) %>%
nest()
Warning messages:
1: Unknown or uninitialised column: 'grafico'.
2: Unknown or uninitialised column: 'grafico'.
gapminder_nest[1:5,]
NA
- Ahora podemos crear una nueva columna que contenga los gráficos
gapminder_nest <- gapminder_nest %>%
mutate(grafico= map2(.x = data, .y = country,.f = graficar_pais))
gapminder_nest[1:5,]
Veamos un ejemplo
gapminder_nest$grafico[21]
[[1]]

Ahora podemos guardar todos los gráficos en un archivo PDF
pdf('../../Resultados/graficos_gapminder.pdf')
gapminder_nest$grafico
dev.off()
LS0tCnRpdGxlOiBQcm9ncmFtYWNpb24gRnVuY2lvbmFsCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCmRhdGU6ICIiCnN1YnRpdGxlOiBQcsOhY3RpY2EgR3VpYWRhCi0tLQoKYGBge3J9CmxpYnJhcnkoZnMpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KG9wZW54bHN4KQpsaWJyYXJ5KGdsdWUpCgpgYGAKCiMjIyBFamVtcGxvIDE6IEl0ZXJhbmRvIGVuIGxhIEVQSAoKTG8gcHJpbWVybyBxdWUgbmVjZXNpdGFtb3MgZXMgZGVmaW5pciB1biB2ZWN0b3IgbyBsaXN0YSBzb2JyZSBlbCBxdWUgaXRlcmFyLiAKClBvciBlamVtcGxvLCBwb2RlbW9zIGFybWFyIHVuIHZlY3RvciBjb24gbG9zIHBhdGggYSBsYXMgYmFzZXMgaW5kaXZpZHVhbGVzLCBjb24gZWwgY29tYW5kbyBgZnM6OmRpcl9sc2AKCmBgYHtyfQoKYmFzZXNfaW5kaXZpZHVhbGVzX3BhdGggPC0gZGlyX2xzKHBhdGggPSAnLi4vLi4vRnVlbnRlcy8nLCByZWdleHA9ICdpbmRpdmlkdWFsJykKYmFzZXNfaW5kaXZpZHVhbGVzX3BhdGgKYGBgCgpMdWVnbywgY29tbyBlbiBsYSBmdW5jacOzbiBxdWUgdXNhbW9zIHBhcmEgbGVlciBsYXMgYmFzZXMgZGVmaW5pbW9zIG11Y2hvcyBwYXJhbWV0cm9zLCBub3MgcG9kZW1vcyBhcm1hciB1bmEgZnVuY2nDs24gX3dyYXBwZXJfIHF1ZSBzw7NsbyBuZWNlc2l0ZSB1biBwYXLDoW1ldHJvLCB5IHF1ZSBzaW1wbGlmaXF1ZSBsYSBlc2NyaXR1cmEgZGVsIG1hcAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmxlZXJfYmFzZV9lcGggPC0gZnVuY3Rpb24ocGF0aCkgewogIHJlYWQudGFibGUocGF0aCxzZXA9IjsiLCBkZWM9IiwiLCBoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkgJT4lIAogICAgc2VsZWN0KEFOTzQsVFJJTUVTVFJFLFJFR0lPTixQMjEsQ0gwNCwgQ0gwNikKfQoKYmFzZXNfZGYgPC0gdGliYmxlKGJhc2VzX2luZGl2aWR1YWxlc19wYXRoKSAlPiUKICBtdXRhdGUoYmFzZSA9IG1hcChiYXNlc19pbmRpdmlkdWFsZXNfcGF0aCwgbGVlcl9iYXNlX2VwaCkpCgpgYGAKCmBgYHtyfQpiYXNlc19kZgpgYGAKCkVsIHJlc3VsdGFkbyBlcyB1biBERiBkb25kZSBsYSBjb2x1bW5hIF9fYmFzZV9fIHRpZW5lIGVuIGNhZGEgZmlsYSwgb3RybyBERiBjb24gbGEgYmFzZSBkZSBsYSBFUEggZGUgZXNlIHBlcsOtb2RvLiBFc3RvIGVzIGxvIHF1ZSBsbGFtYW1vcyB1biBfbmVzdGVkIERGXyBvIGRhdGFmcmFtZSBuZXN0ZWFkbyBwYSBsZXMgcGliZXMuCgpTaSBxdWVyZW1vcyBqdW50YXIgdG9kbywgcG9kZW1vcyB1c2FyIGB1bm5lc3QoKWAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJhc2VzX2RmIDwtIGJhc2VzX2RmICU+JSB1bm5lc3QoKQpiYXNlc19kZgpgYGAKCj4gwr9RdcOpIHBhc2Egc2kgbG9zIERGIHF1ZSB0ZW5lbW9zIG5lc3RlYWRvcyBubyB0aWVuZW4gbGEgbWlzbWEgY2FudGlkYWQgZGUgY29sdW1uYXM/CgoKRXN0byBtaXNtbyBsbyBwb2RlbW9zIHVzYXIgcGFyYSBmcmFnbWVudGFyIGVsIGRhdGFzdGV0IHBvciBhbGd1bmEgdmFyaWFibGUsIGNvbiBlbCBgZ3JvdXBfYnkoKWAKCgpgYGB7cn0KYmFzZXNfZGYgJT4lIAogIGdyb3VwX2J5KFJFR0lPTikgJT4lIAogIG5lc3QoKQoKYGBgCgpBc8OtLCBwYXJhIGNhZGEgcmVnacOzbiB0ZW5lbW9zIHVuIERGLgoKPiDCvyBEZSBxdcOpIHNpcnZlIHRvZG8gZXN0bz8KCk5vIHRvZG8gZW4gbGEgdmlkYSBlcyB1biBEYXRhZnJhbWUuIEhheSBlc3R1Y3R1cmFzIGRlIGRhdG9zIHF1ZSBubyBzZSBwdWVkZW4gbm9ybWFsaXphciBhIGZpbGFzIHkgY29sdW1uYXMuIEVuIGVzb3MgY2Fzb3MgcmVjdXJyw61hbW9zIHRyYWRpY2lvbmFsbWVudGUgYSBsb3MgbG9vcHMuIENvbiBNQVAgcG9kZW1vcyB0ZW5lciBsb3MgZWxlbWVudG9zIGFncnVwYWRvcyBlbiB1biBzw7NsbyBvYmpldG8geSBhw7puIGNvbnNlcnZhciBzdXMgZm9ybWFzIGRpZmVyZW50ZXMuCgojIyMgRWplbXBsbyAyOiBHcsOhZmljb3MgZW4gc2VyaWUKClZlYW1vcyB1biB0ZXJjZXIgZWplbXBsbyBjb24gb3RyYSBiYXNlIGRlIGRhdG9zIHF1ZSB5YSBjb25vY2Vtb3M6IEdhcG1pbmRlciwgcXVlIG11ZXN0cmEgYWxndW5vcyBkYXRvcyBzb2JyZSBsYSBwb2JsYWNpw7NuIGRlIGxvcyBwYcOtc2VzIHBvciBhw7FvLgoKRWwgb2JqZXRpdm8gZGUgZXN0ZSBlamVyY2ljaW8gZXMgaGFjZXIgdW4gZ3LDoWZpY28gcG9yIHBhw61zIGRlIGZvcm1hIGF1dG9tw6F0aWNhLiAKCi0gUHJpbWVybyB2ZWFtb3MgbG9zIGRhdG9zCgoKYGBge3J9CgpsaWJyYXJ5KGdhcG1pbmRlcikKCgpnYXBtaW5kZXJfdW5maWx0ZXJlZCAlPiUgCiAgc2FtcGxlX24oMTApCgpgYGAKCmxhIGJhc2UgdGllbmUgbGEgc2lndWllbnRlIGluZm86CgotIGNvdW50cnk6IE5vbWJyZSBkZWwgcGHDrXMKLSBjb250aW5lbnQ6IE5vbWJyZSBkZWwgY29udGluZW50ZQotIHllYXI6IGHDsW8KLSBsaWZlRXhwOiBFc3BlcmFuemEgZGUgdmlkYSBhbCBuYWNlcgotIHBvcDogUG9ibGFjacOzbgotIGdkcFBlcmNhcAoKCi0gVmFtb3MgYSBoYWNlciB1biBncsOhZmljbyBzZW5jaWxsbyBwYXJhIEFyZ2VudGluYQoKYGBge3J9CgpkYXRhX2FyZ2VudGluYSA8LSBnYXBtaW5kZXJfdW5maWx0ZXJlZCAlPiUgCiAgZmlsdGVyKGNvdW50cnk9PSdBcmdlbnRpbmEnKQoKZ2dwbG90KGRhdGFfYXJnZW50aW5hLCBhZXMoeWVhciwgbGlmZUV4cCwgc2l6ZT0gcG9wLCBjb2xvcj1nZHBQZXJjYXApKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9saW5lKGFscGhhPTAuNikrCiAgbGFicyh0aXRsZSA9IHVuaXF1ZShkYXRhX2FyZ2VudGluYSRjb3VudHJ5KSkKYGBgCgoKLSBBaG9yYSBxdWUgdGVuZW1vcyB1bmEgaWRlYSBkZSBsbyBxdWUgcXVlcmVtb3MgZ3LDoWZpY2FyIGxvIHBvZGVtb3MgcG9uZXIgYWRlbnRybyBkZSB1bmEgZnVuY2nDs24gcXVlIGdyYWZpcXVlLgoKYGBge3J9CgoKIyBkZWZpbmltb3MgbGEgZnVuY2nDs24KZ3JhZmljYXJfcGFpcyA8LSBmdW5jdGlvbihkYXRhLCBwYWlzKXsKICAKICBnZ3Bsb3QoZGF0YSwgYWVzKHllYXIsIGxpZmVFeHAsIHNpemU9IHBvcCwgY29sb3I9Z2RwUGVyY2FwKSkrCiAgICBnZW9tX3BvaW50KCkrCiAgICBnZW9tX2xpbmUoYWxwaGE9MC42KSsKICAgIGxhYnModGl0bGUgPSBwYWlzKQp9CgpgYGAKCgpwcm9iYW1vcyBsYSBmdW5jacOzbiBwYXJhIHVuIGNhc28KCmBgYHtyfQpncmFmaWNhcl9wYWlzKGRhdGFfYXJnZW50aW5hLCAnQXJnZW50aW5hJykKCmBgYAoKCi0gTm9zIGFybWFtb3MgdW4gZGF0YXNldCBuZXN0ZWFkbwoKYGBge3J9CgpnYXBtaW5kZXJfbmVzdCA8LSBnYXBtaW5kZXJfdW5maWx0ZXJlZCAlPiUgCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lIAogIG5lc3QoKQoKZ2FwbWluZGVyX25lc3RbMTo1LF0KCmBgYAoKLSBBaG9yYSBwb2RlbW9zIGNyZWFyIHVuYSBudWV2YSBjb2x1bW5hIHF1ZSBjb250ZW5nYSBsb3MgZ3LDoWZpY29zCgpgYGB7cn0KZ2FwbWluZGVyX25lc3QgPC0gZ2FwbWluZGVyX25lc3QgJT4lIAogIG11dGF0ZShncmFmaWNvPSBtYXAyKC54ID0gZGF0YSwgLnkgPSBjb3VudHJ5LC5mID0gIGdyYWZpY2FyX3BhaXMpKQoKZ2FwbWluZGVyX25lc3RbMTo1LF0KYGBgCgpWZWFtb3MgdW4gZWplbXBsbwoKCmBgYHtyIH0KZ2FwbWluZGVyX25lc3QkZ3JhZmljb1syMV0KYGBgCgoKQWhvcmEgcG9kZW1vcyBndWFyZGFyIHRvZG9zIGxvcyBncsOhZmljb3MgZW4gdW4gYXJjaGl2byBQREYKCmBgYHtyIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9VFJVRX0KcGRmKCcuLi8uLi9SZXN1bHRhZG9zL2dyYWZpY29zX2dhcG1pbmRlci5wZGYnKQpnYXBtaW5kZXJfbmVzdCRncmFmaWNvCmRldi5vZmYoKQpgYGAKCgo=