累积和:在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)))
我有一个多波段栅格,想要计算整个波段中每个像素的累积和。这些波段包括位于不同位置的 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
.
为了检查,我们将绘制它,您会看到 NA
消失了:
plot(is.na(r3),main=paste('Input',c(1:3)))
plot(is.na(r3c),main=paste('Cumsum',c(1:3)))