आर का उपयोग करके ग्रिड को एकत्र करना


14

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

मेरा सहूलियत बिंदु एक डेटासेट है जिसमें अफ्रीका में संघर्ष की घटनाओं पर भू-आकृतिक डेटा है (देखें www.acleddata.com)। अंक अक्षांश / देशांतर निर्देशांकों के साथ भू-संदर्भित होते हैं और घटना प्रकार और समय पर डेटा होते हैं। जो मैं करना चाहता हूं, वह इन बिंदुओं को 1x1 डिग्री ग्रिड पर एकत्रित करना है।

इस प्रकार एक ग्रिड-सेल में डेटा बिंदुओं की जानकारी होनी चाहिए, अगर उस ग्रिड-सेल के भीतर कोई घटना घटित हुई हो। इसका अंतिम उत्पाद एक डेटा फ्रेम या कुछ ऐसा होना चाहिए जिसे मैं एक सीएसवी-फाइल को निर्यात कर सकता हूं क्योंकि डेटा को सांख्यिकीय विश्लेषण के लिए एक पैनल डेटा-सेट में उपयोग करने का इरादा है।

अब तक मैंने नीचे दिए गए कोड का उपयोग करके डेटा और शेपफाइल को लोड और प्लॉट किया। मेरा मानना ​​है कि मुझे सपा पैकेज से लेकर एग्रीगेट करने के लिए ओवर फंक्शन का उपयोग करना चाहिए लेकिन मुझे नहीं पता कि कैसे। आशा है कि आप में से कोई मदद कर सकता है।

कोड मैं अब तक इस्तेमाल किया पाया जा सकता है यहाँ से अधिक इसी दृश्य परिणाम के साथ वहाँ

QGIS में ऐसा करने के सुझाव का भी स्वागत है।


यह एक तेज सरल ऑपरेशन है जिसमें थोड़ा अंकगणित से अधिक कुछ नहीं की आवश्यकता होती है। लेकिन आप किस प्रारूप में आउटपुट चाहते हैं? "सीएसवी" केवल यह बताता है कि यह एक संबंधपरक तालिका होनी चाहिए, लेकिन यह एक समस्या प्रस्तुत करता है: जब आप समग्र करते हैं, तो प्रत्येक सेल संभावित रूप से अलग-अलग अंकों के अनुरूप होगा । आमतौर पर आप दो विकल्पों में से एक का चयन करते हैं: आप या तो एक रिकॉर्ड प्रति पॉइंट (इसके सेल युक्त आईडी सहित) आउटपुट करते हैं या आप प्रति सेल एक रिकॉर्ड का उत्पादन करते हैं और इसमें शामिल बिंदुओं के कुछ सांख्यिकीय सारांश शामिल करते हैं। आपको किसकी आवश्यकता है?
whuber

1
क्षमा करें, मैंने यह निर्दिष्ट नहीं किया है। मुझे प्रति सेल एक रिकॉर्ड की आवश्यकता है । मैं सेल-वर्ष प्रारूप में पैनल डेटा बनाने के लिए सीएसवी-फाइल का उपयोग करता हूं ।
अश्वशक्ति

जवाबों:


13

डाउनलोड किए गए डेटा में कुछ फ्रेंक लोकल त्रुटियां हैं, इसलिए पहली बात यह है कि निर्देशांक को उचित मानों तक सीमित करें:

data.df <- read.csv("f:/temp/All_Africa_1997-2011.csv", header=TRUE, sep=",",row.names=NULL)
data.df <- subset(data.df, subset=(LONGITUDE >= -180 & LATITUDE >= -90))

ग्रिड सेल निर्देशांक और पहचानकर्ता की गणना करना अक्षांश और देशांतर मानों से दशमलव को कम करने का एक मामला है। (आम तौर पर, मनमाने ढंग से चींटियों के लिए, पहले केंद्र और उन्हें स्केल करने के लिए यूनिट सेल में स्केल करते हैं, दशमलव को काटते हैं, और फिर पुनर्विक्रय करते हैं और पुन: अपने मूल स्थान पर वापस भेज देते हैं, जैसा कि jiनीचे दिए गए कोड में दिखाया गया है ।) हम इन निर्देशकों को अद्वितीय पहचानकर्ताओं में जोड़ सकते हैं। उन्हें इनपुट डेटाफ्रेम में संलग्न करना, और संवर्धित डेटाफ़्रेम को सीएसवी फ़ाइल के रूप में लिखना। प्रति बिंदु एक रिकॉर्ड होगा:

ji <- function(xy, origin=c(0,0), cellsize=c(1,1)) {
  t(apply(xy, 1, function(z) cellsize/2+origin+cellsize*(floor((z - origin)/cellsize))))
}
JI <- ji(cbind(data.df$LONGITUDE, data.df$LATITUDE))
data.df$X <- JI[, 1]
data.df$Y <- JI[, 2]
data.df$Cell <- paste(data.df$X, data.df$Y)

आप इसके बजाय आउटपुट चाहते हो सकते हैं जो प्रत्येक ग्रिड सेल के भीतर घटनाओं को सारांशित करता है। इसे स्पष्ट करने के लिए, आइए प्रति सेल में गणना करें और उन पर आउटपुट करें, प्रति सेल एक रिकॉर्ड:

counts <- by(data.df, data.df$Cell, function(d) c(d$X[1], d$Y[1], nrow(d)))
counts.m <- matrix(unlist(counts), nrow=3)
rownames(counts.m) <- c("X", "Y", "Count")
write.csv(as.data.frame(t(counts.m)), "f:/temp/grid.csv")

अन्य सारांश के लिए, functionतर्क की गणना में परिवर्तन करें counts। (वैकल्पिक रूप से, सेल पहचानकर्ता द्वारा पहली आउटपुट फ़ाइल को सारांशित करने के लिए स्प्रेडशीट या डेटाबेस सॉफ़्टवेयर का उपयोग करें।)

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

count.max <- max(counts.m["Count",])
colors = sapply(counts.m["Count",], function(n) hsv(sqrt(n/count.max), .7, .7, .5))
plot(counts.m["X",] + 1/2, counts.m["Y",] + 1/2, cex=sqrt(counts.m["Count",]/100),
     pch = 19, col=colors,
     xlab="Longitude of cell center", ylab="Latitude of cell center",
     main="Event counts within one-degree grid cells")

अफ्रीका का नक्शा

यह वर्कफ़्लो अब है

  • पूरी तरह से प्रलेखित ( Rकोड के माध्यम से ही),

  • प्रतिक्रमण (इस कोड को फिर से करना),

  • एक्स्टेंसिबल (स्पष्ट तरीकों से कोड को संशोधित करके), और

  • उचित रूप से तेज़ (पूरे ऑपरेशन में इन 53052 टिप्पणियों को संसाधित करने में 10 सेकंड से कम समय लगता है)।


कोड पूरी तरह से प्रतिलिपि प्रस्तुत करने योग्य है। हालांकि मेरा एक अतिरिक्त सवाल है। सारांश के बजाय, मैं इनपुट डेटा फ़ाइल से सेल में निर्मित ग्रिड में जानकारी कैसे संलग्न करूं ?
अश्वारोही

1
आउटपुट तालिका के साथ ऐसा करना संभव नहीं है , क्योंकि कोशिकाओं की पूरी जानकारी में परिवर्तनशील लंबाई है। रिकॉर्ड करने का उचित तरीका जो मैंने पहले आउटपुट के प्रदर्शन के साथ किया है: एक सेल पहचानकर्ता विशेषता के साथ प्रति बिंदु एक रिकॉर्ड। इन दो प्रारूपों में से एक - प्रति-बिंदु और प्रति-कोशिका तालिकाओं - आप जो भी सांख्यिकीय कार्यक्रम का उपयोग कर रहे हैं, उससे उम्मीद की जाएगी।
whuber

1
आह अच्छा। मुझे पता है तुम्हारा क्या मतलब है। केवल सभी कोशिकाओं के लिए एक ग्रिड बनाना होगा और इसे मर्ज करना होगा। सहायता के लिए धन्यवाद।
घोड़े की नाल

3

ठीक है, आप जो चाहते हैं वह एक मूल तथाकथित "स्पेटियल ज्वाइन" है, जो एक दूसरे से दो आकार के मेल खाता है और परिणामी विशेषता-तालिका को योग (गणना संख्या) आवंटित करता है। यदि आप "Spatial Join in R" की खोज करते हैं, तो आपको GIS.Stackexchange पर भी कई उदाहरण मिलेंगे। मैं जल्दी से googled और उदाहरण के लिए इस कोड को एक मेलिंग सूची पर पोस्ट किया गया पाया ।

यदि आप QGIS में स्थानिक विशेषता सम्मिलित करना चाहते हैं, तो निम्न कार्य करें:

  • अपने आकार को .shp फ़ाइलों के रूप में सहेजें ( rgdal पैकेज से कमांड राइटॉग )
  • उन्हें QGIS में लोड करें। उपयुक्त स्केलिंग के साथ MMQGIS प्लगइन (क्रिएट -> क्रूड लेयर बनाएं) के माध्यम से अपने वेक्टर ग्रिड को फिर से बनाएँ।
  • वेक्टर -> डेटा प्रबंधन मेनू से "गुण सम्मिलित करें" टूल का उपयोग करें। अपनी बिंदु परत की एक विशेषता का चयन करें (यह एक सरल स्तंभ हो सकता है जो TRUE (1) या FALSE (0) विभिन्न हिंसात्मक मूल्यों का प्रतिनिधित्व करता है)।
  • अपना ग्रिड चुनें और सभी घटनाओं और योग को निष्पादित करें। बाद में मैं अफ्रीकी महाद्वीप के आकार के साथ आपके ग्रिड को भी क्लिप करूंगा।

यदि जॉइन किसी तरह फेल हो जाता है (मेरे लिए हर समय काम नहीं करता है), तो SEXTANTE से चिपके रहें और SAGA टूलबॉक्स देखें, जिसमें बहुत अच्छे जॉइनिंग फंक्शन भी हों।


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

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

@ वाउचर: यह सच है, लेकिन यदि आप वितरण करना चाहते हैं और शायद अपने आउटपुट को स्टाइल करते हैं, तो एक आकार चयन स्पष्ट विकल्प है। फिर भी, अच्छा आर उदाहरण!
कर्लव

मैंने आखिरकार इसकी कोशिश की। लेकिन इस दृष्टिकोण के साथ समस्या यह है कि यह बहुभुज के लिए सभी टिप्पणियों को पूरा करता है। जबकि मैं आदर्श रूप से समय के साथ विभिन्न घटनाओं की जानकारी रखना चाहता हूं। लेकिन यह हो सकता है कि मैंने कुछ गलत किया हो।
अश्वारोही
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.