SpatialPointsDataFrame गुण और ऑपरेटर R में


14

मैंने आर में पैकेज SpatialPointsDataFrameका उपयोग करके प्रकार की एक वस्तु बनाई spहै। हालांकि, मैं @, $, . and []ऑपरेटरों के बारे में उलझन में हूं और जब उन्हें अपनी वस्तु के विभिन्न गुणों तक पहुंचने के लिए उपयोग करना है। यहाँ मेरा नमूना कोड है:

library(sp)
library(rgdal)

#creating a SpatialPointsDataFrame with sample points in UTM
x <- c(15.2, 15.3, 15.4, 15.5, 15.7)
y <- c(50.4, 50.2, 50.3, 50.1, 50.4)
v1 <- c(1.0, 2.0, 3.0, 4.0, 5.0)
v2 <- c("a","b","b","c","a")
attributes <- as.data.frame(cbind(v1,v2))
xy <- cbind(x,y)
locationsDD <- SpatialPointsDataFrame(xy, attributes)
proj4string(locationsDD) <- CRS("+proj=longlat")
locations <- spTransform(locationsDD, CRS("+proj=utm +zone=33"))
plot(locations)

#using the different operators: WHEN TO USE @, $ or [] ?

#all these work!
property1 <- locations$v1
property2 <- locations@data$v1
property3 <- locations@data[,"v1"]
property4 <- locations@data["v1"]

#these also work
property5 <- locations@coords
property6 <- locations@bbox
property7 <- locations@coords[,2]

#these three work only in my special case
property8 <- locations@coords[,"y"]
property9 <- locations$x
property10 <- locations$y

#these don't work: $ operator is invalid for atomic vectors
property11 <- locations@coords$x
property12 <- locations@coords$y

क्या कोई मेरी मदद कर सकता है, जब @, $, []ऑपरेटरों का उपयोग करना है? जब मैं दस्तावेज़ीकरण को पढ़ने की कोशिश करता हूं तो मैं ?SpatialPointsDataFrameविभिन्न गुणों को देख सकता हूं जैसे कि coordsया bboxलेकिन मैं उलझन में हूं कि कौन सा ऑपरेटर @, $, []उन्हें एक्सेस करने या उन्हें संशोधित करने के लिए उपयोग करेगा।


1
क्योंकि यह वास्तव में Rवाक्य रचना के बारे में एक प्रश्न है , यह विशेष रूप से spपैकेज या इसके ऑब्जेक्ट के लिए नहीं है। Rएक ट्यूटोरियल के साथ स्थापित किया गया है: अपने शोध में वहाँ शुरू करें। वेब और प्रिंट मीडिया सीखने के लिए अतिरिक्त संसाधनों का खजाना प्रदान करते हैं R
whuber

जवाबों:


21

स्थानिक एस डेटा एस 4 श्रेणी की वस्तुएं हैं और ये स्लॉट्स से बनी होती हैं (जिन्हें @ का उपयोग करके बुलाया जाता है) जिसमें स्थानिक फीचर क्लास के घटकों का प्रतिनिधित्व किया जाता है (उदाहरण के लिए, @data में विशेषताएँ होती हैं, @coord में समन्वित जोड़े, आदि ...) होते हैं। आप स्लॉट के नाम () का उपयोग करके शीर्ष स्तर के स्लॉट नामों को वापस कर सकते हैं लेकिन यह पुनरावर्ती नहीं है और बहुभुज वर्ग की वस्तुओं के लिए नेस्टेड स्लॉट नामों को वापस नहीं करेगा। प्रत्येक स्लॉट में एक अलग ऑब्जेक्ट क्लास हो सकता है और, उस पर काम करने से पहले, str () या क्लास () का उपयोग करके जांच की जानी चाहिए। @Data स्लॉट हमेशा एक data.frame ऑब्जेक्ट है और @coords एक मैट्रिक्स है जबकि @polygons अतिरिक्त स्लॉट्स (लैप्ट, एरिया, होल, रिंगडायर और कोर्ड्स) के साथ एक सूची ऑब्जेक्ट है।

उनमें से उपलब्ध स्लॉट और संगठन इस बात पर निर्भर करता है कि किस प्रकार के फीचर वर्ग का प्रतिनिधित्व किया जा रहा है। SpatialPointsDataFrame ऑब्जेक्ट सबसे बुनियादी हैं, जबकि SpatialPolygonsDataFrame ऑब्जेक्ट्स में नेस्टिंग (जैसा कि ऊपर देखा गया है) है। इस नेस्टेड संरचना, प्रत्येक बहुभुज का प्रतिनिधित्व करते हुए, प्रत्येक सूची ऑब्जेक्ट (बहुभुज) पर संचालित करने के लिए नीलम जैसी चीज़ का उपयोग करने के लिए जिम्मेदार होना चाहिए।

यहां एक उदाहरण है जो प्रत्येक बहुभुज के लिए क्षेत्र को "पॉलीगॉन" के माध्यम से पुनरावृत्ति करके नीप का उपयोग करता है, फिर, नेस्टेड, "क्षेत्र" स्लॉट (एस)।

sapply(slot(sdat, 'polygons'), function(i) slot(i, 'area')) 

बहुभुज वस्तुओं के मामले में, चूंकि वे प्रत्येक बहुभुज के लिए एक सूची के रूप में संग्रहीत होते हैं, आप वैकल्पिक रूप से सूची अनुक्रमण का उपयोग कर सकते हैं। यहाँ पहला बहुभुज लौटाने का एक उदाहरण है (जिसके परिणामस्वरूप "बहुभुज" वर्ग वस्तु है और न कि SpatialPolygonsDataFrame):

sdat@polygons[[1]]

हाल ही के संस्करणों में, डेवलपर्स ने कुछ उदाहरणों में, सीधे @data स्लॉट को कॉल करने की आवश्यकता को हटा दिया है।

उदाहरण के लिए, @data को पहले से अनुक्रमणित करने के लिए:

sdat@data[sdat@data$att >= 0.5 ,]  

और अब:

sdat[sdat$att >= 0.5 ,]

हालांकि, जैसा कि पहले संकेत दिया गया है, यह अन्य स्लॉट्स (उदाहरण के लिए, निर्देशांक, बहुभुज, आदि ...) के लिए ऐसा नहीं है। जहां तक ​​कब उपयोग करना है [] या $ यह अभी भी ऑपरेशन के प्रकार पर निर्भर है। ब्रैकेट "[]" का उपयोग डेटाफ्रेम में एक नाम को कॉल करने के लिए किया जा सकता है लेकिन मुख्य रूप से इंडेक्सिंग के लिए उपयोग किया जाता है जबकि $ विशेष रूप से एक डेटाफ्रेम में एक कॉलम को कॉल करने के लिए उपयोग किया जाता है। कारण कि स्तंभ नाम के लिए "अप्रत्यक्ष" कॉल काम करता है कि डेवलपर्स ने sp ऑब्जेक्ट के माध्यम से पुनरावर्ती खोज के लिए अनुमति देने के लिए कार्यक्षमता को जोड़ा है। हालाँकि, नाम की उलझनों से बचने के लिए (जैसा कि आपके उदाहरण में; x, y आपके डेटाफ़्रेम में y कॉलम x, ycoord मैट्रिक्स के नामों में y के साथ संघर्ष करेगा) कुछ आंतरिक स्थिरता जाँच रही है कि यह केवल कुछ में काम क्यों करता है उदाहरणों।

एक सुविधाजनक विशेषता यह है कि आप एक पंक्ति सूचकांक के माध्यम से एक स्थानिक वस्तु को कम कर सकते हैं। यहां मैं पहले 10 ऑब्जेक्ट्स सब्मिट कर रहा हूं।

sub.sdat <- sdat[1:10,] 

या, वैकल्पिक रूप से, एक पंक्ति सूचकांक वेक्टर का उपयोग करके एक यादृच्छिक नमूना (एन = 10)।

rs.sdat <- sdat[sample(1:nrow(sdat), 10),]

R कोड लिखने में इंडेक्सिंग और कोष्ठक का उपयोग कैसे करना है, यह समझना बहुत महत्वपूर्ण है।

संपादित करें (03/24/2017): कृपया ध्यान दें कि सरल फ़ीचर (sf) वर्ग, GeoJSON मानक का अनुसरण करते हुए, संभवतः R में स्थानिक वस्तुओं के लिए नया मानक बन जाएगा। आप CRAN sf पर इस वर्ग का विस्तृत विवरण पढ़ सकते हैं आर के लिए वेबसाइट सरल सुविधाएँ


पर्दे के पीछे क्या हो रहा है, इसकी विस्तृत व्याख्या के लिए धन्यवाद। ऐसा प्रतीत होता है कि SpatialPointsDataFrameन केवल @data कॉलम के लिए, बल्कि @coords कॉलम को भी $आवश्यकता के बिना ऑपरेटर के साथ पुनर्प्राप्त किया जा सकता है । तो sdat@coords$eastingजैसा परिणाम देता है वैसा ही देता है sdat$easting
jirikadlec2

ऐसा लगता है कि आप <at> डेटा में एक कॉलम कॉल कर रहे हैं। यह <at> coords स्लॉट के समान नहीं है। आप देखेंगे कि यदि आप कॉलनेम (sdat <at> coords) कहते हैं, तो आप मैट्रिक्स कॉलम के नाम वापस करेंगे: "coords.x1", "coords.x2"। डेटाफ़्रेम में निर्देशांक रखना आवश्यक नहीं है और, चूंकि यह डुप्लिकेट है, स्मृति की कमर।
जेफरी इवांस

नहीं, मैं कॉलम को <at> डेटा में नहीं बुला रहा हूं। मेरी नमूना स्क्रिप्ट, से SpatialPointsDataFrame का उपयोग करना colnames(locations@coords)रिटर्न [1] "x" "y"लेकिन colnames(locations@data)रिटर्न [1] "v1" "v2"। शायद यह व्यवहार इस बात पर निर्भर करता है कि SpatialPointsDataFrame बनाने के लिए किस फ़ंक्शन का उपयोग किया गया था?
jirikadlec2

दरअसल मेरी पहली टिप्पणी में मुझसे गलती है। sdat@coords$eastingकाम नहीं करता क्योंकि sdat @ coord एक मैट्रिक्स है। लेकिन sdat@coords[,"easting"]के बराबर sdat@coords[,1]है sdat$easting
jirikadlec2

मैट्रिक्स में कॉलम नाम वापस करने के लिए एक कैविएट, कॉलनेम () का उपयोग किया जाता है जबकि, नाम () NULL को लौटाएगा। हालाँकि, दोनों नाम () और कॉलनेम () डेटाफ्रेम ऑब्जेक्ट जैसे <<> डेटा पर काम करेंगे। डेटा को पुनः प्राप्त करने का सबसे अच्छा तरीका है <at> निर्देशांक मैट्रिक्स इसे अनुक्रमित करना है: sdat <at> coords [, 1] या कॉलम नाम sdat <at> coords [, "coords.x1"] पर जैसा कि $ $ उल्लेख किया गया है। काम नहीं है क्योंकि यह एक मैट्रिक्स ऑब्जेक्ट है।
जेफरी इवांस

4

आपको इसे str(locations)स्पष्ट करने का प्रयास करना चाहिए ।

उदाहरण के लिए, ये सही हैं:

property2 <- locations@data$v1
property5 <- locations@coords
property6 <- locations@bbox
property7 <- locations@coords[,"x"]
property8 <- locations@coords[,2]

और यह एक property1 <- locations$v1काम करता है, क्योंकि यह data.frame को स्थान, @data के अंदर संदर्भित कर रहा है


str(locations)मुझे कुछ अच्छे संकेत दिए। अब मैं समझता हूं कि @इसका उपयोग "एक वर्ग के स्लॉट" के लिए किया जाता है। लेकिन मुझे अभी तक समझ में नहीं आया कि property9 <- locations$xजब names(locations)कोई काम नहीं होता है जिसका नाम हैx
jirikadlec2

1
जब आप SpatialPointDataFrame बनाते हैं, तो आप x और y को निर्देशांक नामों के रूप में असाइन करते हैं। यदि आप स्थानों @ कोर्ड्स को देखते हैं तो आप मैट्रिक्स को निर्देशांक के साथ देख सकते हैं। इसके अलावा, यदि आप "x" नाम के साथ @data में एक नया कॉलम बनाने का प्रयास करते हैं, तो आप नहीं कर सकते, क्योंकि इसका पहले से ही समन्वित नाम के रूप में उपयोग किया जाता है।
गिलर्मो ओल्मेडो

मैं अभी भी काफी नहीं मिलता है कि ऑपरेटर के SpatialPointsDataFrameसाथ निर्देशांक तक पहुंचने के लिए ऑब्जेक्ट किस तरह के 'जादू' का उपयोग करता है $। लेकिन कम से कम अब मैं इसका उपयोग करने के साथ अधिक सहज हूं। मैंने निम्नलिखित कोड चलाया: colnames(locations@coords) <- c("easting","northing") मैं इसे चलाने के बाद, locations$eastingमुझे x-निर्देशांक वेक्टर locations$northingदेता है और मुझे y-निर्देशांक वेक्टर देता है।
jirikadlec2

मुझे लगता है कि किसी तरह R, निर्देशांक के लिए दो स्तंभों को स्पैटियल पॉइंट पॉइंट डेटाफ्रेम के डेटाफ्रेम भाग के दो और स्तंभों के रूप में मानता है। Thats क्यों आप @data स्लॉट के अंदर एक ही नाम के साथ एक कॉलम हो सकता है
Guillermo Olmedo

1
ऐसा लगता है कि @coordsमैट्रिक्स में स्तंभों का नामकरण इस SpatialPointsDataFrameबात पर निर्भर है कि SpatialPointsDataFrameऑब्जेक्ट कैसे बनाया गया था। विधि एक: coordinates(sdat) <- x ~ yकॉलम को फिर से नाम देगा "coords.x1", "coords.x2"। विधि दो: मैट्रिक्स sdat <- SpatialPointsDataFrame(xy, attributes)से मूल कॉलम नामों को संरक्षित करेगा xy
jirikadlec2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.