Ich habe ein Objekt vom Typ SpatialPointsDataFrame
mit dem sp
Paket in R erstellt. Ich bin jedoch verwirrt über die @, $, . and []
Operatoren und wann sie verwendet werden müssen, um auf die verschiedenen Eigenschaften meines Objekts zuzugreifen. Hier ist mein Beispielcode:
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
Könnte mir jemand helfen, wann man die @, $, []
Operatoren benutzt? Wenn ich versuche, die Dokumentation zu lesen, ?SpatialPointsDataFrame
sehe ich die verschiedenen Eigenschaften wie coords
oder, bbox
aber ich bin verwirrt, welchen Operator ich @, $, []
verwenden soll, um darauf zuzugreifen oder sie zu ändern.
R
Syntax handelt, sind weder dassp
Paket noch seine Objekte betroffen.R
wird mit einem Tutorial installiert: Beginnen Sie dort mit Ihrer Recherche. Das Web und die Printmedien bieten eine Fülle zusätzlicher LernressourcenR
.Antworten:
Räumliche sp-Daten sind S4-Klassenobjekte und bestehen aus Slots (mit @ bezeichnet), die Komponenten der dargestellten räumlichen Feature-Class enthalten (z. B. @data enthält Attribute, @coords enthält Koordinatenpaare usw.). Sie können die Steckplatznamen der obersten Ebene mit slotNames () zurückgeben, dies ist jedoch nicht rekursiv und es werden keine verschachtelten Steckplatznamen für Polygonklassenobjekte zurückgegeben. Jeder Slot kann eine andere Objektklasse enthalten und sollte vor der Bearbeitung mit str () oder class () überprüft werden. Der Slot @data ist immer ein data.frame-Objekt und @coords ist eine Matrix, während @polygons ein Listenobjekt mit zusätzlichen Slots ist (labpt, area, hole, ringDir und coords).
Die verfügbaren Slots und ihre Organisation hängen davon ab, welcher Typ von Feature-Class dargestellt wird. SpatialPointsDataFrame-Objekte sind die grundlegendsten Objekte, wohingegen SpatialPolygonsDataFrame-Objekte (wie oben gezeigt) verschachtelt sind. Bei dieser verschachtelten Struktur, die jedes Polygon darstellt, muss berücksichtigt werden, dass für jedes Listenobjekt (Polygon) so etwas wie sapply verwendet wird.
In diesem Beispiel wird sapply verwendet, um die Fläche für jedes Polygon durch Iteration durch die "Polygone" und dann durch die verschachtelten "Flächen" -Slots zurückzugeben.
Bei Polygonobjekten können Sie alternativ die Listenindizierung verwenden, da sie als Liste für jedes Polygon gespeichert werden. Im folgenden Beispiel wird das erste Polygon zurückgegeben (was zu einem Klassenobjekt "Polygon" und nicht zu SpatialPolygonsDataFrame führt):
In neueren Versionen von sp haben die Entwickler in einigen Fällen damit begonnen, den @ data-Slot nicht mehr direkt aufzurufen.
Zum Beispiel, um @data zu indizieren:
und nun:
Wie bereits erwähnt, gilt dies jedoch nicht für die anderen Slots (z. B. Koordinaten, Polygone usw.). Wann [] oder $ verwendet werden, hängt immer noch von der Art der Operation ab. Klammern "[]" können zum Aufrufen eines Namens in einem Datenrahmen verwendet werden, werden jedoch hauptsächlich zum Indizieren verwendet, wohingegen $ speziell zum Aufrufen einer Spalte in einem Datenrahmen verwendet wird. Der Grund, warum ein "indirekter" Aufruf eines Spaltennamens funktioniert, besteht darin, dass die Entwickler Funktionen hinzugefügt haben, die eine rekursive Suche durch das sp-Objekt ermöglichen. Um jedoch Namenskonflikte zu vermeiden (wie in Ihrem Beispiel, wenn x-, y-Spalten in Ihrem Datenrahmen in Konflikt mit den x-, y-Namen in den @ coord-Matrixnamen stehen würden), wird eine interne Konsistenzprüfung durchgeführt, die erklärt, warum dies nur in einigen Fällen funktioniert Instanzen.
Ein praktisches Merkmal ist, dass Sie ein räumliches Objekt über einen Zeilenindex unterteilen können. Hier setze ich die ersten 10 Objekte unter.
Oder alternativ eine Zufallsstichprobe (n = 10) unter Verwendung eines Zeilenindexvektors.
Das Verständnis der Indizierung und der Verwendung von Klammern ist beim Schreiben von R-Code von großer Bedeutung.
Bearbeiten (24.03.2017): Bitte beachten Sie, dass die einfache Feature-Class (sf) nach dem GeoJSON-Standard wahrscheinlich der neue Standard für räumliche Objekte in R wird. Eine ausführliche Beschreibung dieser Klasse finden Sie im CRAN sf Website Einfache Funktionen für R .
quelle
SpatialPointsDataFrame
nicht nur die @ data-Spalten, sondern auch die @ coords-Spalten mit dem$
Operator abgerufen werden können, ohne dass der @ coords-Slot aufgerufen werden muss. Sosdat@coords$easting
ergibt sich das gleiche Ergebnis wiesdat$easting
.colnames(locations@coords)
kehrt[1] "x" "y"
abercolnames(locations@data)
kehrt[1] "v1" "v2"
. Vielleicht hängt das Verhalten davon ab, welche Funktion zum Erstellen des SpatialPointsDataFrame verwendet wurde?sdat@coords$easting
funktioniert nicht, weil sdat @ coords eine Matrix ist. Istsdat@coords[,"easting"]
aber äquivalent zusdat@coords[,1]
und zusdat$easting
.Sie sollten versuchen
str(locations)
, dies zu klären.Zum Beispiel sind diese richtig:
Und dies
property1 <- locations$v1
funktioniert, weil es auf den data.frame-Speicherort @data verweistquelle
str(locations)
gab mir ein paar gute hinweise. Jetzt verstehe ich, dass@
für "Slot einer Klasse" verwendet wird. Aber ich verstehe immer noch nicht, warumproperty9 <- locations$x
funktioniert, wennnames(locations)
keine Spalte mit dem Namenx
SpatialPointsDataFrame
Objekt auf die Koordinaten zugreift$
. Aber zumindest bin ich jetzt damit wohler. Ich habe den folgenden Code ausgeführt:colnames(locations@coords) <- c("easting","northing")
Nachdem ich ihn ausgeführt habe,locations$easting
erhalte ich den x-Koordinatenvektor undlocations$northing
den y-Koordinatenvektor.@coords
Matrix der davonSpatialPointsDataFrame
abhängt, wie dasSpatialPointsDataFrame
Objekt erstellt wurde. Methode eins:coordinates(sdat) <- x ~ y
Benennt die Spalten in um"coords.x1", "coords.x2"
. Methode 2:sdat <- SpatialPointsDataFrame(xy, attributes)
Die ursprünglichen Spaltennamen aus derxy
Matrix werden beibehalten .