web-dev-qa-db-ja.com

Rコードで0未満のラスター値をNAに置き換える方法

Landsat画像を使用して正味放射線を計算しています。変換された反射ラスターレイヤーに非常に低い負の値(例:-0.000003)があります。今後の計算でのエラーを減らすために、反射率が0〜1であることを確認したいと思います。

Rで0未満のラスター値を「NA」に置き換えるにはどうすればよいですか。ラスター計算関数に似ています。例を提供する方法はわかりませんが、あなたの1人が私を助けることができると確信していますよね?

バスティアンアンセンらから得られた反射率の方程式は次のとおりです。 (1998)

仮定すると、pb1はランドサットのバンド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に設定するだけです。

助けて?

9
MaeAntoinette
library(raster)

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

または、@ jbaumsによって提案されたように:

pb1[pb1 < 0] <- NA

元のラスターオブジェクトを保持する場合は、上記のコードを実行する前に、元のラスターを新しいオブジェクト名に割り当ててください。

13
eipi10

これを行うメモリセーフな方法は、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つの利点は、ファイル名の引数を指定できることです。

18
Robert Hijmans

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
Andy Barbour