最近傍を使用してギャップを埋めます


8

最近傍の平均値を使用してNA値を入力します。

r <- raster(matrix(1:16, nrow=8, ncol=8))
r[r==12] <- NA

回答:


14

NA値は、foal関数を使用してna.rm引数をFALSEに設定し、パッドをTRUEに設定して入力できます。

library(raster)
  r <- raster(matrix(1:16, nrow=8, ncol=8))
  r[r==12] <- NA

NAの場合、焦点値を3x3ウィンドウの平均に置き換える関数。ウィンドウサイズが大きくなると、インデックス値[i]も変更する必要があります(たとえば、5x5ウィンドウの場合、インデックスは13になります)。

fill.na <- function(x, i=5) {
  if( is.na(x)[i] ) {
    return( round(mean(x, na.rm=TRUE),0) )
  } else {
    return( round(x[i],0) )
  }
}  

fill.na関数をraster :: focalに渡し、結果を確認します。pad引数は、NA値の仮想行/列を作成して、ラスターのエッジに沿ってベクトルの長さを一定に保ちます。これが、ベクトルの5番目の値が常に3x3ウィンドウの焦点値であると期待できる理由です。したがって、fill.na関数のインデックスi = 5です。

r2 <- focal(r, w = matrix(1,3,3), fun = fill.na, 
            pad = TRUE, na.rm = FALSE )

as.matrix(r)
as.matrix(r2)

おかげで、この関数は3 x 3ピクセルごとの平均を取り、ラスター全体を平滑化すると思います。NAセルのみの隙間を埋めたい。
Geo-sp

はい。ただし、NA値のみを置き換える独自の関数を作成できます。この場合、na.rmはFALSEになります。これが楽しい議論の目的です。
Jeffrey Evans、

答えてくれてありがとう!これをラスタースタックに適用する方法を知っていますか?スタックの各レイヤーに使いたい。ありがとう!
Geo-sp

forループとインデックスを使用してスタックを反復処理し、スタック内の各ラスターを置き換える(たとえば、r [[1]] <-my.function(r [[1]]))か、または塗りつぶされたラスターごとに新しいスタック。
Jeffrey Evans、

1
Rでこれを実行する場合は、すべてのギャップを埋めるために複数のパスを実行する必要がある可能性があります。ただし、これは、大きなデータの欠落を表す領域を埋めるための非常に満足のいく答えではありません。補間アプローチは確かにより良い結果を生み出します。Rで特定のモデルをコーディングしないと、すぐに使用できるソリューションはありません。SAGA GISには、補間に基づくnodata充填ルーチンがあります。
Jeffrey Evans
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.