2017-11-07 19 views
1

여기에 뭔가가 누락되었을 수 있지만 잔뜩 파고 나서 아무것도 찾지 못했을 수 있습니다. Geometry가 특정 값을 갖는 sf 오브젝트의 행을 찾으려고합니다. 이것은 동일한 기하 구조가 서로 다른 데이터 세트에 서로 다른 관련 메타 데이터 (예 : id 및 기타 값)와 함께 저장되었을 수있는 정리 목적을위한 것이므로 불일치를 해결해야합니다.sf에서/필터 지오메트리의 테스트 평등?

로드 필요한 패키지

library(tidyverse) 
#> Loading tidyverse: ggplot2 
#> Loading tidyverse: tibble 
#> Loading tidyverse: tidyr 
#> Loading tidyverse: readr 
#> Loading tidyverse: purrr 
#> Loading tidyverse: dplyr 
#> Conflicts with tidy packages ---------------------------------------------- 
#> filter(): dplyr, stats 
#> lag(): dplyr, stats 
library(sf) 
#> Linking to GEOS 3.6.1, GDAL 2.2.0, proj.4 4.9.3 

로드 예를 들어 데이터 세트

nc <- st_read(system.file("shape/nc.shp", package="sf")) 
#> Reading layer `nc' from data source `C:\Users\Calum You\Documents\R\win-library\3.4\sf\shape\nc.shp' using driver `ESRI Shapefile' 
#> Simple feature collection with 100 features and 14 fields 
#> geometry type: MULTIPOLYGON 
#> dimension:  XY 
#> bbox:   xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 
#> epsg (SRID): 4267 
#> proj4string: +proj=longlat +datum=NAD27 +no_defs 

예상대로, dplyr::filter 작품 :

는 일반적으로 그것과 같이 dplyr를 사용하여 특정 값을 필터링하기 쉽습니다 잘 다른 열에. 형상 열을 필터링 할 때

nc %>% filter(NAME == "Ashe") 
#> Simple feature collection with 1 feature and 14 fields 
#> geometry type: MULTIPOLYGON 
#> dimension:  XY 
#> bbox:   xmin: -81.74107 ymin: 36.23436 xmax: -81.23989 ymax: 36.58965 
#> epsg (SRID): 4267 
#> proj4string: +proj=longlat +datum=NAD27 +no_defs 
#> AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74 
#> 1 0.114  1.442 1825 1825 Ashe 37009 37009  5 1091  1 
#> NWBIR74 BIR79 SID79 NWBIR79      geometry 
#> 1  10 1364  0  19 MULTIPOLYGON (((-81.4727554... 
nc %>% filter(CNTY_ID == 1825) 
#> Simple feature collection with 1 feature and 14 fields 
#> geometry type: MULTIPOLYGON 
#> dimension:  XY 
#> bbox:   xmin: -81.74107 ymin: 36.23436 xmax: -81.23989 ymax: 36.58965 
#> epsg (SRID): 4267 
#> proj4string: +proj=longlat +datum=NAD27 +no_defs 
#> AREA PERIMETER CNTY_ CNTY_ID NAME FIPS FIPSNO CRESS_ID BIR74 SID74 
#> 1 0.114  1.442 1825 1825 Ashe 37009 37009  5 1091  1 
#> NWBIR74 BIR79 SID79 NWBIR79      geometry 
#> 1  10 1364  0  19 MULTIPOLYGON (((-81.4727554... 

이 잘 작동하지 않습니다 : 우리는 쉽게 최초의 행 NAME 애쉬와 CNTY_ID 1825과 행을 선택할 수 있습니다. 나는 nc의 첫 행만 반환 했으므로, 그 행은 nc이고, geometry은 첫 번째 도형`nc $ geometry [1] '과 (정의상) 동일하기를 바랍니다. 하지만 내 자신의 필터를 구성의 목적을 위해,

nc$geometry[1] == nc$geometry[1] 
#> Error in Ops.sfc(nc$geometry[1], nc$geometry[1]): operation == not supported 

identical() 작품 :

nc %>% filter(geometry == nc$geometry[1]) 
#> Error in filter_impl(.data, quo): Evaluation error: operation == not supported. 
nc %>% filter(geometry == st_geometry(nc)[1]) 
#> Error in filter_impl(.data, quo): Evaluation error: operation == not supported. 

오류 메시지도 == 운영자가 작동하지 않는 것이 좋습니다. 출력의 첫 번째 요소에 대해 TRUE을보고 싶지 만, identical()이지도 함수에서 작동한다고 생각하지 않습니다.

identical(nc$geom[1], nc$geom[1]) 
#> [1] TRUE 
map_lgl(nc$geometry, function(x) identical(x, nc$geometry[1])) 
#> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [34] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [56] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [78] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [89] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
#> [100] FALSE 

== 단순히 sf의 형상에 대해 정의되지 않는 이유는 무엇입니까? 그렇다면 평등을 테스트하거나 다른 데이터 세트에서 동일한 지오메트리를 찾는 대안이 있습니까? 나는 rbind 서로 다른 데이터 세트를 함께 모으고 이것을하기 위해 duplicated()을 사용한다. 그러나 그것은 양쪽의 모든 칼럼이 같고 예기치 않은/불필요한 번거 로움을 보장하도록 요구할 것이다.

질문 끝까지 해주셔서 감사드립니다 - 제안 사항을 매우 높이 평가합니다!

+1

'nc2 <- rbind (nc, nc); map_lgl (nc2 $ geometry, ~ 동일한 (., nc2 $ geometry [[1]])) # 작업; nc2 %> % filter (map_lgl (nc2 $ geometry, ~ 동일한 (., nc2 $ geometry [[1]]))) # 작업; nc2 %> % 필터 (map_lgl (기하학, ~ 동일 (., 기하학 [[1]]))) # not work'. 조금 이상합니다. – cuttlefish44

답변

1

실제로 ==은 sf 개체에 대해 정의되지 않은 것처럼 보입니다. 그러나 cuttlefish44으로 표시된 것처럼 하위 집합에서 드릴 다운하는 것을 기억하면 identical()이이 용도로 작동합니다. 이것은, 예를 들어, 잘 작동 다음 sfg 실제로 목록이 아니라 형상에 대한 점의 목록이 포함되어 있습니다 :

identical(nc$geom[[1]], nc$geom[[1]]) 
map_lgl(nc$geometry, function(x) identical(x, nc$geometry[[1]])) 
    [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[22] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[43] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[64] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

나는이 방법 sf 저장 형상에 대한 나의 부분에 혼란하는 것입니다 가정합니다. 관계없이 해결 방법을 찾은 것은 다행입니다.

편집 : st_equalssf에 구현되었음을 깨닫지 못했습니다.다른 구문을 가지고 있지만 데이터 구조 평등보다는 영역 평등을 설명하기 때문에이 목적을위한 최상의 도구 일 것입니다.