Следующее решение основано на посте Роджера Биванда о 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)