如何在 R 代码中将小于 0 的栅格值替换为 NA

How to Replace Raster Values Less than 0 to NA in R code

我正在使用 Landsat 图像计算净辐射。 在我转换的反射栅格图层中有非常低的负值(例如:-0.000003)。我想确保我的反射率为 0 - 1,以减少我未来计算中的错误。

如何在 R 中将小于 0 的栅格值替换为 "NA"。类似于栅格计算函数。我不确定如何提供示例,但我确定你们中的一个可以帮助我,是吗?

这是我从 Bastiaanssen 等人得出的反射率方程。 (1998)

假设,pb1 表示 Landsat 波段 1 的反射率,pi = 3.14...,lb1 = 波段 1 的辐射率,ESUN = 波段 1 的大气层外值,dr = 当天地球与太阳的相对距离年。

#Calculate reflectivity per band. QC: Always 0 to 1
pb1 = (pi * lb1)/(ESUN1 * cos(solzen) * dr)

创建此栅格后,我要做的就是将小于 0 的 pb1 值设置为 NA。

帮忙?

library(raster)

values(pb1)[values(pb1) < 0] = NA

或者,按照@jbaums 的建议:

pb1[pb1 < 0] <- NA

如果你想保留原来的光栅对象,记得在运行上面的代码之前给原始光栅分配一个新的对象名称。

对于 raster 包,memory-safe 方法是使用 reclassifyclamp

library(raster)
r <- raster(ncol=10, nrow=10)
values(r) <- rnorm(100)
x <- clamp(r, useValues=FALSE)
y <- reclassify(r, cbind(-Inf, 0, NA), right=FALSE)

注意 right=FALSE 不将零单元格设置为 NA

这些方法是memory-safe,你也可以提供一个文件名参数,这样你就不需要在之后调用writeRaster

另一种选择是

pb1 <- raster::calc(pb1, function(x){x[x<0]<-NA; return(x)})

raster::clamp 是一种简单灵活的方法。可以将高于 and/or 低于阈值的所有内容设置为该阈值,或者通过设置 useValues=FALSE 然后将值 above/below 设置为 NA。例如,仅较低的值:

r <- raster(ncol=3, nrow=3)
values(r) <- seq_len(9)
x <- clamp(r, lower=3, useValues=FALSE)
values(x)
# [1] NA NA  3  4  5  6  7  8  9

仅限上限值:

x <- clamp(r, upper=6, useValues=FALSE)
values(x)
# [1]  1  2  3  4  5  6 NA NA NA

以及上限值和下限值:

x <- clamp(r, lower=3, upper=6, useValues=FALSE)
values(x)
# [1] NA NA  3  4  5  6 NA NA NA

注意区别 useValues=TRUE(默认值):

x <- clamp(r, lower=3, upper=6)
values(x)
# [1] 3 3 3 4 5 6 6 6 6

在此示例中使用 raster_2.8-19

对于 terra 包,memory-safe 方法是使用 classify clampifel

library(terra)
r <- rast(ncol=10, nrow=10)
values(r) <- rnorm(100)
x <- clamp(r, 0, values=FALSE)
y <- classify(r, cbind(-Inf, 0, NA), right=FALSE)
z <- ifel(r < 0, NA, r)

这些方法是memory-safe,你也可以提供一个文件名参数,这样你就不需要在之后调用writeRaster

您可以使用 app 但这有点笨拙且效率低得多

a <- app(r, function(x) { x[x<0] <- NA; x })

像这样的方法非常适合用小数据集进行交互式探索,但它们通常不应用于“生产”代码。

r[r < 0] <- NA