Saya telah membuat objek tipe SpatialPointsDataFrame
menggunakan sp
paket di R. Namun, saya bingung tentang @, $, . and []
operator dan kapan menggunakannya untuk mengakses properti yang berbeda dari objek saya. Berikut ini contoh kode saya:
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
Adakah yang bisa membantu saya, kapan harus menggunakan @, $, []
operator? Ketika saya mencoba membaca dokumentasi ?SpatialPointsDataFrame
saya dapat melihat properti yang berbeda seperti coords
atau bbox
tetapi saya bingung operator mana yang @, $, []
akan digunakan untuk mengaksesnya atau memodifikasinya.
R
sintaks, itu tidak khusus untuksp
paket atau objeknya.R
diinstal dengan tutorial: mulailah dari sana dalam penelitian Anda. Web dan media cetak menawarkan banyak sumber daya tambahan untuk belajarR
.Jawaban:
Data sp spasial adalah objek kelas S4 dan terdiri dari slot (disebut dengan menggunakan @) yang berisi komponen kelas fitur spasial yang diwakili (misalnya, @ data mengandung atribut, @ coords berisi pasangan koordinat, dll ...). Anda dapat mengembalikan nama slot tingkat atas menggunakan slotNames () tetapi tidak rekursif dan tidak akan mengembalikan nama slot bersarang untuk objek kelas poligon. Setiap slot dapat berisi kelas objek yang berbeda dan, sebelum mengoperasikannya, harus diperiksa menggunakan str () atau class (). Slot @data selalu merupakan objek data.frame dan @coords adalah matriks sedangkan @polygons adalah objek daftar dengan slot tambahan (labpt, area, hole, ringDir dan coords).
Slot dan organisasi yang tersedia tergantung pada jenis kelas fitur yang diwakili. Objek SpatialPointsDataFrame adalah yang paling dasar, sedangkan objek SpatialPolygonsDataFrame bersarang (seperti yang terlihat di atas). Struktur bersarang ini, mewakili setiap poligon, harus dipertanggungjawabkan menggunakan sesuatu seperti sapply untuk beroperasi pada setiap objek daftar (poligon).
Berikut adalah contoh yang menggunakan sapply untuk mengembalikan area untuk setiap poligon dengan mengulangi melalui "poligon" lalu, slot, area "bersarang".
Dalam kasus objek poligon, karena mereka disimpan sebagai daftar untuk setiap poligon, Anda dapat menggunakan pengindeksan daftar. Berikut ini adalah contoh untuk mengembalikan poligon pertama (menghasilkan objek kelas "Poligon" dan bukan SpatialPolygonsDataFrame):
Dalam versi yang lebih baru dari sp pengembang telah memulai, dalam beberapa kasus, menghapus keharusan memanggil slot @data secara langsung.
Misalnya, untuk mengindeks @ data Anda sebelumnya:
dan sekarang:
Namun, seperti yang ditunjukkan sebelumnya, ini bukan kasus untuk slot lain (misalnya, koordinat, poligon, dll ...). Sejauh kapan harus menggunakan [] atau $ ini masih tergantung pada jenis operasi. Tanda kurung "[]" dapat digunakan untuk memanggil nama dalam kerangka data tetapi terutama digunakan untuk pengindeksan sedangkan $ secara khusus digunakan untuk memanggil kolom dalam kerangka data. Alasan panggilan "tidak langsung" ke nama kolom berfungsi karena pengembang telah menambahkan fungsionalitas untuk memungkinkan pencarian rekursif melalui objek sp. Namun, untuk menghindari konflik nama (seperti dalam contoh Anda; memiliki kolom x, y dalam bingkai data Anda akan bertentangan dengan nama x, y dalam nama matriks @coord) ada beberapa konsistensi internal yang memeriksa alasan mengapa ini hanya berfungsi di beberapa contoh.
Salah satu karakteristik yang mudah digunakan adalah Anda dapat mengelompokkan objek spasial melalui indeks baris. Di sini saya mengatur ulang 10 objek pertama.
Atau, sebagai alternatif, sampel acak (n = 10) menggunakan vektor indeks baris.
Memahami pengindeksan dan cara menggunakan kurung adalah hal yang sangat penting dalam menulis kode R.
Sunting (03/24/2017): Harap dicatat bahwa kelas fitur sederhana (sf), mengikuti standar GeoJSON, kemungkinan akan menjadi standar baru untuk objek spasial di R. Anda dapat membaca deskripsi rinci tentang kelas ini di CRAN sf situs Wikipedia Fitur untuk R .
sumber
SpatialPointsDataFrame
tidak hanya kolom @ data, tetapi juga kolom @coords dapat diambil dengan$
operator tanpa perlu memanggil slot @coords. Jadisdat@coords$easting
memberikan hasil yang sama dengansdat$easting
.colnames(locations@coords)
mengembalikan[1] "x" "y"
tetapicolnames(locations@data)
mengembalikan[1] "v1" "v2"
. Mungkin perilaku ini tergantung pada fungsi apa yang digunakan untuk membuat SpatialPointsDataFrame?sdat@coords$easting
tidak berfungsi karena sdat @ coords adalah sebuah matriks. Tetapisdat@coords[,"easting"]
setara dengansdat@coords[,1]
dan untuksdat$easting
.Anda harus mencoba
str(locations)
menjelaskan ini.misalnya, ini benar:
Dan ini
property1 <- locations$v1
berfungsi, karena mereferensikan data.frame di dalam lokasi, @ datasumber
str(locations)
memberi saya beberapa petunjuk bagus. Sekarang saya mengerti bahwa@
ini digunakan untuk "slot kelas". Tapi saya masih tidak mengerti mengapaproperty9 <- locations$x
bekerja ketikanames(locations)
tidak mengandung kolom bernamax
SpatialPointsDataFrame
digunakan objek untuk mengakses koordinat dengan$
operator. Tapi setidaknya saya lebih nyaman menggunakannya sekarang. Saya menjalankan kode berikut:colnames(locations@coords) <- c("easting","northing")
Setelah saya jalankan,locations$easting
beri saya vektor koordinat x danlocations$northing
beri saya vektor koordinat y.@coords
matriksSpatialPointsDataFrame
tergantung pada bagaimanaSpatialPointsDataFrame
objek itu dibuat. Metode satu:coordinates(sdat) <- x ~ y
akan menamai ulang kolom untuk"coords.x1", "coords.x2"
. Metode dua:sdat <- SpatialPointsDataFrame(xy, attributes)
akan mempertahankan nama kolom asli darixy
matriks.