বহুগুণে যোগ দিচ্ছেন আর


29

আমি ভাবছি কীভাবে আর কোড ব্যবহার করে স্থানিক বহুভুজগুলিতে যোগদান করবেন?

আমি আদমশুমারি সংক্রান্ত তথ্য নিয়ে কাজ করছি যেখানে সময়ের সাথে সাথে নির্দিষ্ট অঞ্চলগুলি পরিবর্তিত হয় এবং আমি বহুভুজ এবং সংশ্লিষ্ট ডেটাগুলিতে যোগদান করতে এবং যুক্ত হওয়া অঞ্চলগুলি সম্পর্কে কেবল রিপোর্ট করতে চাই। আমি বহুভুজগুলির একটি তালিকা বজায় রাখছি যার আদমশুমারিতে শুমারিতে পরিবর্তন রয়েছে এবং আমি একীভূত করার পরিকল্পনা করছি। আমি বিভিন্ন বছর থেকে আদমশুমারির তথ্যে প্রয়োগ করতে অঞ্চল নামের এই তালিকাটিকে একটি অনুসন্ধানের তালিকা হিসাবে ব্যবহার করতে চাই।

আমি ভাবছি যে নির্বাচিত বহুভুজ এবং সম্পর্কিত ডেটা মার্জ করার জন্য আর ফাংশনটি কী ব্যবহার করবেন। আমি এটি googled আছে কিন্তু কেবল ফলাফল দ্বারা বিভ্রান্ত হয়ে।


বহু জ্যামিতি ক্রিয়াকলাপগুলির উত্তর যেমন বহুভুজ দ্রবীভূতকরণ, ওভারলে, পয়েন্ট-ইন-বহুভুজ, ছেদ, ইউনিয়ন ইত্যাদি r rgeos প্যাকেজ।
স্পেসডম্যান

1
মার্কিন আদমশুমারি ব্যুরো 1990-2000 এবং 2000-2010 এর জন্য এটি সারণী প্রকাশ করে। তারা সঙ্গে পরিচালিত হতে পারে ডাটাবেসের , যোগদান করে যার দ্বারা প্রয়োগ করা হয় Rএর mergeফাংশন।
হোবার

উত্তর:


39

নিম্নলিখিত সমাধানটি আর-সিগ-জিওতে রজার বিভান্ডের একটি পোস্টের ভিত্তিতে তৈরি । আমি ওরেগন থেকে কিছু আদমশুমারি ডেটার সাথে জার্মান শেফফিলের প্রতিস্থাপনের উদাহরণটি গ্রহণ করেছি যা আপনি এখান থেকে ডাউনলোড করতে পারেন ('ওরেগন কাউন্টি এবং আদমশুমারির তথ্য থেকে সমস্ত শেপফাইল উপাদান গ্রহণ করুন)'।

আসুন শুরু করা যাক প্রয়োজনীয় প্যাকেজগুলি লোড করা এবং শেফফাইলটি আর তে আমদানি করে with

# 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)

ওরেগন অঞ্চল


10

এসএফ প্যাকেজ ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে:

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) সমাপ্ত হয়। যদি এমন কিছু রিপোর্ট করা উচিত তবে তা জানতে আরও তদন্ত করা দরকার (কমপক্ষে একটি অতিরিক্ত সতর্কতার জন্য) ...?
স্ট্রাগু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.