【发布时间】:2014-05-28 11:06:58
【问题描述】:
我正在尝试开发一个函数来“同步”光栅堆栈各层之间的 NA,即确保对于堆栈的任何给定像素,如果一个图层具有 NA,则所有图层都应设置为 NA对于那个像素。
这在组合来自不同来源的栅格以进行物种分布建模时特别有用,因为某些模型无法正确处理 NA。
我找到了两种方法来做到这一点,但我发现它们都不令人满意。其中之一需要使用函数getValues,因此不适用于非常大的堆栈或内存不足的计算机。另一个更安全,但速度要慢得多。因此,我在这里问是否有人有改进我的尝试的想法?
这里有两种可能性:
-
使用 getValues()
syncNA1 <- function (x) { val <- getValues(x) NA.pos <- unique(which(is.na(val), arr.ind = T)[, 1]) val[NA.pos, ] <- NA x <- setValues(x, val) return(x) } -
使用 calc()
syncNA2 <- function(y) { calc(y, na.rm = T, fun = function(x, na.rm = na.rm) { if(any(is.na(x))) { rep(NA, length(x)) } else { x } }) }
现在演示它们各自对同一堆栈的计算时间:
> system.time(
+ b1 <- syncNA1(a1)
+ )
user system elapsed
3.04 0.15 3.20
> system.time(
+ b2 <- syncNA2(a1)
+ )
user system elapsed
5.89 0.19 6.08
非常感谢您的帮助,
鲍里斯
【问题讨论】: