SpatialPointsDataFrame özellikleri ve R işleçleri


14

R'deki paketi SpatialPointsDataFramekullanarak bir tür nesne oluşturdum sp. Ancak, @, $, . and []işleçler ve nesnemin farklı özelliklerine erişmek için bunları ne zaman kullanacağım konusunda kafam karıştı . İşte benim örnek kod:

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

@, $, []Operatörleri ne zaman kullanacak kimse bana yardım edebilir mi? Belgeleri okumaya çalıştığımda veya ?SpatialPointsDataFramegibi farklı özellikleri görebiliyorum, ancak bunlara erişmek veya değiştirmek için hangi operatörün kullanılacağı konusunda kafam karıştı .coordsbbox@, $, []


1
Bu gerçekten Rsözdizimi ile ilgili bir soru olduğundan, sppakete veya nesnelerine özgü değildir . Rbir öğretici ile yüklenir: araştırmanızda oradan başlayın. Web ve basılı medya, öğrenim için zengin ek kaynaklar sunar R.
whuber

Yanıtlar:


21

Uzamsal sp verileri S4 sınıfı nesnelerdir ve temsil edilen uzamsal özellik sınıfının bileşenlerini içeren yuvalardan (@ @ denir) oluşur (örneğin, @data öznitelikler içerir, @coordlar koordinat çiftleri içerir, vb ...). En üst düzey yuva adlarını slotNames () kullanarak döndürebilirsiniz, ancak yinelemeli değildir ve çokgen sınıf nesneleri için iç içe yuva adlarını döndürmez. Her yuva farklı bir nesne sınıfı içerebilir ve üzerinde çalışmadan önce str () veya class () kullanılarak kontrol edilmelidir. @Data yuvası her zaman bir data.frame nesnesidir ve @coords bir matristir, @polygons ise ek yuvalara (labpt, alan, delik, ringDir ve coords) sahip bir liste nesnesidir.

Kullanılabilir yuvalar ve bunların düzenlenmesi, ne tür bir özellik sınıfının temsil edildiğine bağlıdır. SpatialPointsDataFrame nesneleri en temel olanıdır, oysa SpatialPolygonsDataFrame nesneleri yuvalama (yukarıda görüldüğü gibi) içerir. Her bir çokgeni temsil eden bu iç içe geçmiş yapının, her liste nesnesinde (çokgen) işlemek için aptal gibi bir şey kullanması dikkate alınmalıdır.

Aşağıda, "çokgenler" ve ardından iç içe "alan" yuva (lar) ını yineleyerek her çokgenin alanını döndürmek için aptal kullanan bir örnek verilmiştir.

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

Çokgen nesneleri söz konusu olduğunda, her çokgen için bir liste olarak saklandıklarından, alternatif olarak liste indekslemeyi kullanabilirsiniz. İlk çokgeni döndürmek için bir örnek (SpatialPolygonsDataFrame değil "Polygon" sınıf nesnesiyle sonuçlanır):

sdat@polygons[[1]]

Sp'nin daha yeni sürümlerinde, geliştiriciler bazı durumlarda @ veri yuvasını doğrudan çağırma zorunluluğunu ortadan kaldırmaya başladı.

Örneğin, daha önce @ verileri endekslemek için:

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

ve şimdi:

sdat[sdat$att >= 0.5 ,]

Bununla birlikte, daha önce belirtildiği gibi, diğer yarıklar (örneğin, koordinatlar, çokgenler, vb.) İçin durum böyle değildir. [] Veya $ ne zaman kullanılacağına göre, bu hala işlem türüne bağlıdır. Köşeli parantez "[]" veri çerçevesindeki bir adı çağırmak için kullanılabilir, ancak öncelikle dizin oluşturma için kullanılırken, $ özellikle veri çerçevesindeki bir sütunu çağırmak için kullanılır. Bir sütun adına "dolaylı" çağrılmasının nedeni, geliştiricilerin sp nesnesi üzerinde özyinelemeli bir aramaya izin vermek için işlevsellik eklemiş olmalarıdır. Bununla birlikte, ad çakışmalarını önlemek için (örneğin; veri çerçevenizde x, y sütunlarına sahip olmak @coord matris adlarındaki x, y adlarıyla çakışır), bunun neden yalnızca bazılarında çalıştığını açıklayan bazı iç tutarlılık denetimleri vardır örnekleri.

Uygun bir karakteristik, uzamsal bir nesneyi bir satır indeksi üzerinden alt kümeye atayabilmenizdir. Burada ilk 10 nesneyi alt kümelendiriyorum.

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

Veya alternatif olarak, bir sıra indeksi vektörü kullanan rastgele bir örnek (n = 10).

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

İndekslemeyi ve parantezlerin nasıl kullanılacağını anlamak R kodu yazarken çok önemlidir.

Düzenleme (03/24/2017): GeoJSON standardını izleyen basit özellik (sf) sınıfının muhtemelen R'deki uzamsal nesneler için yeni standart olacağını unutmayın. CRAN sf'de bu sınıfın ayrıntılı bir açıklamasını okuyabilirsiniz. web sitesi R için Basit Özellikler .


Perde arkasında neler olduğuna dair ayrıntılı bir açıklama için teşekkürler. Görünüşe göre SpatialPointsDataFramesadece @data sütunları için değil, aynı zamanda @coord sütunları $da @coords yuvasını çağırmaya gerek kalmadan operatörle alınabilir . Yani sdat@coords$eastingaynı sonucu verir sdat$easting.
jirikadlec2

Görünüşe göre <at> verilerinde bir sütun çağırıyorsunuz. Bu <at> koordinat yuvasıyla aynı değildir. Eğer colnames (sdat <at> koordinatları) çağırırsanız, matris sütun adlarını döndüreceğinizi göreceksiniz: "coords.x1", "coords.x2". Veri çerçevesinde koordinatları tutmak gerekli değildir ve çoğaltıldığı için bir bel hafızasıdır.
Jeffrey Evans

Hayır. <at> verilerindeki sütunu çağırmıyorum. Örnek komut dosyamdaki SpatialPointsDataFrame kullanarak colnames(locations@coords)döndürür [1] "x" "y"ancak colnames(locations@data)döndürür [1] "v1" "v2". Belki de davranış SpatialPointsDataFrame oluşturmak için kullanılan fonksiyona bağlıdır?
jirikadlec2

Aslında ilk yorumumda bir hata var. sdat@coords$eastingçalışmıyor çünkü sdat @ coords bir matristir. Ama sdat@coords[,"easting"]eşdeğerdir sdat@coords[,1]ve sdat$easting.
jirikadlec2

Bir uyarı, colnames () öğesi bir matristeki sütun adlarını döndürmek için kullanılırken, names () NULL döndürür. Bununla birlikte, hem names () hem de colnames (), <at> veri gibi bir veri çerçevesi nesnesi üzerinde çalışır. <at> koordinat matrisinden veri almanın en iyi yolu onu dizine eklemektir: sdat <at> koordinatları [, 1] veya sütun adıyla sdat <at> koordinatları [, "coords.x1"], ancak belirttiğiniz gibi $ yapar Matris nesnesi olduğu için çalışmaz.
Jeffrey Evans

4

Bunu str(locations)açıklığa kavuşturmaya çalışmalısınız.

örneğin, bunlar doğrudur:

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

Ve bu property1 <- locations$v1işe yarıyor, çünkü konumun içindeki data.frame'e başvuruyor, @data


str(locations)bana bazı iyi ipuçları verdi. Şimdi anlıyorum @"sınıfın yuvası" için kullanılır. Ama hala neden herhangi bir sütun içermediğinde property9 <- locations$xişe yaradığını anlamıyorumnames(locations)x
jirikadlec2

1
SpatialPointDataFrame'i oluşturduğunuzda, koordinat adları olarak x ve y'yi atarsınız. Locations @ coords'a bakarsanız, koordinatları içeren matrisi görebilirsiniz. Ayrıca, @ verilerinde "x" adıyla yeni bir sütun oluşturmaya çalışırsanız, zaten koordinat adı olarak kullanıldığından bunu yapamazsınız.
Guillermo Olmedo

Hala SpatialPointsDataFramenesnenin $operatörle koordinatlara erişmek için ne tür bir 'büyü' kullandığını anlamıyorum . Ama en azından şimdi kullanmaktan daha rahatım. Aşağıdaki kodu koştum: colnames(locations@coords) <- c("easting","northing") Çalıştırdıktan sonra, locations$eastingbana x-koordinat vektörü locations$northingverir ve bana y-koordinat vektörü verir.
jirikadlec2

Bir şekilde R koordinatları için iki sütun SpatialPointsDataFrame dataframe bölümünün iki sütun daha düşünüyor düşünüyorum. Bu nedenle, @data yuvasında aynı ada sahip bir sütun olabilir
Guillermo Olmedo

1
@coordsMatrisindeki sütunların adlandırılması SpatialPointsDataFrame, SpatialPointsDataFramenesnenin nasıl oluşturulduğuna bağlıdır. Birinci yöntem: coordinates(sdat) <- x ~ ysütunları yeniden adlandırır "coords.x1", "coords.x2". İkinci yöntem: sdat <- SpatialPointsDataFrame(xy, attributes)Orijinal sütun adlarını xymatristen koruyacaktır .
jirikadlec2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.