簡體   English   中英

在柵格數據包中使用calc()時,如果na.rm = TRUE,則標准偏差函數將引發錯誤

[英]standard deviation function throws error when na.rm=TRUE while using calc() in raster package

我試圖使用柵格數據包中的calc()函數從柵格磚對象計算一個簡單的標准差函數。 我缺少值,希望將它們排除在外。 我認為我應該能夠通過包含na.rm = TRUE參數來排除它們,但是當我這樣做時會收到錯誤消息:

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) :
cannot use this function. Perhaps add '...' or 'na.rm' to the function arguments? 

下面,我創建了一個簡單的示例進行演示(注意:由於內置的​​sd函數用於樣本標准差,因此我為總體編寫了自己的標准差函數。但是,它會引發相同的錯誤)

r <- raster(nrow=10, ncol=10)
r1 <- setValues(r, 5)
r2 <- setValues(r, 10)
r3 <- setValues(r, 11)
r4 <- setValues(r, NA)
s <- stack(r1, r2,r3,r4)

pop.sd=function(x)(sqrt(var(x)*(length(x)-1)/length(x)))

stdv<-calc(s, fun=pop.sd, na.rm=T)

應返回一個充滿2.624的柵格圖層。 有什么想法嗎?

這是因為您的函數沒有采用參數na.rm calc的幫助文件顯示“ na.rm如果得到“ fun”的支持)。 以下功能可解決此問題:

pop.sd=function(x, na.rm){
  v = var(x,na.rm = na.rm)
  l = if(na.rm) sum(!is.na(x)) else length(x)
  sqrt(v*(l-1)/l)
}

stdv<-calc(s, fun=pop.sd, na.rm=TRUE)

if語句可確保所使用的x的長度對於調整而言是正確的,並且還會去除NA值。

您還可以使用...表示法將其他參數傳遞給函數。 所以你可以

pop.sd=function(x, ...){
  v = var(x,...)
  l = sum(!is.na(x))
  sqrt(v*(l-1)/l)
}

在這種情況下,由於var如果沒有刪除NA值,則返回NA ,因此不必檢查相同的長度條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM