Заменить геометрию из списка в SF

Предположим, у меня есть следующее 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)

Есть лучший способ сделать это? Могу ли я заставить элементы АН в mylist быть пустыми точками?

1 ответ

Решение

Это не работает, потому что в.

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

3 это не ТОЧКА, а логика, которую (вероятно) нельзя каким-либо образом "заставить" в sf объект.

Вы можете обойти это, подставив свои элементы NA mylyst заранее очистить точки. Например:

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

НТН.

Другие вопросы по тегам