将 sf 对象列表转换为一个 sf
Convert a list of sf objects into one 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))
请注意,data.table
和 sf
库还不完全兼容。所以 rbindlist
函数 returns 一个不被识别为 `sf 对象的对象。
single_sf <- rbindlist(my_list)
class(single_sf)
df <- do.call(rbind, my_list)
> class(df)
[1] "sf" "data.frame"
值得注意的是,dplyr::bind_rows
和 purrr::map_dfr
不适用于 sf 对象,因此 rbind
在这种情况下更好。
这是一个老问题,但值得注意的是 dplyr
的最新版本(> 0.9)可以绑定 sf
对象的行(在列表中或不在列表中):
single_sf <- dplyr::bind_rows(my_list)
class(single_sf)
[1] "sf" "data.frame"
其他包还提供了可用于绑定 sf
对象(例如
mapedit:::combine_list_of_sf()
、sf:::rbind.sf
和 data.table::rbindlist
),除了上面提到的 do.call()
选项(有关讨论和一些基准测试,请参阅 https://github.com/r-spatial/sf/issues/798#)。但是 dplyr
选项也适用于 sf
具有包含不同列数的数据框的对象,这是 do.call()
、sf:::rbind.sf()
和 data.table::rbindlist()
无法做到的,并且对我处理具有不同列数的 sf
个对象列表很重要。
我发现最快的方法是使用 data.table::rbindlist
然后转换回 sf
,如下所示:
library(sf)
library(data.table)
# fast row bind
sf <- rbindlist(my_list)
# back to st
sf <- st_sf(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))
请注意,data.table
和 sf
库还不完全兼容。所以 rbindlist
函数 returns 一个不被识别为 `sf 对象的对象。
single_sf <- rbindlist(my_list)
class(single_sf)
df <- do.call(rbind, my_list)
> class(df)
[1] "sf" "data.frame"
值得注意的是,dplyr::bind_rows
和 purrr::map_dfr
不适用于 sf 对象,因此 rbind
在这种情况下更好。
这是一个老问题,但值得注意的是 dplyr
的最新版本(> 0.9)可以绑定 sf
对象的行(在列表中或不在列表中):
single_sf <- dplyr::bind_rows(my_list)
class(single_sf)
[1] "sf" "data.frame"
其他包还提供了可用于绑定 sf
对象(例如
mapedit:::combine_list_of_sf()
、sf:::rbind.sf
和 data.table::rbindlist
),除了上面提到的 do.call()
选项(有关讨论和一些基准测试,请参阅 https://github.com/r-spatial/sf/issues/798#)。但是 dplyr
选项也适用于 sf
具有包含不同列数的数据框的对象,这是 do.call()
、sf:::rbind.sf()
和 data.table::rbindlist()
无法做到的,并且对我处理具有不同列数的 sf
个对象列表很重要。
我发现最快的方法是使用 data.table::rbindlist
然后转换回 sf
,如下所示:
library(sf)
library(data.table)
# fast row bind
sf <- rbindlist(my_list)
# back to st
sf <- st_sf(sf)