2016-09-15 8 views
2

私は場所のデータフレームを持っており、地図からカテゴリ変数(気候地域)に一致させたいと思っていました。Rグリッドデータのポイントのカテゴリを抽出します

df <- data.frame(lat = c(29.30050, 47.67309, 53.30710, -27.60303, 41.31858, 40.50738, 
         50.67013,60.23163, 42.54555), 
       long = c(47.806320, -122.315312, -6.281798, 151.951778, -72.849961, 
          -74.382711, 4.348718, 19.710874, -71.038764)) 

私はこのexcellent articleからデータを取得することを学んだ:ここでは小さな抜粋したものです。私がしたいことは、データフレームに設定された各ポイントのカテゴリ変数を抽出することです。これは簡単ではないかもしれませんが、私はマッピングが新しく、ヘルプ記事が見つかりません。問題は私が間違った言葉を使っていることかもしれません!

データセットのマッピングはチュートリアルでは非常に簡単ですが、グリッドマッチングは私の外にあります。カテゴリマップデータは、.txt、.kmz、またはGISフォーマットhereのいずれかで使用できるため、1つの方法に限定されません。

私は各latとlongの最近似一致を試しましたが、どちらから選択するかを区別することができません。私はpastor、rworldmap、rgdalに関するドキュメントと、スタックオーバーフローで見つけられるすべての検索の組み合わせを掘り下げました。

+0

空間オーバーレイをお探しですか?また、 '' rworldmap''を介して同じデータを取得できますか? –

+1

rworldmapの文書では、内部の気候領域のマッピングについては何も表示されませんでしたが、私が投稿したチュートリアルのリンクはrworldmapの作者からのものです。私は2つをお互いに簡単にマップすることができましたが、カテゴリを抽出することはできませんでした。下のalistaireの答えはそのトリックを行います。 –

答えて

3

サイトからデータをダウンロードしてkoeppenとして読んでください。

download.file('http://koeppen-geiger.vu-wien.ac.at/data/Koeppen-Geiger-ASCII.zip', 
       'Koeppen-Geiger-ASCII.zip', 
       method = 'curl') 

# use read.table if you like, but read_table cuts a lot of hassle with poor formatting 
koeppen <- readr::read_table('Koeppen-Geiger-ASCII.zip') 

、我々はデータを見て、すべての緯度と経度が不便.25または.75で終わる:

koeppen 
## # A tibble: 92,416 × 3 
##  Lat  Lon Cls 
##  <dbl> <dbl> <chr> 
## 1 -89.75 -179.75 EF 
## 2 -89.75 -179.25 EF 
## 3 -89.75 -178.75 EF 
## 4 -89.75 -178.25 EF 
## 5 -89.75 -177.75 EF 
## 6 -89.75 -177.25 EF 
## 7 -89.75 -176.75 EF 
## 8 -89.75 -176.25 EF 
## 9 -89.75 -175.75 EF 
## 10 -89.75 -175.25 EF 
## # ... with 92,406 more rows 

をこのように、2つのテーブルをマージする、我々はdfの緯度を丸める必要があり、経度は.25または.75で終わります。

df[] <- lapply(df, function(x){ifelse(x %% 1 > .5, 0.75, 0.25) + floor(x)}) 

することにより、非整数部分、すなわち1で割った余りを取得し、それを超える.5戻り.75をだならば、他の.25返し、その後、整数部分を付加再度、そうdf今のようになります。

df 
##  lat long 
## 1 29.25 47.75 
## 2 47.75 -122.25 
## 3 53.25 -6.25 
## 4 -27.75 151.75 
## 5 41.25 -72.75 
## 6 40.75 -74.25 
## 7 50.75 4.25 
## 8 60.25 19.75 
## 9 42.75 -71.25 

今緯度と経度を一致させるためのdfCls列を追加するために、我々はmergeを使用することができます(またはあなたが好む場合dplyrは、参加します)

df <- merge(df, koeppen, 
      by.x = c('lat', 'long'), 
      by.y = c('Lat', 'Lon'), 
      all.x = TRUE) 

# or dplyr::left_join(df, koeppen, by = c('lat' = 'Lat', 'long' = 'Lon')) 

df 
##  lat long Cls 
## 1 -27.75 151.75 Cfa 
## 2 29.25 47.75 BWh 
## 3 40.75 -74.25 Cfa 
## 4 41.25 -72.75 Cfa 
## 5 42.75 -71.25 Dfb 
## 6 47.75 -122.25 Csb 
## 7 50.75 4.25 Cfb 
## 8 53.25 -6.25 Cfb 
## 9 60.25 19.75 Dfb 

文法が気に入っている場合は、data.table's non-equi-joinsの場合にもこのような場合があります。

+0

これは私が必要としていたものです!私はちょうどround_any(df [、1]、0.25、floor)を使って作業していました。もちろん、私の問題が0.25と0.75でした。私はまだ%%修飾子を使用する方法を学んでいます。これはどのように動作するかを理解するのに役立ちます。本当にありがとう! –

+1

'%/%'と '%%'はあなたに長い分割解答の2つの部分を与えます:整数かフロア分割と呼ばれる '%/%'はあなたに全体の部分を与えます。 '%%'は余り(モジュロとも呼ばれます)を与えます。したがって、 '7%/%3'は2を返し、' 7 %% 3'は1を返します。 – alistaire

関連する問題