Je voudrais simplement supprimer certains polygones d'un objet SpatialPolygonsDataFrame en fonction des valeurs d'attribut correspondantes dans le cadre de données @data afin que je puisse tracer un fichier de formes simplifié/sous-configuré. Jusqu'à présent, je n'ai pas trouvé le moyen de le faire.
Par exemple, supposons que je souhaite supprimer tous les polygones de ce fichier de formes universel dont l'aire est inférieure à 30000. Comment procéderais-je?
Ou, de la même manière, comment puis-je supprimer l'Antarctique?
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
Si je fais quelque chose comme ça, l'intrigue ne reflète aucun changement.
world.map@data = world.map@data[world.map@data$AREA > 30000,]
plot(world.map)
même résultat si je fais ceci:
world.map@data = world.map@data[world.map@data$NAME != "Antarctica",]
plot(world.map)
Toute aide est appréciée!
on dirait que vous écrasez les données, mais ne supprimez pas les polygones. Si vous souhaitez réduire le jeu de données, y compris les données et les polygones, essayez par exemple.
world.map <- world.map[world.map$AREA > 30000,]
plot(world.map)
[[Edit 19 April, 2016]] Cette solution fonctionnait auparavant, mais @ Bonnie indique le contraire pour une version R plus récente (bien que les données aient peut-être également changé?): world.map <- world.map[world.map@data$AREA > 30000, ]
Vote positif @ La réponse de Bonnie si cela l’a aidé.
Lorsque j'ai essayé de faire cela dans R 3.2.1, la technique de tim riffe ci-dessus ne fonctionnait pas pour moi, bien que sa modification corrigeait légèrement le problème. J'ai constaté que je devais également faire spécifiquement référence au créneau de données avant de spécifier l'attribut à sous-définir, comme ci-dessous:
world.map <- world.map[world.map@data$AREA > 30000, ]
plot(world.map)
Ajouter ceci comme une solution alternative au cas où d'autres rencontreraient le même problème.
Juste pour mentionner que subset
rend également le travail évitant d'écrire le nom des données dans la condition.
world.map <- subset(world.map, AREA > 30000)
plot(world.map)
J'ai utilisé la technique ci-dessus pour créer une carte de l'Australie:
australia.map < - world.map[world.map$NAME == "Australia",]
plot(australia.map)
La virgule après "Australie" est importante.
Une des failles de cette méthode est qu’elle semble conserver toutes les colonnes et lignes d’attributs de tous les autres pays et ne les renseigner que de zéros. J'ai constaté que si j'écrivais un fichier .shp, puis le relisais avec readOGR (paquetage rgdal), il supprimait automatiquement les données géographiques nuls. Ensuite, je pourrais écrire un autre fichier de forme avec uniquement les données que je veux.
writeOGR(australia.map,".","australia",driver="ESRI Shapefile")
australia.map < - readOGR(".","australia")
writeOGR(australia.map,".","australia_small",driver="ESRI Shapefile")
Sur mon système, du moins, c'est la fonction "read" qui supprime les données nulles. Je dois donc écrire le fichier après l'avoir relu une fois (et si j'essaie de réutiliser le nom de fichier, j'obtiens une erreur). Je suis sûr qu'il existe un moyen plus simple, mais cela semble fonctionner assez bien pour mes besoins de toute façon.
En tant que deuxième pointeur: ceci pas fonctionne pour les fichiers de formes avec "trous" dans les formes, car il est paramétré par index.