当在栅格包中使用calc()时,标准偏差函数在na.rm = TRUE时抛出错误

时间:2016-02-04 13:47:08

标签: r raster na calc

我试图使用栅格包中的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的栅格图层。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这是因为你的函数不接受参数na.rm。如果{fun'支持,calc的帮助文件会显示na.rm。以下功能解决了这个问题:

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个值尚未被删除,则无需检查相同条件的长度。