unnest список столбцов, содержащих объекты sf - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь tidyr::unnest столбец списка фрейма данных, содержащий sf объекты.

Например, после этого блога: http://r.iresmi.net/2019/03/27/open-and-merge-multiple-shapefiles/

Загрузить шейп-файлы

library(tidyverse)
library(sf)
library(fs)
library(httr)
library(leaflet)
# https://fr.actualitix.com/blog/shapefiles-des-departements-de-france.html
url <-  c("https://fr.actualitix.com/blog/actgeoshap/73-savoie.zip",
          "https://fr.actualitix.com/blog/actgeoshap/74-haute-savoie.zip")
dep <- str_extract(url, "\\d{2}.*$")
list(url, dep) %>% 
  pwalk(~ GET(.x, write_disk(.y)))
walk(dep, unzip, junkpaths = TRUE, exdir = "shp")

Считать шейп-файлы в общую таблицу и удалить их.

res <- dir_ls("shp", glob = "*.shp") %>% 
  tibble(fname = .) %>%
  mutate(data = map(fname, read_sf)) %>%
  unnest(data) %>%
  st_as_sf() %>%
  st_set_crs(2154)

Однако, это дает ошибку

Error: No common type for `..1$data$geometry` <sfc_POLYGON> and `..2$data$geometry` <sfc_MULTIPOLYGON>.

Может ли tidyr::unnest использоваться таким образом?

РЕДАКТИРОВАТЬ: используя sf v 0,8-0

РЕДАКТИРОВАТЬ: Моя цель - развернуть все sf объекты в столбце списка data, чтобы все их столбцы присутствовали в новом sf фрейм данных. то есть

sf1 <- dir_ls("shp", glob = "*.shp") %>% 
  tibble(fname = .) %>%
  mutate(data = map(fname, read_sf)) %>% 
  pluck(2,1) 

sf2 <- dir_ls("shp", glob = "*.shp") %>% 
  tibble(fname = .) %>%
  mutate(data = map(fname, read_sf)) %>% 
  pluck(2,2)

rbind(sf1, sf2)

1 Ответ

0 голосов
/ 10 октября 2019

Да, похоже, это новая ошибка после новой версии (1.0) tidyr (возможно, из-за пакета vctrs). См. sf Issues # 1172

. Тем временем вы можете использовать:

dir_ls("shp", glob = "*.shp") %>% 
  map(read_sf) %>%
  do.call(rbind, .)

(если структуры daframes идентичны)

...