Rでデータフレームを組み合わせるのに(再び)問題があります。しかし今回は、1つはSpatialPolygonDataFrame(SPDF
)で、もう1つは通常のdata.frame(DF
)です。 SPDF
には約1000行ありDF
には400行しかありません。どちらにも共通の列QDGCがあります
今、私は試しました
oo <- merge(SPDF,DF, by="QDGC", all=T)
ただし、これは通常のdata.frameのみになり、空間ポリゴンデータフレームにはなりません。私はどこかでこれが機能しないことを読みましたが、そのような場合に何をすべきか理解していませんでした(ID列で何かをしなければならない、マージ使用)
ああ、そのような難しい質問、私は質問します...
ありがとう!イェンス
Df =データフレーム、sp =空間ポリゴンオブジェクト、by =共通列の名前または列番号とします。次に、次のコード行を使用して、データフレームをspオブジェクトにマージできます。
sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])
コードの仕組みは次のとおりです。内部のmatch関数は、順序が保持されるように列を整列します。したがって、sp @ dataとマージすると、順序は正しく保持されます。コードが機能したかどうかを確認する簡単なチェックは、共通の列に対応する2つの列を調べて、それらが同一であるかどうかを確認することです(共通の列は重複し、コピーを簡単に削除できますが、そのまま保持します良いチェック)
これと同じくらい簡単です:
require(sp) # the trick is that this package must be loaded!
oo <- merge(SPDF,DF, by="QDGC")
私は自分でテストしました。ただし、 パッケージspからマージ を使用する場合にのみ機能します。これは、sp
パッケージがロードされたときのデフォルトです。次に、merge
関数がオーバーロードされ、sp::merge
は、最初の引数が空間構造である場合に使用されます。
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
多分関数joinCountryData2Map
rworldmap パッケージはインスピレーションを与えることができます。 (しかし、前回のように、私は間違っているかもしれません。)
もう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と呼ばれるのは少し残念です。ここでは、join
やmerge
のようなものが必要です。
その事実を無視すると、関数は、結合が正しいことを確認し、結合の片側にのみ行が存在する場合に非常に役立ちます。ドキュメントから:
アンダーカバレッジ(データレコードに対応しないシェイプアイテム)、オーバーカバレッジ(それぞれシェイプアイテムに対応しないデータレコード)、および重複したキー値の存在が自動的にチェックされ、コンソールメッセージを介して報告されます。
under_coverage
およびover_coverage
を使用すると、最後のappend_data呼び出しからのカバレッジ不足およびカバレッジ超過のキー値を取得できます。