vectores vacio seleccionar listas infinito filas eliminar data crear concatenar columnas r mapping spatial maptools
shapefile del mundo

vacio - seleccionar columnas en r



Forma simple de subconjunto de SpatialPolygonsDataFrame(es decir, eliminar polĂ­gonos) por atributo en R (5)

Me gustaría simplemente eliminar algunos polígonos de un objeto SpatialPolygonsDataFrame en función de los valores de atributo correspondientes en el marco de datos @data para poder trazar un shapefile simplificado / subconjunto. Hasta ahora no he encontrado una manera de hacer esto.

Por ejemplo, digamos que quiero eliminar todos los polígonos de este shapefile del mundo que tienen un área de menos de 30000. ¿Cómo voy a hacer esto?

O, de manera similar, ¿cómo puedo eliminar 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

Si hago algo como esto, la trama no refleja ningún cambio.

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

mismo resultado si hago esto:

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

¡Cualquier ayuda es apreciada!


Como segundo puntero: esto no funciona para shapefiles con "agujeros" en las formas, ya que está subdividiendo por índice.


Cuando traté de hacer esto en R 3.2.1, la técnica de tim riffe anterior no funcionó para mí, aunque modificarla solucionó ligeramente el problema. Descubrí que también tenía que hacer referencia específica a la ranura de datos antes de especificar el atributo al subconjunto, como se muestra a continuación:

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

Agregando esto como una respuesta alternativa en caso de que otros encuentren el mismo problema.


Solo mencionar que el subset también hace que el trabajo evite escribir el nombre de los datos en la condición.

world.map <- subset(world.map, AREA > 30000) plot(world.map)


Utilicé la técnica anterior para hacer un mapa de solo Australia:

australia.map < - world.map[world.map$NAME == "Australia",] plot(australia.map)

La coma después de "Australia" es importante, como se ve después.

Un error con este método es que parece conservar todas las columnas y filas de atributos para todos los demás países, y simplemente las rellena con ceros. Descubrí que si escribía un archivo .shp, lo volvía a leer usando readOGR (paquete rgdal), elimina automáticamente los datos geográficos nulos. Entonces podría escribir otro archivo de forma con solo los datos que quiero.

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

En mi sistema, al menos, es la función de "lectura" la que elimina los datos nulos, así que tengo que escribir el archivo después de volver a leerlo una vez (y si intento volver a utilizar el nombre del archivo, aparece un error). Estoy seguro de que hay una manera más simple, pero de todos modos parece funcionar lo suficientemente bien para mis propósitos.


parece que está sobrescribiendo los datos, pero no eliminando los polígonos. Si desea reducir el conjunto de datos, incluidos datos y polígonos, intente, por ejemplo,

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

[[Editar 19 abril, 2016]] Esa solución solía funcionar, pero @Bonnie informa lo contrario para una versión R más nueva (¿aunque tal vez los datos también han cambiado?): world.map <- world.map[world.map@data$AREA > 30000, ] Apoyar @ la respuesta de Bonnie si eso ayudó.