স্পিটিয়ালপয়েন্টস ডেটা ফ্রেমের বৈশিষ্ট্য এবং আর তে অপারেটর


14

আমি আর-তে প্যাকেজটি SpatialPointsDataFrameব্যবহার করে টাইপের একটি অবজেক্ট তৈরি করেছি spHowever তবে, আমি @, $, . 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তবে তবে আমি কোন বিভ্রান্ত হয়েছি যে কোনও অপারেটর @, $, []তাদের অ্যাক্সেস করতে বা তাদের পরিবর্তন করতে ব্যবহার করবে to


1
যেহেতু Rএটি সিনট্যাক্স সম্পর্কে সত্যই একটি প্রশ্ন , এটি spপ্যাকেজ বা এর বিষয়গুলির জন্য বিশেষ নয় । Rটিউটোরিয়াল দিয়ে ইনস্টল করা আছে: আপনার গবেষণার মাধ্যমে সেখানে শুরু করুন। ওয়েব এবং প্রিন্ট মিডিয়া শেখার জন্য প্রচুর অতিরিক্ত সংস্থান সরবরাহ করে R
হোবার

উত্তর:


21

স্থানিক এসপি ডেটা হ'ল এস 4 শ্রেণি অবজেক্ট এবং স্লট (@ ব্যবহার করে ডাকা হয়) দিয়ে গঠিত যা স্থানিক বৈশিষ্ট্য শ্রেণীর উপাদানগুলি উপস্থাপিত হয়ে থাকে (যেমন, @ ডাডায় বৈশিষ্ট্য রয়েছে, @ সেকর্ডগুলি স্থানাঙ্ক জোড়া যুক্ত করে ইত্যাদি ইত্যাদি)। স্লটনাম () ব্যবহার করে আপনি শীর্ষ স্তরের স্লট নামগুলি ফিরিয়ে দিতে পারেন তবে এটি পুনরাবৃত্ত হয় না এবং বহুভুজ শ্রেণীর অবজেক্টের জন্য নেস্টেড স্লট নামগুলি ফেরত দেয় না। প্রতিটি স্লটে একটি পৃথক অবজেক্ট শ্রেণি থাকতে পারে এবং এটি চালনার আগে, str () বা শ্রেণী () ব্যবহার করে পরীক্ষা করা উচিত। @ ডেটা স্লট সর্বদা ডেটা.ফ্রেম অবজেক্ট এবং @ কোর্ডস একটি ম্যাট্রিক্স যেখানে @ পলিগনগুলি অতিরিক্ত স্লট (ল্যাবপেট, অঞ্চল, গর্ত, রিংডির এবং কর্ড) সহ একটি তালিকা অবজেক্ট।

তাদের মধ্যে উপলভ্য স্লট এবং সংগঠনটি কী ধরণের বৈশিষ্ট্য শ্রেণীর প্রতিনিধিত্ব করা হচ্ছে তার উপর নির্ভরশীল। স্প্যাটিয়ালপয়েন্টস ডেটা ফ্রেম অবজেক্টগুলি সর্বাধিক বেসিক, যেখানে স্প্যাটিয়ালপলিজোনস ডেটা ফ্রেম অবজেক্টগুলিতে বাসা বেঁধে রয়েছে (উপরে দেখানো হয়েছে)। প্রতিটি বহুভুজকে উপস্থাপন করে এই নেস্টেড কাঠামোটি প্রতিটি তালিকার অবজেক্টে (বহুভুজ) চালনার জন্য সপ্পল জাতীয় কিছু ব্যবহার করার জন্য গণনা করতে হবে।

এখানে একটি উদাহরণ রয়েছে যা "বহুভুজ" এর পরে পুনরায়, নেস্টেড, "অঞ্চল" স্লট (গুলি) এর মাধ্যমে পুনরাবৃত্তি করে প্রতিটি বহুভুজের জন্য অঞ্চলটি ফেরত দিতে সাপ্লাই ব্যবহার করে।

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

বহুভুজ বস্তুর ক্ষেত্রে, যেহেতু তারা প্রতিটি বহুভুজের জন্য একটি তালিকা হিসাবে সংরক্ষণ করা হয়, আপনি বিকল্পভাবে তালিকা সূচকটি ব্যবহার করতে পারেন। এখানে প্রথম বহুভুজটি ফিরিয়ে দেওয়ার জন্য একটি উদাহরণ দেওয়া হয়েছে (যার ফলে "বহুভুজ" শ্রেণি অবজেক্ট হয় এবং স্প্যাটিয়ালপলিজোনস ডেটা ফ্রেম নয়):

sdat@polygons[[1]]

এসপির আরও সাম্প্রতিক সংস্করণগুলিতে বিকাশকারীরা শুরু হয়েছে, কিছু ক্ষেত্রে, @ ডেটা স্লটকে সরাসরি কল করার প্রয়োজনীয়তা সরিয়ে ফেলে।

উদাহরণস্বরূপ, আপনাকে আগে @ ডেটা সূচীকরণ করতে:

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

এবং এখন:

sdat[sdat$att >= 0.5 ,]

যাইহোক, পূর্বে উল্লিখিত হিসাবে, এটি অন্যান্য স্লটগুলির ক্ষেত্রে নয় (যেমন, স্থানাঙ্ক, বহুভুজ, ইত্যাদি ...)। যতক্ষণ পর্যন্ত ব্যবহার করা যায় [] বা $ এটি এখনও অপারেশনের ধরণের উপর নির্ভরশীল। "[]" ব্র্যাকেটগুলি ডেটাফ্রেমে একটি নাম কল করতে ব্যবহৃত হতে পারে তবে প্রাথমিকভাবে ইনডেক্সিংয়ের জন্য ব্যবহৃত হয় যেখানে specifically বিশেষভাবে ডেটা ফ্রেমের কলামে কল করতে ব্যবহৃত হয়। কোনও কলামের নামে "অপ্রত্যক্ষ" কল কাজ করে যে বিকাশকারীরা স্পট অবজেক্টের মাধ্যমে পুনরাবৃত্ত অনুসন্ধানের জন্য অনুমতি দিতে কার্যকারিতা যুক্ত করেছে। তবে নামের দ্বন্দ্ব এড়াতে (যেমন আপনার উদাহরণ হিসাবে; আপনার ডেটাফ্রেমে এক্স, ওয়াই কলামগুলি এক্স কোডের সাথে যুক্ত হবে, y কোডের নাম ম্যাট্রিক্স নামগুলিতে) কিছু অভ্যন্তরীণ ধারাবাহিকতা যাচাই করে যে এটি কেবল কিছুতে কেন কাজ করে? দৃষ্টান্ত।

একটি সুবিধাজনক বৈশিষ্ট্য হ'ল আপনি একটি সারি সূচক মাধ্যমে একটি স্থানিক বস্তু সাবসেট করতে পারেন। এখানে আমি প্রথম 10 অবজেক্ট সাবসেট করছি am

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

অথবা, বিকল্পভাবে, একটি সারি সূচক ভেক্টর ব্যবহার করে একটি এলোমেলো নমুনা (n = 10)।

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

ইনডেক্সিং এবং ব্র্যাকেটগুলি কীভাবে ব্যবহার করা যায় তা বোঝা আর কোড লেখার ক্ষেত্রে একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়।

সম্পাদনা (03/24/2017): দয়া করে নোট করুন যে জিওজেএসএন স্ট্যান্ডার্ড অনুসরণ করে সাধারণ বৈশিষ্ট্য (এসএফ) শ্রেণিটি আরে স্থানিক অবজেক্টের জন্য সম্ভবত নতুন মান হয়ে যাবে the আপনি সিআরএএন এসএফ এ এই শ্রেণীর বিশদ বিবরণ পড়তে পারেন ওয়েবসাইট আর জন্য সহজ বৈশিষ্ট্য


পর্দার আড়ালে কী ঘটছে তার বিশদ ব্যাখ্যার জন্য ধন্যবাদ। এটি প্রদর্শিত হয় যে SpatialPointsDataFrameকেবলমাত্র @ ডেটা কলামগুলির জন্যই নয়, @ কর্ডস কলামগুলিও $অপারেটরটির সাথে @ কোডস স্লটে কল করার প্রয়োজনীয়তা ছাড়াই পুনরুদ্ধার করতে পারে । সুতরাং sdat@coords$eastingহিসাবে একই ফলাফল দেয় sdat$easting
jirikadlec2

দেখে মনে হচ্ছে আপনি <at> ডেটাতে একটি কলাম কল করছেন। এটি <at> কর্ডস স্লটের মতো নয়। আপনি লক্ষ্য করবেন যে আপনি কলনেম (sdat <at> Coords) কল করলে আপনি ম্যাট্রিক্স কলামের নামগুলি ফিরে পাবেন: "Coords.x1", "Coords.x2"। ডেটাফ্রেমে স্থানাঙ্কগুলি রাখা প্রয়োজন হয় না এবং যেহেতু এটি সদৃশ হয় তাই মেমরির একটি কোমর।
জেফ্রি ইভান্স

না। আমি <at> ডেটাতে কলামটি কল করছি না। আমার নমুনা স্ক্রিপ্ট থেকে স্পটিয়ালপয়েন্টস ডেটা ফ্রেম ব্যবহার করে colnames(locations@coords)ফেরত দেয় [1] "x" "y"তবে colnames(locations@data)ফিরে আসে [1] "v1" "v2"। সম্ভবত আচরণটি স্পিশিয়ালপয়েন্টস ডেটা ফ্রেম তৈরি করতে কোন ফাংশনটি ব্যবহার করা হয়েছিল তার উপর নির্ভরশীল?
jirikadlec2

আসলে আমার প্রথম মন্তব্যে আমার একটা ভুল আছে। sdat@coords$eastingকাজ করে না কারণ sdat @ Coord একটি ম্যাট্রিক্স। কিন্তু sdat@coords[,"easting"]সমতূল্য sdat@coords[,1]এবং sdat$easting
jirikadlec2

ম্যাট্রিক্সে কলামের নাম ফিরিয়ে আনার জন্য একটি ক্যাভিয়েট, কলনেম () ব্যবহার করা হয় তবে নামগুলি () NULL ফেরত দেবে। যদিও, উভয় নাম () এবং কলনেম () <at> ডেটার মতো ডেটা ফ্রেম অবজেক্টে কাজ করবে। <at> Coord ম্যাট্রিক্স থেকে ডেটা পুনরুদ্ধারের সর্বোত্তম উপায় হ'ল এটি সূচীকরণ: sdat <at> Coord [, 1] বা কলাম নাম sdat <at> Coord [, "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কাজ করে, কারণ এটি অবস্থানের ভিতরে ডেটা.ফ্রেমটি উল্লেখ করছে, @ ডেটা d


str(locations)আমাকে কিছু ভাল ইঙ্গিত দিয়েছে। এখন আমি বুঝতে পারি যে @"ক্লাসের স্লট" এর জন্য ব্যবহৃত হয়। তবে আমি এখনও বুঝতে পারি না কেন property9 <- locations$xযখন কাজ করে যখন names(locations)কোনও কলাম নেইx
jirikadlec2

1
আপনি স্পাটিয়ালপয়েন্টড ডেটা ফ্রেমটি তৈরি করার সময়, আপনি স্থানাঙ্ক হিসাবে নাম হিসাবে x এবং y নির্ধারণ করেন। আপনি যদি অবস্থানগুলি @ কর্ডগুলি দেখেন তবে আপনি স্থানাঙ্কগুলির সাথে ম্যাট্রিক্স দেখতে পারেন। এছাড়াও, আপনি যদি "x" নামটি সহ @ ডেটাতে একটি নতুন কলাম তৈরি করার চেষ্টা করেন তবে আপনি পারবেন না, কারণ এটি ইতিমধ্যে স্থানাঙ্কিত নাম হিসাবে ব্যবহার করে।
গিলারমো ওলমেডো

অপারেটরের SpatialPointsDataFrameসাথে স্থানাঙ্কগুলি অ্যাক্সেসের জন্য অবজেক্টটি কী ধরণের 'যাদু' ব্যবহার করে তা এখনও আমি পুরোপুরি পাই না $। তবে কমপক্ষে আমি এখন এটি ব্যবহার করে আরও আরামদায়ক। আমি নিম্নলিখিত কোডটি চালিয়েছি: colnames(locations@coords) <- c("easting","northing") আমি এটিকে চালানোর পরে locations$easting, আমাকে এক্স-সমন্বিত ভেক্টর locations$northingদেয় এবং আমাকে y- সমন্বিত ভেক্টর দেয়।
jirikadlec2

আমি মনে করি কোনওভাবে আর স্থানাঙ্কগুলির জন্য দুটি কলামকে স্প্যাটিয়ালপয়েন্টস ডেটা ফ্রেমের অংশগ্রহনের ডেটাফ্রেম অংশের আরও দুটি কলাম হিসাবে বিবেচনা করে। আপনি কেন @ ডেটা স্লটের ভিতরে একই নামে কলাম রাখতে পারবেন তা জানেন
গিলারমো ওলমেডো

1
দেখে মনে হচ্ছে যে @coordsম্যাট্রিক্সে কলামগুলির নামকরণ SpatialPointsDataFrameকীভাবে SpatialPointsDataFrameবস্তুটি তৈরি হয়েছিল তার উপর নির্ভরশীল । একটি পদ্ধতি: coordinates(sdat) <- x ~ yকলামগুলিতে পুনরায় নামকরণ করবে "coords.x1", "coords.x2"। পদ্ধতি দুটি: ম্যাট্রিক্স sdat <- SpatialPointsDataFrame(xy, attributes)থেকে মূল কলামের নাম সংরক্ষণ করবে xy
jirikadlec2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.