累积和:在R中处理栅格数据中的NA像素

Cumulative sum: deal with NA pixel in raster data in R

我有一个多波段栅格,想要计算整个波段中每个像素的累积和。这些波段包括位于不同位置的 NA 像素,如果 raster 包中的 calc 中的 cumsum 函数在像素中遇到 NA 值,则会在后续波段中写入 NA。最后,最后一个累积和带中只剩下 NA 个像素。 我将 NA 更改为零,但这会导致对值的低估。

是否可以将初步值用于NA?或者甚至是初步值和后续值的平均值?

library(raster)
raster <- stack("inputPath")
cumulative_sum <- calc(raster, cumsum)

这是我的意思的一个例子

input band 1
1    4    7
NA   5    8
3    6   NA

input band 2
2   NA   NA
3    6    9
4    7   10

input band 3
1    4    7
2    5    8
3    6    9

result with calc and cumsum
4    NA   NA
NA   16   25
10   19   NA


desired output (last resulting band <- band1 + band2+ band3)
4    12   21
5    16   25
10   19   19

根据@Niek 的建议,你可以这样实现:

library(raster)
library(zoo)

# Generate example data

set.seed(42)
r <- raster(ncols=3,nrows=3)

r3 <- do.call(stack,replicate(3,setValues(r,sample(c(runif(ncell(r)),NA),ncell(r),replace = T))))

f <- function(ii){

  if(is.na(ii[1])) ii[1] <- 0

  cumsum(na.locf(ii))

}

r3c <- calc(r3,fun = f)

如您所见,第 1 层中的任何 NA 值都设置为 0,因为没有可结转的值。您也可以在 calc 之前执行此操作,并从 f.

中删除 if 子句

为了检查,我们将绘制它,您会看到 NA 消失了:

plot(is.na(r3),main=paste('Input',c(1:3)))

plot(is.na(r3c),main=paste('Cumsum',c(1:3)))