2017-03-05 1 views
0

ラスタイメージのシリーズを持つループがあり、150の値を抽出してから、ループの全長の合計ピクセル数を加算したいとします。コードでは、私は各画像の合計値を個別に取得し、全体の形式では取得できませんでした。ありがとうラスタシリーズの合計

m=52419 #total pixels basin 
    for(i in 1:4){ 
    b1<-raster(myras1[i]) 
    bc = b1 == 150 #Values eq 150 
    nbc = cellStats(bc,stat="sum") 
    print(nbc) 
    [1] 34962 
    [1] 38729 
    [1] 52389 
    [1] 52176 
    pc=nbc*100/m 
    } 

答えて

1

一般に、容易にベクター化できるものにはRのループを使用しないことをお勧めします。あなたのループに(いくつかの)問題を修正しようとするのではなく、代わりにより良い方法を示します。あなたは、単一のベクトル化ラインで全体の計算を実行することができます。

sum(cellStats(myras1==150, stat="sum")) * 100/m 

これを破壊:ラスタースタック上で実行さcellStatsは値のベクトル、それぞれの層のための1つを返します。 sumはこれらを一緒に追加します。次に、スタック全体(すべてのレイヤーを組み合わせたもの)のセル数で除算し、パーセルネットに変換するために100を掛けます。

テストいくつかの再現性のあるダミーのテストデータでこの:

set.seed(123) 
myras1 = list(
    raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)), 
    raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)), 
    raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)), 
    raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)) 
) 
myras1 = stack(myras1) 
m = ncol(myras1) * nrow(myras1) * nlayers(myras1) 

sum(cellStats(myras1==150, stat="sum")) * 100/m 
# [1] 8.815 
+0

それが正常に動作しますが、それはあまりにも多くのスティック5000枚の層で、より速くそれを作るためにどのような方法がありますか?おかげで – tmsppc

+0

非常に大きなスタックの計算は常に遅くなるでしょう。私はあなたがどのようにスピードブーストを得るのか分かりません。おそらく、スタックではなくラスターレンガを使用すると、いくらか改善されるでしょう。これをバッチ処理として実行することはできないのですか?最高の速度を得るには、RではなくFORTRANを使用することができますが、開発時間の投資は、Rが結果を膨らませるのを待つよりもずっと時間がかかります。または、クラウドコンピューティングプラットフォームでマルチコアの時間を購入して計算を実行することもできます。クラウドコンピューティングは合理的な価格です。 – dww