2

假设我有以下sf数据框:

library(sf)

nrows <- 10
geometry = st_sfc(lapply(1:nrows, function(x) st_geometrycollection()))
df <- st_sf(id = 1:nrows, geometry = geometry)

我还有以下列表:

mylist = list('2'=st_point(c(-73,42)), '3'=NA) 

我想用列表中的点替换第二个观察中的几何。我曾想过做以下事情:

st_geometry(df[names(mylist),]) <- st_sfc(mylist)

但这会引发错误:

“vapply(lst, class, rep(NA_character_, 3)) 中的错误:值的长度必须为 3,但 FUN(X[[2]]) 结果的长度为 1”

我通过首先消除 NA 值找到了以下解决方法:

condition <- mylist[!is.na(mylist)]
st_geometry(df[names(condition),]) <- st_sfc(condition)

有一个更好的方法吗?我可以强制 NA 元素mylist为空点吗?

4

1 回答 1

2

那是行不通的,因为在。

mylist = list('2'=st_point(c(-73,42)), '3'= NA) 

3不是一个点而是一个逻辑,它(可能)不能以任何方式“强制”进入一个sf对象。

您可以通过预先将您的 NA 元素替换mylyst为空 POINTS 来规避此问题。例如:

mylist[[which(is.na(mylist))]]  <- st_point()
st_geometry(df[names(mylist),]) <- st_sfc(mylist)

,给出:

> df
Simple feature collection with 10 features and 1 field (with 10 geometries empty)
geometry type:  GEOMETRY
dimension:      XY
bbox:           xmin: -73 ymin: 42 xmax: -73 ymax: 42
epsg (SRID):    NA
proj4string:    NA
   id                 geometry
1   1 GEOMETRYCOLLECTION EMPTY
2   2           POINT (-73 42)
3   3              POINT EMPTY
4   4 GEOMETRYCOLLECTION EMPTY
5   5 GEOMETRYCOLLECTION EMPTY
6   6 GEOMETRYCOLLECTION EMPTY
7   7 GEOMETRYCOLLECTION EMPTY
8   8 GEOMETRYCOLLECTION EMPTY
9   9 GEOMETRYCOLLECTION EMPTY
10 10 GEOMETRYCOLLECTION EMPTY

HTH。

于 2017-09-24T07:26:47.377 回答