Simple way to subset SpatialPolygonsDataFrame (i.e. delete polygons) by attribute in R

Solution 1:

looks like you're overwriting the data, but not removing the polygons. If you want to cut down the dataset including both data and polygons, try e.g.

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

[[Edit 19 April, 2016]] That solution used to work, but @Bonnie reports otherwise for a newer R version (though perhaps the data has changed too?): world.map <- world.map[world.map@data$AREA > 30000, ] Upvote @Bonnie's answer if that helped.

Solution 2:

When I tried to do this in R 3.2.1, tim riffe's technique above did not work for me, although modifying it slightly fixed the problem. I found that I had to specifically reference the data slot as well before specifying the attribute to subset on, as below:

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

Adding this as an alternative answer in case others come across the same issue.

Solution 3:

Just to mention that subset also makes the work avoiding to write the data's name in the condition.

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

Solution 4:

I used the above technique to make a map of just Australia:

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

The comma after "Australia" is important, as it turns out.

One flaw with this method is that it appears to retain all of the attribute columns and rows for all of the other countries, and just populates them with zeros. I found that if I wrote out a .shp file, then read it back in using readOGR (rgdal package), it automatically removes the null geographic data. Then I could write another shape file with only the data I want.

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

On my system, at least, it's the "read" function that removes the null data, so I have to write the file after reading it back once (and if I try to re-use the filename, I get an error). I'm sure there's a simpler way, but this seems to work good enough for my purposes anyway.

Solution 5:

As a second pointer: this does not work for shapefiles with "holes" in the shapes, because it is subsetting by index.