여기에 뭔가가 누락되었을 수 있지만 잔뜩 파고 나서 아무것도 찾지 못했을 수 있습니다. 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()
을 사용한다. 그러나 그것은 양쪽의 모든 칼럼이 같고 예기치 않은/불필요한 번거 로움을 보장하도록 요구할 것이다.
질문 끝까지 해주셔서 감사드립니다 - 제안 사항을 매우 높이 평가합니다!
'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