आर में बहुभुज शामिल हो रहे हैं


29

मैं सोच रहा हूं कि आर कोड का उपयोग करके स्थानिक बहुभुजों में कैसे शामिल हो सकता हूं?

मैं जनगणना के आंकड़ों के साथ काम कर रहा हूं, जहां कुछ क्षेत्रों में समय के साथ बदलाव होता है और मैं बहुविवाह और संबंधित आंकड़ों में शामिल होना चाहता हूं और केवल शामिल क्षेत्रों पर रिपोर्ट करता हूं। मैं उन बहुभुजों की सूची बना रहा हूं जिनमें जनगणना में जनगणना में परिवर्तन है और मैं विलय की योजना बना रहा हूं। मैं विभिन्न वर्षों से जनगणना के आंकड़ों को लागू करने के लिए एक लुकअप सूची के रूप में क्षेत्र के नामों की इस सूची का उपयोग करना चाहता हूं।

मैं सोच रहा हूँ कि चयनित बहुभुज और संबंधित डेटा को मर्ज करने के लिए R फ़ंक्शन का क्या उपयोग किया जाए। मैंने इसे googled किया है, लेकिन बस परिणाम से भ्रमित हो जाते हैं।


अधिकांश ज्यामिति परिचालनों जैसे बहुभुज विघटन, उपरिशायी, बिंदु-इन-बहुभुज, चौराहे, संघ आदि का उत्तर रेगो पैकेज है।
स्पिकमैन

1
अमेरिकी जनगणना ब्यूरो 1990-2000 और 2000-2010 के लिए ऐसा करने के लिए टेबल प्रकाशित करता है। वे के साथ प्रबंधित किया जा सकता डेटाबेस , मिलती है जिसके द्वारा कार्यान्वित किया जाता है Rके mergeकार्य करते हैं।
whuber

जवाबों:


39

निम्नलिखित समाधान R-sig-Geo पर Roger Bivand द्वारा पोस्ट पर आधारित है । मैंने ओरेगन से कुछ जनगणना के आंकड़ों के साथ जर्मन शेपफाइल की जगह उसका उदाहरण लिया, जिसे आप यहां से डाउनलोड कर सकते हैं ('ओरेगन काउंटियों और जनगणना डेटा' से सभी शेपफाइल घटकों को लें)।

आइए आवश्यक पैकेजों को लोड करने और आर में शेपफाइल को आयात करने के साथ शुरू करें।

# 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। मुझे लगता है कि आप अपने जनगणना के आंकड़ों को शेपफाइल से संबद्ध करना चाहते हैं, इसलिए आपको एक मध्यवर्ती चरण की आवश्यकता होगी।

एकत्रीकरण करने के लिए आपको सबसे पहले अपने बहुभुजों को डेटाफ्रेम में बदलना होगा। अब डेटा विशेषता कॉलम को छह से आठ ("क्षेत्र", "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)

ओरेगन क्षेत्र


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), जो समाप्त हो गया है, प्रत्येक सेल में एक TRUE (अर्थात सभी कार्यों के लिए +1)। यह पता लगाने के लिए और जांच करने की आवश्यकता है कि क्या ऐसा कुछ है जिसे रिपोर्ट किया जाना चाहिए (कम से कम एक अतिरिक्त चेतावनी के लिए) ...?
स्ट्रॉग जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.