Rを使用してポイントをグリッドに集約する


14

Rの空間集約に関して質問があります。私がやろうとしているのは、ポイントデータセットをグリッドに集約することです。しかし、この種の経験はほとんどないため、これをどのように行うかはわかりません。私はあなたの誰かがいくつかの有用なガイダンス/可能な解決策を持っていることを望んでいました。

私の有利な点は、アフリカの紛争イベントに関する地理参照データを含むデータセットです(www.acleddata.comを参照)。ポイントは緯度/経度座標でジオリファレンスされ、イベントタイプと時間に関するデータが含まれます。私がやりたいのは、これらのポイントを1x1度のグリッドに集約することです。

したがって、グリッドセル内でイベントが発生した場合、グリッドセルにはデータポイントの情報が含まれている必要があります。この最終結果は、データフレームまたはデータを統計分析用のパネルデータセットで使用することを目的としているため、csvファイルにエクスポートできるものでなければなりません。

これまでのところ、以下のコードを使用してデータとシェープファイルを読み込んでプロットしました。spパッケージのover関数を使用して集計する必要があると思いますが、方法はわかりません。あなたの一人が助けてくれることを願っています。

これまでに使用したコードは、対応する視覚的な結果とともにここにあります。

QGISでこれを行うための提案も歓迎します。


これは、少しの算術演算を必要とするだけの高速で単純な操作です。しかし、どの形式で出力したいのでしょうか?「CSV」はリレーショナルテーブルであることを示唆しているだけですが、これには問題があります。集約すると、各セルがさまざまな数のポイントに対応する可能性があります。通常、2つのオプションのいずれかを選択します。ポイントごとに1つのレコード(含まれるセルのIDを含む)を出力するか、セルごとに1つのレコードを出力して、含まれるポイントの統計要約を含めます。どちらが必要ですか?
whuber

1
申し訳ありませんが、指定しませんでした。必要なのは、セルごとに1つのレコードです。csvファイルを使用して、セル年形式でパネルデータを作成します。
馬の

回答:


12

ダウンロードされたデータには、率直なロケーションエラーが含まれているため、最初に行うべきことは、座標を適切な値に制限することです。

data.df <- read.csv("f:/temp/All_Africa_1997-2011.csv", header=TRUE, sep=",",row.names=NULL)
data.df <- subset(data.df, subset=(LONGITUDE >= -180 & LATITUDE >= -90))

グリッドセルの座標と識別子の計算は、緯度と経度の値から小数を切り捨てるだけです。(より一般的には、任意のラスターの場合、最初にそれらを中央に配置して単位セルサイズに縮小し、小数点以下を切り捨ててから、以下のコードに示すように元の位置に再拡大縮小しjiます。)これらの座標を一意の識別子に組み合わせて、入力データフレームに添付し、CSVファイルとして拡張データフレームを書き出します。ポイントごとに1つのレコードがあります。

ji <- function(xy, origin=c(0,0), cellsize=c(1,1)) {
  t(apply(xy, 1, function(z) cellsize/2+origin+cellsize*(floor((z - origin)/cellsize))))
}
JI <- ji(cbind(data.df$LONGITUDE, data.df$LATITUDE))
data.df$X <- JI[, 1]
data.df$Y <- JI[, 2]
data.df$Cell <- paste(data.df$X, data.df$Y)

代わりに、各グリッドセル内のイベントを要約した出力が必要な場合があります。これを説明するために、セルごとのカウントを計算し、セルごとに1レコードを出力します。

counts <- by(data.df, data.df$Cell, function(d) c(d$X[1], d$Y[1], nrow(d)))
counts.m <- matrix(unlist(counts), nrow=3)
rownames(counts.m) <- c("X", "Y", "Count")
write.csv(as.data.frame(t(counts.m)), "f:/temp/grid.csv")

他の要約についてfunctionは、の計算で引数を変更しますcounts。(または、スプレッドシートまたはデータベースソフトウェアを使用して、セル識別子で最初の出力ファイルを要約します。)

チェックとして、グリッドの中心を使用してカウントをマップし、マップシンボルを見つけましょう。(地中海、ヨーロッパ、大西洋に位置する地点には疑わしい場所があります。それらの多くは、データ入力プロセスで緯度と経度を混同した結果であると思われます。)

count.max <- max(counts.m["Count",])
colors = sapply(counts.m["Count",], function(n) hsv(sqrt(n/count.max), .7, .7, .5))
plot(counts.m["X",] + 1/2, counts.m["Y",] + 1/2, cex=sqrt(counts.m["Count",]/100),
     pch = 19, col=colors,
     xlab="Longitude of cell center", ylab="Latitude of cell center",
     main="Event counts within one-degree grid cells")

アフリカ地図

このワークフローは今

  • Rコード自体により)完全に文書化され、

  • 再現可能(このコードを再実行)、

  • 拡張可能(明らかな方法でコードを変更することにより)

  • かなり高速です(これらの53052の観測値を処理するのに10秒未満かかります)。


コードは完全に再現可能です。ただし、もう1つ質問があります。概要の代わりに、入力データファイルの情報を作成したグリッドのセルに添付するにはどうすればよいですか?
馬の

1
セルの完全な情報は可変長であるため、出力テーブルではできません。これを記録する適切な方法は、私が展示した最初の形式の出力です。セル識別子属性を持つポイントごとに1つのレコードです。これらの2つの形式の1つ(ポイントごとのテーブルとセルごとのテーブル)は、使用している統計プログラムによって期待されます。
whuber

1
わかった 意味がわかります。すべてのセルのグリッドを作成してマージするだけです。助けてくれてありがとう。
馬の

3

必要なのは、「空間結合」と呼ばれる基本的なものです。これは、2つのシェープファイルを相互に一致させ、結果の属性テーブルに合計(カウント数)を割り当てます。「Spatial Join in R」を検索すると、GIS.Stackexchangeでも多くの例が見つかります。私はすぐにグーグルで検索して、たとえばこのコードがメーリングリストに投稿されているのを見つけました。

QGISで空間属性結合を実現するには、次の手順を実行します。

  • .shpのファイル(コマンドとしてあなた形状保存writeOGR rgdalパッケージから)
  • それらをQGISにロードします。適切なスケーリングでMMQGISプラグイン(作成->グリッドレイヤーの作成)を使用してベクターグリッドを再作成します。
  • [ベクター]-> [データ管理]メニューの[属性の結合]ツールを使用します。ポイントレイヤーの属性を選択します(これは、さまざまな競合イベントのTRUE(1)またはFALSE(0)の値を表す単純な列です)。
  • グリッドを選択し、すべての出現を合計して実行します。その後、私はあなたのグリッドをアフリカ大陸の形でクリップします。

Joinが何らかの理由で失敗する場合(毎回うまくいかない場合)、SEXTANTEに固執し、SAGAツールボックスを探します。SAGAツールボックスには、非常に優れた結合機能もあります。


これは解決策ですが、グリッドへのポイントの要約はいくつかの単純な算術演算の問題であり、R優れているため、特に複雑で非効率的なものです。シェープファイル、rgdalQGIS、およびSextanteを使用することは、誰かが2つのボードを一緒に釘付けにするために、現代の自動化された産業プラントを借りることを推奨するようなものです:-)。
whuber

私はこの週末にこのアプローチを試みます。近い将来、さまざまなシェープファイルを互いに組み合わせて、これが役立つようにしたいと考えています。入力と提案をありがとう。
馬の

@whuber:それは本当ですが、出力を配布してスタイルを設定したい場合は、シェープファイルが当然の選択です。それにもかかわらず、素晴らしいRの例!
カーレウ

やっと試してみました。しかし、このアプローチの問題は、すべての観測値を合計してポリゴンにすることです。理想的には、時間の経過とともにさまざまなイベントに関する情報を保持したいと考えています。しかし、それは私が何か間違ったことをした可能性があります。
13
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.