web-dev-qa-db-fra.com

Comment remplacer les valeurs raster inférieures à 0 par NA dans le code R

Je travaille avec l'imagerie Landsat pour calculer le rayonnement net. Il y a des valeurs négatives très faibles (ex: -0.000003) qui se trouvent dans mes couches raster de réflectance converties. Je veux m'assurer que mes réflectances sont de 0 à 1 afin de réduire les erreurs dans mes futurs calculs.

Comment puis-je remplacer les valeurs raster inférieures à 0 par "NA" dans R. Similaire à une fonction de calcul raster. Je ne sais pas comment donner un exemple, mais je suis certain que l'un d'entre vous pourrait m'aider, oui?

Voici mon équation pour la réflectivité dérivée de Bastiaanssen et al. (1998)

En supposant que le pb1 indique la réflectance pour la bande 1 de Landsat, pi = 3,14 ..., lb1 = rayonnement pour la bande 1, ESUN = valeur exoatmosphérique pour la bande 1, dr = la distance relative de la Terre au soleil pour le jour de l'année.

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

Une fois ce raster créé, tout ce que je veux faire, c'est définir les valeurs pb1 inférieures à 0 sur NA.

Aidez-moi?

9
MaeAntoinette
library(raster)

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

Ou, comme suggéré par @jbaums:

pb1[pb1 < 0] <- NA

Si vous souhaitez conserver l'objet raster d'origine, n'oubliez pas d'affecter le raster d'origine à un nouveau nom d'objet avant d'exécuter le code ci-dessus.

13
eipi10

Pour ce faire, la méthode sans danger pour la mémoire consiste à utiliser reclassify

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

Noter la right=FALSE pour ne pas définir des valeurs de 0 à NA.

Un autre avantage de reclassify est que vous pouvez fournir un argument de nom de fichier.

18
Robert Hijmans

raster::clamp est un moyen simple et flexible de le faire. On peut tout régler au-dessus et/ou en dessous des valeurs de seuil à ce seuil, ou en définissant useValues=FALSE puis les valeurs au-dessus/en dessous sont définies sur NA. Par exemple, des valeurs inférieures uniquement:

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

valeurs supérieures uniquement:

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

et les valeurs supérieures et inférieures:

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

Notez la différence si useValues=TRUE (le défaut):

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

En utilisant raster_2.8-19 dans cet exemple.

3
Andy Barbour