-1

2012 年 9 月 17 日更新

これは、私の問題を再現する自己完結型データを使用したコードです。

心に留めておいてください、私が持っている実際のデータの次元は巨大です...

次元: 3105、7025、21812625、12 (nrow、ncol、ncell、nlayers)

私が必要とするのは、各行の最大値のインデックスです。レイヤー全体の列です。すべての NA は NA を返す必要があり、複数の最大コピーは最初の最大インデックスを返す必要があります (または、他の何かが一貫している必要があります)。

# Create a test RasterStack

require(raster)

a <- raster(matrix(c(11,11,11,
                     NA,11,11,
                     11,11,13),nrow=3))

b <- raster(matrix(c(12,12,12,
                     NA,12,12,
                     40,12,13),nrow=3))

c <- raster(matrix(c(13,9,13,
                     NA,13,13,
                     13,NA,13),nrow=3))

d <- raster(matrix(c(10,10,10,
                     NA,10,10,
                     10,10,10),nrow=3))

corr_max <- raster(matrix(c(13,12,13,
                            NA,13,13,
                            40,12,13),nrow=3))

stack <- stack(a,b,c,d)


which.max2 <- function(x, ...)which.max(x)

# stackApply method
max_v_sApp <- stackApply(stack,rep(1,4),which.max2,na.rm=NULL)

# calc method
max_v_calc <- calc(stack,which.max)

うまくいけば、これで十分な情報が得られます。

アップデート:

これはうまくいくかもしれません...今テストしています:

which.max2 <- function(x, ...){
  max_idx <- which.max(x)   # Get the max
  ifelse(length(max_idx)==0,return(NA),return(max_idx))
}
4

2 に答える 2

5

ここで、解決策を推測します。which.max が na.rm 引数を「サポート」していないためではなく、すでにそれを想定しており、データ引数用の「余地があった」だけです。ヘルプ ページから取得した小さなテスト ケースでテストしましたが、データではテストしませんでした。次のいずれかを使用できます。

require(raster)
 which.max2 <- function(x, ...) which.max(x)           # helper function to absorb "na.rm"
 wsa <- stackApply(PRISM_stack, rep(1,12), fun=which.max2, na.rm=NULL)

どうやらこのアプローチでは、na.rm を削除するためのヘルパー関数は必要ありません。

calc(PRISM_stack, which.max)

セル内のすべての NA の新しい問題により、これはどちらのアプローチでも成功するようです。

which.max2 <- function(x, ...) ifelse( length(x) ==sum(is.na(x) ), 0, which.max(x))

これと同じように:

which.max2 <- function(x, ...) ifelse( length(x) ==sum(is.na(x) ), NA, which.max(x))
于 2012-09-17T04:07:56.073 に答える
0

それで、これが私が見つけた最後の問題と私の解決策です。

私が which.max() で抱えていた問題は、すべての NA のベクトルを処理する方法です

>which.max(c(NA,NA,NA))
integer(0)
>

stackApply() 関数がこの値を新しい RasterLayer に書き込もうとすると失敗します。関数が NA を返す必要がある場合、長さ = 0 の整数 (0) を返します。

解決策(私の解決策)は、 which.max() のラッパーを作成することでした

which.max.na <- function(x, ...){
   max_idx <- which.max(x)
   ifelse(length(max_idx)==0,return(NA),return(max_idx))
}

これは、元の RasterStack に実装されており、正常に動作します。助けてくれてありがとう。もしあれば、この解決策の代替案を提案してください!

ありがとう!カイル

于 2012-09-18T04:05:28.100 に答える