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

问题描述 投票:7回答:4

我正在使用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。

救命?

r raster na
4个回答
9
投票
library(raster)

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

或者,正如@jbaums所建议的那样:

pb1[pb1 < 0] <- NA

如果要保留原始栅格对象,请记住在运行上述代码之前将原始栅格指定给新对象名称。


15
投票

执行此操作的内存安全方法是使用reclassify

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

请注意right=FALSE不设置0到NA的值。

reclassify的另一个优点是您可以提供文件名参数。


2
投票

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


0
投票

另一种选择是

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

© www.soinside.com 2019 - 2024. All rights reserved.