Eliminar cierto polígono de SpatialPolygonDataFrame

9

Estoy usando la biblioteca R maptools para analizar el archivo de forma en una lista de polígonos. La función readShapeSpatial

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

me da un objeto SpatailPolygonDataFrame . En mi ejemplo, mi SpatialPolygonsDataFrame tiene las siguientes columnas:

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

Sé que puedo eliminar ciertos polígonos por su row.id, por ejemplo

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

Ahora quiero eliminar ciertos polígonos con una condición, por ejemplo AREA > 10. ¿Cómo implemento esto con elegancia? El único método que tengo ahora es iterar a través de todas las filas y encontrar el correspondiente row.id.

el rey de los reyes
fuente
Tenga cuidado con los atributos "AREA". No hay garantía de que esa sea el área real, ¿verdad? Puede usar rgeos :: gArea (x, byid = TRUE) para calcularlo, y rgdal :: spTransform si necesita cambiar la proyección para ese cálculo.
mdsumner
@mdsumner tienes toda la razón. Buen punto
thekingofkings

Respuestas:

7

Primero, recomendaría usar readOGR, de la biblioteca rgdal, para leer su archivo de forma. Retendrá la información de proyección (proj4string) y ahorrará numerosos dolores de cabeza, cuando coincida con cadenas, utilizando otras funciones.

Dos formas rápidas de lograr lo que busca son usar un índice o un subconjunto. Esto retendrá los polígonos con un área <10 (descartando esos> 10).

shp.sub <- shp[shp$AREA < 10,] 
shp.sub <- subset(shp, AREA < 10)
Jeffrey Evans
fuente
¡Agradable! Me acabo de dar cuenta de que esta pregunta podría generalizarse en "cómo seleccionar ciertas filas en DataFrame con R". Y gracias por la sugerencia también
thekingofkings