Наступне рішення засноване на публікації Роджера Біванда на R-sig-Geo . Я взяв його приклад заміни німецького формфайлу на деякі дані перепису з Орегону, які ви можете завантажити звідси (візьміть усі компоненти формфайлу з «Орегонських графств та даних перепису»).
Почнемо з завантаження необхідних пакетів та імпортування файлу форм у 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)
Далі вам потрібна певна змінна групування для агрегування даних. У нашому прикладі групування просто спирається на єдині координати округу. Дивіться на зображенні нижче, чорні рамки позначають оригінальні багатокутники, тоді як червоні межі представляють собою багатокутники, зведені по 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)
Все йде нормально. Однак атрибути даних, пов’язані з субрегіонами вихідного формату (наприклад, щільність населення, площа тощо), втрачаються при виконанні unionSpatialPolygons
. Напевно, ви хочете також зібрати свої дані перепису, пов’язані з файлом форми, тому вам знадобиться проміжний крок.
Спочатку потрібно перетворити свої багатокутники в кадр даних, щоб здійснити агрегацію. Тепер візьмемо колонки з атрибутами даних шість-вісім ("AREA", "POP1990", "POP1997") та об'єднаємо їх відповідно до вищезазначеної функції застосування ідентифікаторів 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)
Нарешті, поверніть ваш кадр даних назад до SpatialPolygonsDataFrame
надання раніше уніфікованого файлу форм, oregon.union
і ви отримаєте як узагальнені багатокутники, так і дані перепису даних, отримані з вищевказаного кроку зведення.
# 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)