2017-11-07 22 views
1

ここに何か不足しているかもしれませんが、掘り出しの後に何も見つかりませんでした。私は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()を使用していますが、両方の列がすべて同じで、予期せぬ/不必要な手間がかかるようにする必要があります。

質問の最後にお返事いただきありがとうございます - ご意見をいただければ幸いです!

+1

'nc2 < - rbind(nc、nc); map_lgl(nc2 $ジオメトリ、〜同一(.nc2 $ジオメトリ[[1]]))#仕事; nc2%>%filter(map_lgl(nc2 $ジオメトリ、〜同一(.nc2 $ジオメトリ[[1]])))#仕事; nc2%>%filter(map_lgl(ジオメトリ、〜同一(。、ジオメトリ[[1]])))#not work'。ちょっと変だ。 – cuttlefish44

答えて

1

==は実際にsfオブジェクトには定義されていないようです。ただし、cuttlefish44で示されているように、サブセッティングでドリルダウンすることを忘れてしまった場合は、identical()がこの目的のために機能します。これは、例えば、正常に動作します:

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店舗の形状についての私の一部に混乱を行うことですとしますsfgは実際には、リストではなく、ジオメトリのポイントのリストが含まれています。関係なく、回避策を考えて嬉しいです。

編集:st_equalssfに実装されていることを認識しませんでした。これは構文が異なりますが、データ構造の平等ではなく領域の等価性を記述するため、おそらくこの目的のための最良のツールです。