Supprimer certains polygones de SpatialPolygonDataFrame


9

J'utilise la bibliothèque R maptools pour analyser le fichier de formes dans une liste de polygones. La fonction readShapeSpatial

shp <- readShapeSpatial("<path to my shapefile>")

me donne un objet SpatailPolygonDataFrame . Dans mon exemple, mon SpatialPolygonsDataFrame a les colonnes suivantes:

> names(shp)
[1] "AREA"       "PERIMETER"  "COMAREA_"   "COMAREA_ID" "AREA_NUMBE"
[6] "COMMUNITY"  "AREA_NUM_1" "SHAPE_AREA" "SHAPE_LEN

Je sais que je peux supprimer certains polygones par leur row.id, par exemple

shp.dropI  <- shp[-i, ]
shp.subset <- shp[i %in% c(1,2,3),]

Maintenant, je veux supprimer certains polygones avec une condition, disons AREA > 10. Comment puis-je implémenter cela avec élégance? La seule méthode que j'ai maintenant consiste à parcourir toutes les lignes et à trouver le correspondant row.id.


Méfiez-vous des attributs "AREA". Il n'y a aucune garantie que c'est la zone réelle, non? Vous pouvez utiliser rgeos :: gArea (x, byid = TRUE) pour le calculer, et rgdal :: spTransform si vous devez changer la projection pour ce calcul.
mdsumner

@mdsumner vous avez tout à fait raison. Bon point
thekingofkings

Réponses:


7

Tout d'abord, je recommande fortement d'utiliser readOGR, de la bibliothèque rgdal, pour lire votre fichier de formes. Il conservera les informations de projection (proj4string) et économisera de nombreux maux de tête, lors de la correspondance de chaînes, en utilisant d'autres fonctions.

Deux façons rapides d'accomplir ce que vous recherchez sont d'utiliser un index ou un sous-ensemble. Cela conservera les polygones d'une zone <10 (en les supprimant> 10).

shp.sub <- shp[shp$AREA < 10,] 
shp.sub <- subset(shp, AREA < 10)

Agréable! Je viens de réaliser que cette question pourrait être généralisée en "comment sélectionner certaines lignes dans DataFrame avec R". Et merci aussi pour la suggestion
thekingofkings
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.