R에서 다각형 결합


29

R 코드를 사용하여 공간 다각형을 결합하는 방법이 궁금합니다.

시간이 지남에 따라 특정 영역이 변경되는 인구 조사 데이터를 사용하고 있으며 다각형과 해당 데이터를 결합하고 결합 된 영역을 간단히보고하려고합니다. 센서스를 센서스로 변경하고 병합 할 다각형 목록을 유지하고 있습니다. 이 지역 이름 목록을 다른 연도의 인구 조사 데이터에 적용하기위한 조회 목록으로 사용하고 싶습니다.

선택한 다각형과 해당 데이터를 병합하는 데 사용할 R 함수가 무엇인지 궁금합니다. 나는 그것을 봤지만 결과에 혼란스러워했다.


다각형 해산, 오버레이, 점대 다리, 교차점, 합집합 등과 같은 대부분의 지오메트리 연산에 대한 답은 rgeos 패키지입니다.
Spacedman

1
미국 인구 조사국은 1990-2000 및 2000-2010에 대해이를 수행하기 위해 테이블을 게시합니다. 의 기능으로 구현되는 데이터베이스 조인 으로 관리 할 수 ​​있습니다 . Rmerge
whuber

답변:


39

다음 솔루션은 R-sig-Geo의 Roger Bivand의 게시물을 기반으로합니다 . 독일 셰이프 파일을 여기 에서 다운로드 할 수있는 오레곤의 인구 조사 데이터로 바꾸는 그의 예를 보았습니다 ( '오레곤 카운티 및 인구 조사 데이터'의 모든 셰이프 파일 구성 요소를 가져옵니다).

필요한 패키지를로드하고 shapefile을 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)

원본 및 그룹화 된 오리건 셰이프 파일

여태까지는 그런대로 잘됐다. 그러나 원본 shapefile의 하위 영역과 관련된 데이터 속성 (예 : 모집단 밀도, 면적 등)은 수행 할 때 손실됩니다 unionSpatialPolygons. shapefile과 관련된 인구 조사 데이터를 집계하고 싶습니다. 중간 단계가 필요합니다.

집계를 수행하려면 먼저 다각형을 데이터 프레임으로 변환해야합니다. 이제 데이터 속성 열 6 ~ 8 ( "AREA", "POP1990", "POP1997")을 가져 와서 위의 ID 적용 함수에 따라 집계합니다 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)

오레곤 지역


10

sf 패키지를 사용하는 솔루션은 다음과 같습니다.

library(tidycensus)
library(dplyr)
library(sf)
library(ggplot2)

# get data from tindycensus for demonstration (note you need an API key, folow instructions here: https://walkerke.github.io/tidycensus/articles/basic-usage.html)
census <- tidycensus::get_acs(geography = "tract", variables = "B19013_001",
                           state = "TX", county = "Tarrant", geometry = TRUE) %>% 
  arrange(NAME)

# reduce dataset size
census <- census[1:8,]

# create grouping variable
group_1 <- census$GEOID[1:2]
group_2 <- census$GEOID[6:8]

census <- census %>% mutate(group = case_when(GEOID %in% group_1 ~ 'newgroup1',
                                              GEOID %in% group_2 ~ 'newgroup2',
                                              TRUE ~ GEOID))

# summarise by grouping variable (performs a union on grouped polygons and sums 'estimate')
census2 <- group_by(census, group) %>% 
  summarise(estimate = sum(estimate), do_union = TRUE)

# visualise using ggplot2 development version and facet by merged/unmerged datasets
plot_data <- rbind(census %>% select(group, estimate) %>%
                     mutate(facet = "unmerged"), 
                   census2 %>% mutate(facet = "merged"))

gp <- ggplot() + 
      geom_sf(data = plot_data, aes(fill = estimate), color = 'white') + 
      scale_fill_viridis_c() + 
      facet_wrap(~facet, ncol = 1)

여기에 이미지 설명을 입력하십시오


사용에주의 : 난 그냥 단지의 경우, 여기에 약간의 경고를 추가 할 거라고 생각 summarise()과 파생 상품을 do_union난 그냥 같은 그랬던 것처럼, 인수 summarise_if(shapefile, predic.function, sum, na.rm = TRUE, do_union = TRUE)또한 각 셀 (모든 작업 즉, 1)에서 TRUE 합산 결국 어느. 보고해야 할 것이 있는지 (적어도 추가 경고를 위해) 알아 내기 위해 더 조사해야합니까?
stragu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.