将sf对象列表转换为一个sf

raf*_*ira 5 r list rbind data.table r-sf

我有一个sf对象列表,我想对其进行行绑定以创建单个sf对象。我正在寻找类似于的功能data.table::rbindlist,该功能可以有效地堆叠各个对象。

可复制的数据示例:

my_list <- structure(list(structure(list(idhex = 4L, geometry = structure(list(
            structure(c(664106.970004623, 6524137.38910266), class = c("XY", 
            "POINT", "sfg"))), class = c("sfc_POINT", "sfc"), precision = 0, bbox = structure(c(xmin = 664106.970004623, 
            ymin = 6524137.38910266, xmax = 664106.970004623, ymax = 6524137.38910266
            ), class = "bbox"), crs = structure(list(epsg = 32633L, proj4string = "+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs"), class = "crs"), n_empty = 0L)), row.names = 1L, class = c("sf", 
            "data.frame"), sf_column = "geometry", agr = structure(c(idhex = NA_integer_), .Label = c("constant", 
            "aggregate", "identity"), class = "factor")), structure(list(
            idhex = 9, geometry = structure(list(structure(c(665491.220375992, 
            6525002.7560692), class = c("XY", "POINT", "sfg"))), class = c("sfc_POINT", 
            "sfc"), precision = 0, bbox = structure(c(xmin = 665491.220375992, 
            ymin = 6525002.7560692, xmax = 665491.220375992, ymax = 6525002.7560692
            ), class = "bbox"), crs = structure(list(epsg = 32633L, proj4string = "+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs"), class = "crs"), n_empty = 0L)), row.names = 1L, class = c("sf", 
            "data.frame"), sf_column = "geometry", agr = structure(c(idhex = NA_integer_), .Label = c("constant", 
            "aggregate", "identity"), class = "factor"))), .Dim = 1:2, .Dimnames = list(
            ".", NULL))
Run Code Online (Sandbox Code Playgroud)

请注意,data.tablesf库尚未完全兼容。因此,该rbindlist函数返回的对象未被识别为`sf对象。

single_sf <- rbindlist(my_list)
class(single_sf)
Run Code Online (Sandbox Code Playgroud)

R. *_*ima 10

这是一个老问题,但值得注意的是,最新版本dplyr(> 0.9) 可以绑定sf对象行(在列表中或不在列表中):

single_sf <- dplyr::bind_rows(my_list)
class(single_sf)
[1] "sf"         "data.frame"
Run Code Online (Sandbox Code Playgroud)

除了上面提到的选项之外,其他软件包还提供可用于绑定sf对象的选项(例如 mapedit:::combine_list_of_sf()sf:::rbind.sfdata.table::rbindlist) (有关讨论和一些基准测试,请参阅https://github.com/r-spatial/sf/issues/798# ) 。但该选项也适用于具有包含不同列数的数据框的对象,这是、和无法执行的操作,并且对于我处理具有不同列数的对象列表很重要。do.call()dplyrsfdo.call()sf:::rbind.sf()data.table::rbindlist()sf


seb*_*rno 6

df <- do.call(rbind, my_list)

> class(df)
[1] "sf"         "data.frame"
Run Code Online (Sandbox Code Playgroud)

值得注意的是dplyr::bind_rowspurrr::map_dfr它不能与sf对象一起使用,因此rbind在这种情况下更好。

  • 还值得注意的是,列表元素的crs需要匹配。 (3认同)