包含sf对象的嵌套列表列

时间:2019-10-07 14:51:37

标签: r tidyr sf

我正在尝试tidyr::unnest包含sf对象的数据框列表列。

例如,关注此博客:http://r.iresmi.net/2019/03/27/open-and-merge-multiple-shapefiles/

下载shapefile

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")

将shapefile读入公共表并嵌套。

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 :(得分:2)

是的,似乎是tidyr的新版本(1.0)之后的一个新错误(可能是由于vctrs软件包所致)。 参见sf issues #1172

同时您可以使用:

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

(如果daframe的结构相同)