Einfache Möglichkeit, SpatialPolygonsDataFrame (dh Polygone löschen) nach Attribut in R zu unterteilen

74

Ich möchte einfach einige Polygone aus einem SpatialPolygonsDataFrame-Objekt basierend auf entsprechenden Attributwerten im @ data-Datenrahmen löschen, damit ich ein vereinfachtes / untergeordnetes Shapefile zeichnen kann. Bisher habe ich keinen Weg gefunden, dies zu tun.

Angenommen , ich möchte alle Polygone aus diesem Welt-Shapefile löschen , die eine Fläche von weniger als 30000 haben. Wie würde ich vorgehen?

Oder 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(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

Wenn ich so etwas mache, spiegelt die Handlung keine Änderungen wider.

world.map@data = world.map@data[world.map@data$AREA > 30000,]
plot(world.map)

gleiches Ergebnis, wenn ich das mache:

world.map@data = world.map@data[world.map@data$NAME != "Antarctica",]
plot(world.map)

Jede Hilfe wird geschätzt!

baha-kev
quelle

Antworten:

71

Sieht so aus, als würden Sie die Daten überschreiben, aber die Polygone nicht entfernen. Wenn Sie den Datensatz mit Daten und Polygonen reduzieren möchten, versuchen Sie es z

world.map <- world.map[world.map$AREA > 30000,]
plot(world.map)

[[Bearbeiten 19. April 2016]] Diese Lösung funktionierte früher, aber @Bonnie meldet etwas anderes für eine neuere R-Version (obwohl sich möglicherweise auch die Daten geändert haben?): world.map <- world.map[world.map@data$AREA > 30000, ] Upvote @ Bonnies Antwort, wenn dies hilfreich ist.

tim riffe
quelle
So einfach, aber jetzt weiß ich es. Vielen Dank!
Baha-Kev
1
Genau das, was ich in den letzten zwei Tagen versucht habe, herauszufinden. Vielen Dank!
Chrys
Beide Lösungen (deine & Bonnies) funktionieren für mich (R Version 3.2.2)
andschar
38

Als ich dies in R 3.2.1 versuchte, funktionierte die oben beschriebene Technik von tim riffe bei mir nicht, obwohl eine geringfügige Änderung das Problem behebt. Ich stellte fest, dass ich auch speziell auf den Datensteckplatz verweisen musste, bevor ich das Attribut für die Teilmenge wie folgt spezifizierte:

world.map <- world.map[world.map@data$AREA > 30000, ]
plot(world.map)

Fügen Sie dies als alternative Antwort hinzu, falls andere auf dasselbe Problem stoßen.

Bonnie
quelle
Mit der neuesten R-Version verliere ich meine, @datawenn ich die Daten auf diese Weise unterteile. Das Formal Class SpatialPolygonsDataFramewird Formal Class SpatialPolygons. Passiert dir das auch?
Tim_Utrecht
Selbes Problem hier. Haben Sie eine Lösung gefunden?
Severin
1
Ich habe die neueren R-Versionen nicht verwendet, aber Sie könnten Erick Chacons Vorschlag unten versuchen (mit subset)
Bonnie
15

Nur um zu erwähnen, dass subsetdie Arbeit auch vermeidet, den Namen der Daten in die Bedingung zu schreiben.

world.map <- subset(world.map, AREA > 30000)
plot(world.map)
Erick Chacon
quelle
Ja, genau dieser Befehl hat bei mir nicht funktioniert. Ist es noch für dich?
5.
11

Ich habe die obige Technik verwendet, um eine Karte von nur 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 gefüllt werden. Ich habe festgestellt, dass wenn ich eine .shp-Datei ausschreibe und sie dann mit readOGR (rgdal-Paket) zurücklese, die geografischen Nulldaten automatisch entfernt werden. Dann könnte ich eine andere Formdatei nur mit den gewünschten Daten schreiben.

writeOGR(australia.map,".","australia",driver="ESRI Shapefile")
australia.map < - readOGR(".","australia")
writeOGR(australia.map,".","australia_small",driver="ESRI Shapefile")

Zumindest auf meinem System ist es die "Lese" -Funktion, die die Nulldaten entfernt. Daher muss ich die Datei schreiben, nachdem ich sie einmal zurückgelesen habe (und wenn ich versuche, den Dateinamen wiederzuverwenden, wird eine Fehlermeldung angezeigt). Ich bin mir sicher, dass es einen einfacheren Weg gibt, aber das scheint für meine Zwecke trotzdem gut genug zu funktionieren.

user2676905
quelle
2
Wie in diesem Kommentar erwähnt, löscht R nicht automatisch nicht verwendete Faktorstufen, sondern Sie müssen Folgendes neu faktorisieren : feature$ATTR <- factor(feature$ATTR).
Ein anderer Ben
Das Komma ist wichtig, da es eine Auswahl impliziert: Vor dem Komma wählen wir Zeilen aus (alle Zeilen, bei denen NAME gleich Austrialia ist), nach dem Komma wählen wir hier Spalten aus: alle Spalten, da keine bestimmte Spalte angegeben ist.
Richard
@adifferentben wäre droplevels () nicht die bessere Wahl?
Nicola Pasquino
1

Als zweiter Zeiger: Dies funktioniert nicht für Shapefiles mit "Löchern" in den Formen, da es nach Index untergeordnet ist.

eflores89
quelle