@dataデータフレーム内の対応する属性値に基づいてSpatialPolygonsDataFrameオブジェクトからいくつかのポリゴンを削除して、単純化/サブセット化されたシェープファイルをプロットできるようにします。これまでのところ、私はこれを行う方法を見つけていません。
たとえば、この world shapefile から30000未満の面積を持つすべてのポリゴンを削除するとします。これを行うにはどうすればよいですか?
または、同様に、Antarticaを削除するにはどうすればよいですか?
require(maptools)
getinfo.shape("TM_WORLD_BORDERS_SIMPL-0.3.shp")
# Shapefile type: Polygon, (5), # of Shapes: 246
world.map <- readShapeSpatial("TM_WORLD_BORDERS_SIMPL-0.3.shp")
class(world.map)
# [1] "SpatialPolygonsDataFrame"
# attr(,"package")
# [1] "sp"
head(world.map@data)
# FIPS ISO2 ISO3 UN NAME AREA POP2005 REGION SUBREGION LON LAT
# 0 AC AG ATG 28 Antigua and Barbuda 44 83039 19 29 -61.783 17.078
# 1 AG DZ DZA 12 Algeria 238174 32854159 2 15 2.632 28.163
# 2 AJ AZ AZE 31 Azerbaijan 8260 8352021 142 145 47.395 40.430
# 3 AL AL ALB 8 Albania 2740 3153731 150 39 20.068 41.143
# 4 AM AM ARM 51 Armenia 2820 3017661 142 145 44.563 40.534
# 5 AO AO AGO 24 Angola 124670 16095214 2 17 17.544 -12.296
このようなことをすると、プロットには変更が反映されません。
world.map@data = world.map@data[world.map@data$AREA > 30000,]
plot(world.map)
これを行うと同じ結果:
world.map@data = world.map@data[world.map@data$NAME != "Antarctica",]
plot(world.map)
どんな助けも大歓迎です!
データを上書きしているように見えますが、ポリゴンは削除されていません。データとポリゴンの両方を含むデータセットを削減したい場合は、例えば.
world.map <- world.map[world.map$AREA > 30000,]
plot(world.map)
[[2016年4月19日編集]]このソリューションは以前は機能していましたが、@ Bonnieは新しいRバージョンについて報告します(データも変更された可能性がありますが):world.map <- world.map[world.map@data$AREA > 30000, ]
.
R 3.2.1でこれを行おうとしたとき、上記のtim riffeの手法はうまくいきませんでしたが、修正すると問題は少し修正されました。以下のように、サブセットする属性を指定する前に、データスロットも具体的に参照する必要があることがわかりました。
world.map <- world.map[world.map@data$AREA > 30000, ]
plot(world.map)
他の人が同じ問題に遭遇した場合の代替回答としてこれを追加します。
subset
は、条件にデータの名前を書き込むことを回避することもできます。
world.map <- subset(world.map, AREA > 30000)
plot(world.map)
上記の手法を使用して、オーストラリアだけの地図を作成しました。
australia.map < - world.map[world.map$NAME == "Australia",]
plot(australia.map)
「オーストラリア」の後のカンマは重要であることがわかりました。
この方法の欠点の1つは、他のすべての国のすべての属性列と行を保持しているように見え、それらにゼロを設定するだけであるということです。 .shpファイルを書き出し、readOGR(rgdalパッケージ)を使用して読み戻すと、nullの地理データが自動的に削除されることがわかりました。その後、必要なデータのみを含む別のシェープファイルを作成できます。
writeOGR(australia.map,".","australia",driver="ESRI Shapefile")
australia.map < - readOGR(".","australia")
writeOGR(australia.map,".","australia_small",driver="ESRI Shapefile")
私のシステムでは、少なくとも、nullデータを削除する「読み取り」機能なので、一度ファイルを読み取った後にファイルを書き込む必要があります(ファイル名を再利用しようとするとエラーが発生します)。もっと簡単な方法があると確信していますが、これはとにかく私の目的には十分うまくいくようです。
2番目のポインターとして:これはnotを実行します。これは、インデックスにサブセット化されているため、シェイプに「穴」があるシェープファイルに対して機能します。