Заменить геометрию из списка в 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
НТН.