2016-09-15 59 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,因此我不僅限於一種方法。

我已經嘗試了最近匹配的每個拉特和長,但它沒有區分網格的哪一側可供選擇。我通過關於牧師,rworldmap,rgdal和堆棧溢出的所有搜索組合的文檔來挖掘。

+0

你在尋找一個空間覆蓋?另外,是否可以通過''rworldmap''獲取相同的數據? –

+1

雖然我發佈的教程鏈接來自rworldmap編寫者,但我沒有在rworldmap文檔中看到關於內部氣候區域映射的任何內容。我能夠很容易地將兩者映射在一起,但不能提取類別。下面的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 

因此,合併兩個表,我們需要圓df的緯度和經度爲.25.75,例如通過

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

得到剩餘由一個劃分,即非整數部分,如果它是大於.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 

我們可以使用merge(或dplyr加入,如果您願意)爲Cls列添加到df匹配的緯度和經度:

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

'%/%'和'%%'給你一個長整數部分的答案:'%/%',稱爲整數或者整數除法,給你整數部分; '%%'給出餘數(也稱爲模),所以'7%/%3'返回2,'7 %% 3'返回1。 – alistaire