web-dev-qa-db-ja.com

単純なdata.frameをRのSpatialPolygonDataFrameにアタッチする方法は?

Rでデータフレームを組み合わせるのに(再び)問題があります。しかし今回は、1つはSpatialPolygonDataFrame(SPDF)で、もう1つは通常のdata.frame(DF)です。 SPDFには約1000行ありDFには400行しかありません。どちらにも共通の列QDGCがあります

今、私は試しました

oo <- merge(SPDF,DF, by="QDGC", all=T)

ただし、これは通常のdata.frameのみになり、空間ポリゴンデータフレームにはなりません。私はどこかでこれが機能しないことを読みましたが、そのような場合に何をすべきか理解していませんでした(ID列で何かをしなければならない、マージ使用)

ああ、そのような難しい質問、私は質問します...

ありがとう!イェンス

35
Jens

Df =データフレーム、sp =空間ポリゴンオブジェクト、by =共通列の名前または列番号とします。次に、次のコード行を使用して、データフレームをspオブジェクトにマージできます。

sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])

コードの仕組みは次のとおりです。内部のmatch関数は、順序が保持されるように列を整列します。したがって、sp @ dataとマージすると、順序は正しく保持されます。コードが機能したかどうかを確認する簡単なチェックは、共通の列に対応する2つの列を調べて、それらが同一であるかどうかを確認することです(共通の列は重複し、コピーを簡単に削除できますが、そのまま保持します良いチェック)

45
Ramnath

これと同じくらい簡単です:

require(sp) # the trick is that this package must be loaded!

oo <- merge(SPDF,DF, by="QDGC")

私は自分でテストしました。ただし、 パッケージspからマージ を使用する場合にのみ機能します。これは、spパッケージがロードされたときのデフォルトです。次に、merge関数がオーバーロードされ、sp::mergeは、最初の引数が空間構造である場合に使用されます。

18
TMS

2つのデータフレームの単純な1-1マッピングがない場合、マージは元の行よりも多くの行を持つデータフレームを生成できます。その場合、すべてのジオメトリをコピーして複数のポリゴンを作成する必要がありますが、これはおそらく良いことではありません。

SpatialPointsDataFrameと同じ行数のデータフレームがある場合は、@ dataスロットを直接置き換えることができます。

library(sp)
example(overlay) # to get the srdf object
srdf@data
spplot(srdf)
srdf@data=data.frame(x=runif(3),xx=rep(0,3))
spplot(srdf)

行数を間違えた場合:

srdf@data=data.frame(x=runif(2),xx=rep(0,2))
spplot(srdf)
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 3, 2
6
Spacedman

多分関数joinCountryData2Maprworldmap パッケージはインスピレーションを与えることができます。 (しかし、前回のように、私は間違っているかもしれません。)

2
Karsten W.

もう1つの解決策は、 tmaptools パッケージのappend_data関数を使用することです。これらの引数で呼び出されます。

append_data(shp, data, key.shp = NULL, key.data = NULL,
  ignore.duplicates = FALSE, ignore.na = FALSE,
  fixed.order = is.null(key.data) && is.null(key.shp))

rbindの意味でappendを理解しているので、appendと呼ばれるのは少し残念です。ここでは、joinmergeのようなものが必要です。

その事実を無視すると、関数は、結合が正しいことを確認し、結合の片側にのみ行が存在する場合に非常に役立ちます。ドキュメントから:

アンダーカバレッジ(データレコードに対応しないシェイプアイテム)、オーバーカバレッジ(それぞれシェイプアイテムに対応しないデータレコード)、および重複したキー値の存在が自動的にチェックされ、コンソールメッセージを介して報告されます。 under_coverageおよびover_coverageを使用すると、最後のappend_data呼び出しからのカバレッジ不足およびカバレッジ超過のキー値を取得できます。

0
radek