如何在 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 方法是使用 reclassify
或 clamp
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
clamp
或 ifel
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
我正在使用 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 方法是使用 reclassify
或 clamp
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
clamp
或 ifel
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