Ich möchte einfach einige Polygone aus einem SpatialPolygonsDataFrame-Objekt löschen, basierend auf den entsprechenden Attributwerten im @ data-Datenrahmen, damit ich ein vereinfachtes/untergeordnetes Shapefile zeichnen kann. Bisher habe ich keinen Weg gefunden, dies zu tun.
Nehmen wir zum Beispiel an, ich möchte alle Polygone aus diesem Weltformdatei löschen, die eine Fläche von weniger als 30000 haben. Wie würde ich das tun?
Oder, ähnlich, wie kann ich Antartica löschen?
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([email protected])
# 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
Wenn ich so etwas mache, zeigt die Handlung keine Änderungen.
[email protected] = [email protected][[email protected]$AREA > 30000,]
plot(world.map)
das gleiche Ergebnis, wenn ich das tue:
[email protected] = [email protected][[email protected]$NAME != "Antarctica",]
plot(world.map)
Jede Hilfe wird geschätzt!
sieht so aus, als würden Sie die Daten überschreiben, aber die Polygone nicht entfernen. Wenn Sie den Datensatz, der sowohl Daten als auch Polygone enthält, reduzieren möchten, versuchen Sie es z.
world.map <- world.map[world.map$AREA > 30000,]
plot(world.map)
[[Edit 19. April 2016]] Diese Lösung funktionierte früher, aber @Bonnie meldet etwas anderes für eine neuere R-Version (obwohl sich vielleicht auch die Daten geändert haben?): world.map <- world.map[[email protected]$AREA > 30000, ]
Upvote @ Bonnies Antwort, wenn das geholfen hat.
Als ich dies in R 3.2.1 versuchte, funktionierte die oben beschriebene Technik von tim riffe nicht für mich, obwohl das Problem durch Ändern leicht behoben wurde. Ich stellte fest, dass ich den Datenschlitz ebenfalls speziell referenzieren musste, bevor ich das Attribut für die Teilmenge wie folgt spezifizierte:
world.map <- world.map[[email protected]$AREA > 30000, ]
plot(world.map)
Dies als alternative Antwort hinzufügen, falls andere auf dasselbe Problem stoßen.
Nur um zu erwähnen, dass subset
auch die Arbeit vermeidet, den Namen der Daten in die Bedingung zu schreiben.
world.map <- subset(world.map, AREA > 30000)
plot(world.map)
Ich habe die obige Technik verwendet, um eine Karte von Australien zu erstellen:
australia.map < - world.map[world.map$NAME == "Australia",]
plot(australia.map)
Das Komma nach "Australien" ist wichtig, wie sich herausstellt.
Ein Fehler bei dieser Methode besteht darin, dass anscheinend alle Attributspalten und -zeilen für alle anderen Länder beibehalten und nur mit Nullen aufgefüllt werden. Ich fand heraus, dass, wenn ich eine .shp-Datei ausschrieb und sie dann mit readOGR (rgdal package) zurücklas, die geografischen Nulldaten automatisch entfernt wurden. Dann könnte ich eine andere Formdatei mit nur den Daten schreiben, die ich will.
writeOGR(australia.map,".","australia",driver="ESRI Shapefile")
australia.map < - readOGR(".","australia")
writeOGR(australia.map,".","australia_small",driver="ESRI Shapefile")
Zumindest auf meinem System werden die Nulldaten durch die Funktion "Lesen" entfernt. Daher muss ich die Datei erst schreiben, nachdem ich sie einmal zurückgelesen habe (und wenn ich versuche, den Dateinamen erneut zu verwenden, erhalte ich eine Fehlermeldung). Ich bin mir sicher, dass es einen einfacheren Weg gibt, aber dieser scheint trotzdem gut genug für meine Zwecke zu funktionieren.
Als zweiter Zeiger: Dies funktioniert nicht für Shapefiles mit "Löchern" in den Shapes, da es sich um eine Teilmenge nach Index handelt.