2014-04-29 88 views
0

我在R中具有1km分辨率柵格,並且在整個範圍內具有廣泛的NA值,但是在不規則位置(即具有數據的單元不是連續的並且具有分散的NA值)。我試圖用一個用戶定義的函數來平均圓角(如下所示),以5km分辨率(factor = 5)聚合這個柵格(在{raster}包中使用aggregate()命令)。到目前爲止,我不知道如何獲取aggregate()(或者我的函數,如果這是問題),除非柵格具有連續的5x5單元區域,否則不能提供結果值。換句話說,如果聚合窗口只有5個帶有數據值的單元(20個NA單元)碰到5×5單元區域,我仍然希望它返回這2個單元的平均值。我試着修改函數和aggregate()命令的na.action選項,但沒有運氣。我對功能沒有超級經驗,所以問題可能在那裏。具有NA值的R中的聚合柵格

對不起,沒有工作的例子,但不知道如何在R

這是我的圓形平均函數產生一個類似的例子光柵層:

library(circular) 
avg.ang <- function(x,...){ 
    mean.circular(circular(x, units="degrees", rotation="clock", zero=pi/2, modulo="2pi")) 
} 

而且這裏是我使用的總碼(其中「角」是1公里光柵在整個散射NA值):

library(raster) 
angle5k <- aggregate(angle, fact=5, fun=avg.ang, expand=T) 

但這返回一個光柵層,僅在聚集的位置wher的值e 5x5窗口的每個單元格都包含一個值。

+1

您需要(至少)在調用'mean.circular()'時設置'na.rm = TRUE'。 –

+1

是的,這樣做的伎倆,與一個更小的if/else修改來處理所有單元格= NA時發生的錯誤。將在下面發佈修改後的功能。謝謝! –

回答

1

感謝喬希的指導。這裏是修改的功能,產生我在找什麼:

avg.ang <- function(x, ...){ 
    if (sum(is.na(x))==length(x)) { 
     NA 
    } else { 
     round(mean.circular(circular(x, units="degrees", rotation="clock", 
            zero=pi/2, modulo="2pi"), na.rm=TRUE)) 
    } 
} 

na.rm=TRUE是關鍵。 if/else語句用於處理所有單元格= NA的情況(否則會因錯誤而中斷)。如果任何人有一個更加優雅的方式來處理if/else,我就會全神貫注。

+1

太好了。在第二行中,你可以用'all(is.na(x))' –

+0

來測試這個條件,這很好。用這個函數操縱什麼樣的變量? –

+0

@Paulo我在羅盤軸承(因此爲零,旋轉和模數選項)上進行了圓角度測量(0-360°,因此爲單位選項),我需要在光柵1km分辨率的較寬區域上進行平均。該應用程序用於氣候變化遷移估算。 –