How to Replace Raster Values Less than 0 to NA in R code

送分小仙女□ 提交于 2019-11-30 03:06:28

问题


I am working with Landsat imagery to calculate net radiation. There are very low negative values (ex: -0.000003) that are in my converted reflectance raster layers. I want to make sure that my reflectances are 0 - 1 in order to reduce error in my future calculations.

How can I replace raster values less than 0 to "NA" in R. Similar to a raster calc function. I'm unsure how to provide an example, but I'm certain one of you could help me, yes?

Here is my equation for the reflectivity derived from Bastiaanssen et al. (1998)

Assuming, the pb1 indicates the reflectance for band 1 of Landsat, pi = 3.14..., lb1 = radiance for band 1, ESUN = exoatmospheric value for band 1, dr = the relative earth sun distance for the day of year.

#Calculate reflectivity per band. QC: Always 0 to 1
pb1 = (pi * lb1)/(ESUN1 * cos(solzen) * dr)

After this raster is created, all I want to do is set the pb1 values that are less than 0 to NA.

Help?


回答1:


library(raster)

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

Or, as suggested by @jbaums:

pb1[pb1 < 0] <- NA

If you want to keep the original raster object, remember to assign the original raster to a new object name before running the code above.




回答2:


The memory-safe way to do this is to use reclassify

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

Note the right=FALSE to not set values of 0 to NA.

Another advantage of reclassify is that you can provide a filename argument.




回答3:


raster::clamp is an easy and flexible way to do this. One can set everything above and/or below threshold values to that threshold, or by setting useValues=FALSE then values above/below are set to NA. For example, lower values only:

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

upper values only:

x <- clamp(r, upper=6, useValues=FALSE)
values(x)
# [1]  1  2  3  4  5  6 NA NA NA

and both upper and lower values:

x <- clamp(r, lower=3, upper=6, useValues=FALSE)
values(x)
# [1] NA NA  3  4  5  6 NA NA NA

Note the difference if useValues=TRUE (the default):

x <- clamp(r, lower=3, upper=6)
values(x)
# [1] 3 3 3 4 5 6 6 6 6

Using raster_2.8-19 in this example.




回答4:


Another option is

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



来源:https://stackoverflow.com/questions/36960974/how-to-replace-raster-values-less-than-0-to-na-in-r-code

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!