我正在使用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。
帮助?
答案 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)})