2017-09-23 6 views
1

가정하자 나는 다음과 같은 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

가 POINT하지만 (아마)를 sf 객체로 어떤 방법으로 "강제"할 수없는 논리가 아닙니다.

의 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