La siguiente solución se basa en una publicación de Roger Bivand en R-sig-Geo . Tomé su ejemplo reemplazando el archivo de forma alemán con algunos datos del censo de Oregón que puede descargar desde aquí (tome todos los componentes del archivo de forma de 'condados de Oregon y datos del censo').
Comencemos cargando los paquetes requeridos e importando el archivo shape en 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)
A continuación, necesita alguna variable de agrupación para agregar los datos. En nuestro ejemplo, la agrupación se basa simplemente en las coordenadas de un solo condado. Vea la imagen a continuación, los bordes negros indican los polígonos originales, mientras que los bordes rojos representan polígonos agregados por 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)
Hasta aquí todo bien. Sin embargo, los atributos de datos relacionados con las subregiones del archivo de forma original (por ejemplo, densidad de población, área, etc.) se pierden cuando se realiza unionSpatialPolygons
. Supongo que también le gustaría agregar sus datos censales asociados al archivo shape, por lo que necesitará un paso intermedio.
Primero debe convertir sus polígonos en un marco de datos para realizar la agregación. Ahora tomemos las columnas de atributos de datos de seis a ocho ("AREA", "POP1990", "POP1997") y agrúpelas de acuerdo con la función de aplicación de IDs anterior 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)
Finalmente, reconvierta su marco de datos de nuevo a un archivo de forma SpatialPolygonsDataFrame
previamente unificado oregon.union
y obtenga tanto polígonos generalizados como sus datos censales derivados del paso de agregación de resumen anterior.
# 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)