La seguente soluzione si basa su un post di Roger Bivand su R-sig-Geo . Ho preso il suo esempio sostituendo lo shapefile tedesco con alcuni dati di censimento dell'Oregon che puoi scaricare da qui (prendi tutti i componenti dello shapefile da "Contee dell'Oregon e dati di censimento").
Cominciamo con il caricamento dei pacchetti richiesti e l'importazione dello shapefile in R.
# Required packages
libs <- c("rgdal", "maptools", "gridExtra")
lapply(libs, require, character.only = TRUE)
# Import Oregon census data
oregon <- readOGR(dsn = "path/to/data", layer = "orcounty")
oregon.coords <- coordinates(oregon)
Successivamente, sono necessarie alcune variabili di raggruppamento per aggregare i dati. Nel nostro esempio, il raggruppamento si basa semplicemente sulle coordinate della singola contea. Vedi l'immagine sotto, i bordi neri indicano i poligoni originali, mentre i bordi rossi rappresentano i poligoni aggregati per oregon.id
.
# Generate IDs for grouping
oregon.id <- cut(oregon.coords[,1], quantile(oregon.coords[,1]), include.lowest=TRUE)
# Merge polygons by ID
oregon.union <- unionSpatialPolygons(oregon, oregon.id)
# Plotting
plot(oregon)
plot(oregon.union, add = TRUE, border = "red", lwd = 2)
Fin qui tutto bene. Tuttavia, gli attributi dei dati relativi alle sottoregioni dello shapefile originale (ad es. Densità di popolazione, area, ecc.) Si perdono durante l'esecuzione unionSpatialPolygons
. Suppongo che desideri aggregare anche i dati del censimento associati allo shapefile, quindi avrai bisogno di un passaggio intermedio.
Devi prima convertire i tuoi poligoni in un frame di dati per eseguire l'aggregazione. Ora prendiamo le colonne degli attributi di dati da sei a otto ("AREA", "POP1990", "POP1997") e aggregiamole secondo la funzione di applicazione degli ID sopra sum
.
# Convert SpatialPolygons to data frame
oregon.df <- as(oregon, "data.frame")
# Aggregate and sum desired data attributes by ID list
oregon.df.agg <- aggregate(oregon.df[, 6:8], list(oregon.id), sum)
row.names(oregon.df.agg) <- as.character(oregon.df.agg$Group.1)
Infine, riconvertisci il tuo frame di dati in un SpatialPolygonsDataFrame
file di forma precedentemente unificato oregon.union
e ottieni sia poligoni generalizzati che i tuoi dati di censimento derivati dal precedente passaggio di aggregazione di riepilogo.
# Reconvert data frame to SpatialPolygons
oregon.shp.agg <- SpatialPolygonsDataFrame(oregon.union, oregon.df.agg)
# Plotting
grid.arrange(spplot(oregon, "AREA", main = "Oregon: original county area"),
spplot(oregon.shp.agg, "AREA", main = "Oregon: aggregated county area"), ncol = 1)