Remover determinado polígono de SpatialPolygonDataFrame

9

Estou usando a biblioteca maptools do R para analisar o shapefile em uma lista de polígonos. A função readShapeSpatial

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

me fornece um objeto SpatailPolygonDataFrame . No meu exemplo, meu SpatialPolygonsDataFrame possui as seguintes colunas:

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

Eu sei que eu posso remover certos polígonos por sua row.id, por exemplo,

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

Agora eu quero descartar certos polígonos com uma condição, digamos AREA > 10. Como faço para implementar isso de forma elegante? O único método que tenho agora é percorrer todas as linhas e encontrar o correspondente row.id.

o rei dos Reis
fonte
Desconfie dos atributos "AREA". Não há garantia de que essa seja a área real, certo? Você pode usar rgeos :: gArea (x, byid = TRUE) para calculá-lo e rgdal :: spTransform se precisar alterar a projeção para esse cálculo.
Mdsumner #
@mdsumner você está completamente certo. Bom ponto
thekingofkings

Respostas:

7

Primeiro, eu recomendo usar o readOGR, da biblioteca rgdal, para ler seu shapefile. Ele reterá as informações da projeção (proj4string) e salvará inúmeras dores de cabeça, quando a correspondência for realizada, usando outras funções.

Duas maneiras rápidas de realizar o que você procura estão usando um índice ou subconjunto. Isso reterá polígonos com uma área <10 (descartando aqueles> 10).

shp.sub <- shp[shp$AREA < 10,] 
shp.sub <- subset(shp, AREA < 10)
Jeffrey Evans
fonte
Agradável! Acabei de perceber que essa pergunta poderia ser generalizada em "como selecionar determinadas linhas no DataFrame com R". E Obrigado pela sugestão também
thekingofkings