2017-09-23 59 views
1

假設我有以下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) 

但是,這將引發一個錯誤:

"Error in vapply(lst, class, rep(NA_character_, 3)) : values must be length 3, but FUN(X[[2]]) result is length 1"

我發現了以下解決方法:首先消除NA值:

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

是否有更好的方法來做到這一點?我可以強制mylist中的NA元素爲空嗎?

回答

1

這不是因爲工作。

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

3不是一個點而是一個合乎邏輯的,這(可能)不以任何方式「被迫」轉化爲一個sf對象。

你可以通過用mylyst的NA元素來預先清空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。

+0

在這個例子中,列表只有一個NA;如果它有多個NA元素,我該怎麼做?在這種情況下,雙括號會引發錯誤。 – user21359

+0

'na_rows < - which(is.na(mylist))'; 'for(na_rows中的行)st_geometry(df [row,])< - st_sfc(st_point())' – lbusett

+0

太好了,謝謝! – user21359