ここに何か不足しているかもしれませんが、掘り出しの後に何も見つかりませんでした。私はsf
オブジェクトの行を見つけようとしていますが、ジオメトリには一定の値があります。これは、同じジオメトリが別のデータセットに異なる関連メタデータ(IDや他の値など)とともに格納されていて、矛盾を解決する必要がある、整理のためです。sfの/ filterジオメトリの等価性のテスト?
ロード必要なパッケージ
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 $ジオメトリ、〜同一(.nc2 $ジオメトリ[[1]]))#仕事; nc2%>%filter(map_lgl(nc2 $ジオメトリ、〜同一(.nc2 $ジオメトリ[[1]])))#仕事; nc2%>%filter(map_lgl(ジオメトリ、〜同一(。、ジオメトリ[[1]])))#not work'。ちょっと変だ。 – cuttlefish44