2017-05-15 7 views
0

私は、このような...どのようにグループの経度と緯度データ

lat=runif(1000, min = 22.1, max = 22.8) 
lon=runif(1000, min = 120, max = 120.6) 
latlon=cbind(lat,lon) 

として緯度と経度のデータを持っていると私はこれに基づいて、異なるゾーンにそれらを分類したい...

Zone=c("A","B","C","C","C","D","E","E","E") 
North=c(23,23,22.83,22.67,22.42,22.33,22.33,22.42,22.50) 
South=c(22.67,22.67,22.67,22.33,22.33,22.08,22.08,22.33,22.42) 
East=c(120,120.2,120.2,120.3,120.4,120.5,120.7,120.6,120.5) 
West=c(119.7,120,120.2,120,120.3,120.2,120.5,120.4,120.3) 
data.frame(cbind(Zone,North,South,East,West)) 
することができます

http://imgur.com/uj41h2k.jpg

私は5つの異なるゾーン(A、B、C、D、E) にlatlon私のGISデータを分離したいと私はbefor ifelseを使用しようとしましたe、それほど効率的ではないようです

とにかく私はもっと早く仕上げることができますか?

===================== 私はエイドリアン・マーティンの提案

newzone=case_when(lat >= zzz$South[1] & lat <= zzz$North[1] & lon <= zzz$East[1] & lon >= zzz$West[1]~ zzz$Zone[1], 
      lat >= zzz$South[2] & lat <= zzz$North[2] & lon <= zzz$East[2] & lon >= zzz$West[2]~ zzz$Zone[2], 
      lat >= zzz$South[3] & lat <= zzz$North[3] & lon <= zzz$East[3] & lon >= zzz$West[3]~ zzz$Zone[3], 
      lat >= zzz$South[4] & lat <= zzz$North[4] & lon <= zzz$East[4] & lon >= zzz$West[4]~ zzz$Zone[4], 
      lat >= zzz$South[5] & lat <= zzz$North[5] & lon <= zzz$East[5] & lon >= zzz$West[5]~ zzz$Zone[5], 
      lat >= zzz$South[6] & lat <= zzz$North[6] & lon <= zzz$East[6] & lon >= zzz$West[6]~ zzz$Zone[6], 
      lat >= zzz$South[7] & lat <= zzz$North[7] & lon <= zzz$East[7] & lon >= zzz$West[7]~ zzz$Zone[7], 
      lat >= zzz$South[8] & lat <= zzz$North[8] & lon <= zzz$East[8] & lon >= zzz$West[8]~ zzz$Zone[8], 
      lat >= zzz$South[9] & lat <= zzz$North[9] & lon <= zzz$East[9] & lon >= zzz$West[9]~ zzz$Zone[9]) 

に基づいて、新たなコードを書くには、私が作ることができとにかくがありますコードはもっとシンプル?ありがとう

+1

データの再現可能なサンプルを投稿できますか? –

+2

開発したコードを入力してください。これは、他の人がコードを改善するのを容易にします。 – www

+0

コードの画像を投稿しないでください。データを直接投稿することは困難ではありません。回答者にとってより簡単にするための方法のいくつかの良い例が見つかりました[ここ](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – r2evans

答えて

0

cut()(r2evansのコメントにリンクされている回答)は、等幅の5つのセクションにスライスしている場合、または一致する割合のベクトルがある場合に機能します。 ifelseを使用しようとしているように見える既存の緯度/経度座標と一致させる場合は、dplyrの関数case_when()を使用します。

library(dplyr) 
    latlon <- bind_cols(lat, lon) %>% 
     mutate(Zone = case_when(.$lat > 22.83 & .$lon > 120.2 ~ A, 
           .$lat > 22.42 & .$lon > 120.0 ~ B, 
           etc etc) 

case_whenはifelse-typeステートメントをdplyrチェーンに取得する方法です。それは、ifelse、私は信じて速く実行されます。

+0

あなたの答えをありがとう、マーティン –

+0

それがうまくいけば、質問への答えとしてそれを受け入れることができますか? –