Las funciones del paquete purrr map_dfr()
y map_dfc()
permitian devolver un data frame a partir de la salida de un comando purrr::map
, uniendo los elementos de la lista resultante por filas o por columnas. A partir de purrr 1.0.0 estas funcionalidades se eliminaron, por la posible confusión que podían producir sus nombres, al dar a entender que funcionarían de forma similar a como lo hacen las funciones map_lgl()
, map_int()
, etc.
En lugar de eso, los autores de purrr
proponian usar list_rbind()
y list_cbind()
sobre la lista resultado de los comandos map, que a su vez utilizan por debajo vctrs::vec_rbind()
y vctrs::vec_cbind()
. De esta forma:
tabla_unida <- list.files("ruta_archivos_excel", pattern = "xlsx") |>
map(read_xlsx) |>
list_rbind()
El problema con estas opciones es que no funcionan con objetos espaciales de clase sf
. De hecho es más problemático, porque no es que el proceso falle, si no que el resultado es un data.frame normal (no un objeto sf) que pierde su columna geométrica.
Así que para leer un conjunto de archivos vectoriales y cargarlos todos en el mismo objeto sf, usamos dplyr::bind_rows
:
objeto_sf <- list.files("ruta_archivos_espaciales/", pattern = "gpkg") |>
map(st_read) |>
do.call(bind_rows, args = _)
Para leer los archivos cada uno en un objeto diferente, podríamos usar assign
:
lista_sfs <- list.files("files/geo", pattern = "gpkg", full.names = T) |>
set_names(basename) |>
map(st_read)
for (i in seq_along(lista_sfs )) {
assign(names(lista_sfs [i]), lista_sfs [[i]])
}