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

时间:2016-04-30 22:33:08

标签: r raster na

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

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

这是我从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。

帮助?

4 个答案:

答案 0 :(得分: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的另一个优点是您可以提供文件名参数。

答案 1 :(得分:9)

library(raster)

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

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

pb1[pb1 < 0] <- NA

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

另一个选择是

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