RのSpatialPointsDataFrameプロパティと演算子


14

R SpatialPointsDataFramespパッケージを使用してタイプのオブジェクトを作成しました。ただし、@, $, . 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

いつ@, $, []オペレータを使用するのですか?ドキュメントを読み込もうとすると?SpatialPointsDataFramecoordsまたはなどのさまざまなプロパティが表示されますが、それらのプロパティにアクセスしたり変更したりするために使用するbbox演算子がわかり@, $, []ません。


1
これは実際にはR構文に関する質問であるため、spパッケージまたはそのオブジェクトに固有のものではありません。Rチュートリアルとともにインストールされます。調査から始めてください。Webと印刷媒体は、学習のための豊富な追加リソースを提供しますR
whuber

回答:


21

空間spデータはS4クラスオブジェクトであり、表現される空間フィーチャクラスのコンポーネントを含むスロット(@を使用して呼び出されます)で構成されます(例:@dataには属性が含まれ、@ coordsには座標ペアなどが含まれます)。slotNames()を使用してトップレベルのスロット名を返すことができますが、再帰的ではなく、ポリゴンクラスオブジェクトのネストされたスロット名を返しません。各スロットには異なるオブジェクトクラスを含めることができ、操作する前に、str()またはclass()を使用してチェックする必要があります。@dataスロットは常にdata.frameオブジェクトで、@ coordsはマトリックスですが、@ polygonsは追加のスロット(labpt、area、hole、ringDir、coords)を持つリストオブジェクトです。

使用可能なスロットとそれらの構成は、どのタイプのフィーチャクラスが表されているかに依存します。SpatialPointsDataFrameオブジェクトは最も基本的ですが、SpatialPolygonsDataFrameオブジェクトにはネストがあります(上記参照)。各ポリゴンを表すこのネスト構造は、sapplyなどを使用して各リストオブジェクト(ポリゴン)を操作することを考慮する必要があります。

次に、sapplyを使用して、「ポリゴン」、次にネストされた「エリア」スロットを反復処理して、各ポリゴンのエリアを返す例を示します。

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

ポリゴンオブジェクトの場合、それらは各ポリゴンのリストとして保存されるため、代わりにリストインデックスを使用できます。最初のポリゴンを返す例は次のとおりです(結果はSpatialPolygonsDataFrameではなく "Polygon"クラスオブジェクトになります)。

sdat@polygons[[1]]

spの最近のバージョンでは、開発者は@dataスロットを直接呼び出す必要をなくす場合があります。

たとえば、以前に@dataにインデックスを付けるには:

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

そしていま:

sdat[sdat$att >= 0.5 ,]

ただし、前述のように、これは他のスロット(座標、ポリゴンなど)には当てはまりません。[]または$をいつ使用するかは、操作の種類によって異なります。ブラケット「[]」はデータフレーム内の名前を呼び出すために使用できますが、主にインデックス作成に使用されますが、$はデータフレーム内の列を呼び出すために特に使用されます。列名の「間接」呼び出しが機能する理由は、開発者がspオブジェクトを再帰的に検索できる機能を追加したためです。ただし、名前の競合を回避するために(あなたの例のように、データフレームにx、y列があると@coordマトリックス名のx、y名と競合する)、これが一部でのみ機能する理由を説明する内部整合性チェックがありますインスタンス。

便利な特性の1つは、行インデックスを介して空間オブジェクトをサブセット化できることです。ここでは、最初の10個のオブジェクトをサブセットしています。

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

または、行インデックスベクトルを使用したランダムサンプル(n = 10)。

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

インデックス作成とブラケットの使用方法を理解することは、Rコードを記述する上で非常に重要なことです。

編集(2017年3月24日):GeoJSON標準に従うシンプルフィーチャ(sf)クラスは、Rの空間オブジェクトの新しい標準になる可能性が高いことに注意してください。このクラスの詳細な説明は、CRAN sfで参照できます。ウェブサイトのシンプルRのための機能します


舞台裏で何が起こっているのかを詳しく説明してくれてありがとう。それはのためにそれを表示されますSpatialPointsDataFrame@data列だけでなく、@coords列を使用して取得することができ$@coordsスロットを呼び出すことを必要とすることなくオペレータ。したがってsdat@coords$easting、と同じ結果が得られsdat$eastingます。
jirikadlec2 14

<at> dataの列を呼び出しているようです。これは、<at> coordsスロットとは異なります。colnames(sdat <at> coords)を呼び出すと、マトリックス列名「coords.x1」、「coords.x2」が返されます。データフレーム内に座標を保持する必要はありません。また、重複しているため、メモリのウエストを保持する必要はありません。
ジェフリーエヴァンス14

いいえ。<at>データの列を呼び出していません。サンプルスクリプトのSpatialPointsDataFrameを使用すると、が返されcolnames(locations@coords)ます[1] "x" "y"が、がcolnames(locations@data)返されます[1] "v1" "v2"。たぶん、動作はSpatialPointsDataFrameの作成に使用された関数に依存していますか?
jirikadlec2 14

実際、最初のコメントに間違いがあります。sdat@coords$eastingsdat @ coordsは行列であるため機能しません。しかし、sdat@coords[,"easting"]と等価であるsdat@coords[,1]としますsdat$easting
jirikadlec2 14

注意点の1つは、colnames()が行列の列名を返すために使用されるのに対して、names()はNULLを返すためです。ただし、names()とcolnames()は、<at> dataなどのデータフレームオブジェクトで機能します。<at> coordマトリックスからデータを取得する最良の方法は、インデックスを付けることです:sdat <at> coords [、1]または列名sdat <at> coords [、 "coords.x1"]で、ただし$行列オブジェクトであるため機能しません。
ジェフリーエヴァンス14

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を座標名として割り当てます。locations @ coordsを見ると、座標を含むマトリックスを見ることができます。また、@ dataに「x」という名前の新しい列を作成しようとしても、既に座標名として使用されているため、作成できません。
ギジェルモオルメド14

私はまだ、SpatialPointsDataFrameオブジェクトが$演算子で座標にアクセスするためにどのような種類の「魔法」を使用するのかよくわかりません。しかし、少なくとも今はそれを使用することに慣れています。次のコードcolnames(locations@coords) <- c("easting","northing") を実行しました。実行後locations$easting、x座標ベクトルとlocations$northingy 座標ベクトルを取得します 。
jirikadlec2 14

何らかの方法で、Rは座標の2列をSpatialPointsDataFrameのデータフレーム部分のもう2列と見なします。あなたは@dataスロット内の同じ名前の列を持つことができる理由厥
ギジェルモオルメド

1
@coordsマトリックス内の列の命名はSpatialPointsDataFrameSpatialPointsDataFrameオブジェクトの作成方法に依存しているようです。方法1:coordinates(sdat) <- x ~ y列の名前をに変更します"coords.x1", "coords.x2"。方法2:マトリックスのsdat <- SpatialPointsDataFrame(xy, attributes)元の列名を保持しますxy
jirikadlec2 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.