我试图使用栅格包中的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的栅格图层。有什么想法吗?
答案 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
个值尚未被删除,则无需检查相同条件的长度。