累积和:处理R

时间:2018-11-20 12:50:07

标签: r raster na cumsum

我有一个多波段栅格,想要计算整个波段中每个像素的累积和。这些波段包含位于不同位置的NA像素,并且如果遇到像素中的NA值,则来自栅格数据包的calc中的cumsum函数会将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

1 个答案:

答案 0 :(得分:0)

使用@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)))

enter image description here

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

enter image description here