我生成了一个堆栈“class.stack”,其中包含 175 个栅格。每个栅格中的每个像元可以是四个类别之一(用整数 0-3 表示)或 NA。 NA 应出现在所有 175 个栅格中完全相同的位置,因为它代表未采样的特定区域。
我正在尝试从此堆栈中计算单个栅格,其中如果类 0 是多数类,则使用类 0,否则采用 1-3 的(整数)平均值。 我首先编写了下面的函数来与“calc”一起使用:
class.cond <- function(x){
if (sum(x == 0) > sum(x != 0)) {0}
else {round(mean(x != 0)}}
我了解到这不起作用,因为“calc”在数据“块”中工作,因此它不会按预期解决。 接下来,我尝试使用以下代码使用堆栈中每个类类型的计数来制作单独的栅格:
count.zero <- calc(class.stack, na.rm=TRUE, fun=function(x){sum(x == 0)})
对于剩下的每个班级,依此类推。这给出了以下错误:
.calcTest(x[1:5]、fun、na.rm、forcefun、forceapply) 中的错误: 无法使用该功能。也许在函数参数中添加“...”或“na.rm”?
我尝试通过省略 NA 来解决此问题,如下所示:
count.zero <- calc(class.stack, na.rm=TRUE, fun=function(x){
y <- as.numeric(na.omit(x))
sum(y == 0)})
这给出了同样的错误。我哪里错了? 如果我在包含相同类型信息的向量上运行它,它就会起作用。
test.vec <- c(NA, NA, 0, 0, 1, 2, 2, 3, 0, NA, 0, 1, 2)
mod.vec <- as.numeric(na.omit(test.vec))
print(mod.vec)
[1] 0 0 1 2 2 3 0 0 1 2
print(sum(mod.vec == 0))
[1] 4
print(sum(mod.vec == 2))
[1] 3
我想,我实际上只需将 na.rm 参数传递给函数即可。我什至没有在函数中对它做任何事情,它现在就可以工作了。
count.zero <- calc(class.stack, na.rm=TRUE, fun=function(x, na.rm){sum(x == 0)})