Poniższe rozwiązanie jest oparte na poście Rogera Bivanda na temat R-sig-Geo . Wziąłem jego przykład, zastępując niemiecki plik kształtów niektórymi danymi spisu ludności z Oregonu, które można pobrać stąd (weź wszystkie składniki pliku kształtu z „hrabstw i danych spisu stanu Oregon”).
Zacznijmy od załadowania wymaganych pakietów i importowania pliku shapefile do 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)
Następnie potrzebujesz jakiejś zmiennej grupującej, aby agregować dane. W naszym przykładzie grupowanie opiera się po prostu na współrzędnych jednego hrabstwa. Zobacz obrazek poniżej, czarne obramowania wskazują oryginalne wielokąty, podczas gdy czerwone obramowania reprezentują wielokąty agregowane przez 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)
Jak na razie dobrze. Jednak atrybuty danych związane z podregionami pierwotnego pliku kształtu (np. Gęstość zaludnienia, obszar itp.) Gubią się podczas wykonywania unionSpatialPolygons
. Wydaje mi się, że chciałbyś również zagregować swoje dane spisowe związane z plikiem kształtu, więc potrzebujesz pośredniego kroku.
Najpierw musisz przekonwertować wielokąty na ramkę danych, aby przeprowadzić agregację. Teraz weźmy kolumny atrybutów danych od szóstego do ósmego („OBSZAR”, „POP1990”, „POP1997”) i agregujemy je zgodnie z powyższymi funkcjami stosującymi identyfikatory 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)
Na koniec przekonwertuj ramkę danych z powrotem na SpatialPolygonsDataFrame
zapewniający poprzednio ujednolicony plik kształtu, oregon.union
a otrzymasz zarówno uogólnione wielokąty, jak i dane ze spisu pochodzące z powyższego kroku agregacji podsumowania.
# 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)