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

18

我正在使用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。
帮忙吗?
5个回答

37

使用raster包,实现内存安全的方法是使用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

这些方法是内存安全的,您还可以提供一个文件名参数,以便您不需要之后调用writeRaster


罗布,我不明白... right 不应该是 TRUE 才能将 0 设为 NA 吗?r <- raster(nrows=1, ncols=3) r[] <- c(-1, 0, 1) reclassify(r, cbind(-Inf, 0, NA), right=TRUE) - Matifou
1
是的,没错。但这与我所说的一致。“right=FALSE”表示“不”将0的值设置为NA,以便我们执行“< 0”,而不是“<= 0”。 - Robert Hijmans

30
library(raster)

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

或者,如@jbaums所建议的:

pb1[pb1 < 0] <- NA
如果您想保留原始光栅对象,请在运行上述代码之前将原始光栅分配给一个新的对象名称。

感谢您的快速回复。不过我的新光栅完全被分类为NA。 - MaeAntoinette
pb1c = (values(pb1)[values(pb1) < 0] = NA)
pb1c [1] NA
- MaeAntoinette
我不需要重命名吗?(例如:pb1c,其中c表示“已更正”)? - MaeAntoinette
或者只需使用pb1[pb1 < 0] <- NA。(并且@MaeAntoinette,这将修改原始的pb1。如果您想保留原始副本,那么可以这样做,例如,pb1c <- pb1; pb1c[pb1c < 0] <- NA)。 - jbaums
哦天啊!非常感谢你们两个。这个方法可行 @jbaums,太好了! - MaeAntoinette

8

raster::clamp 是对此的一种简单而灵活的方法。可以将超过和/或低于阈值的所有内容设为该阈值,或者通过设置useValues=FALSE,则高于或低于阈值的值将被设为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


我不知道这个选项。谢谢分享! - MaeAntoinette

5

使用terra包,实现内存安全的方法是使用classifyclampifel

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)

这些方法是内存安全的,您还可以提供文件名参数,以便无需在之后调用writeRaster

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

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

这种方法适合在小型数据集上进行交互式探索,但通常不应在“生产”代码中使用。

r[r < 0] <- NA 

0

另一个选项是

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接