2016-08-23 2 views
2

1mの解像度でバイナリラスタ(r)を使用していますが、これを4mの解像度でパーセンテージ値に変換したいと思います。この新しいラスタの各ピクセル値は、 4ピクセルのうち1ピクセルの合計周波数に基づいて計算されます。私はaggregate機能を持つrasterパッケージを見ました。ただし、これは機能しません。バイナリラスタをパーセンテージに集計する方法R

newras <-aggregate(r, fact=4, fun= percent) 
+0

を考える集計、ない4.でしょう、あなたのオリジナルのラスター常に各次元に4つのセルの倍数がありますか? – Bazz

+0

オリジナルのラスタには4つのセルの倍数がないかもしれませんが、4mの解像度に合わせてサイズを変更できます。 – Arihant

+0

助けが簡単になるように再現可能な例を与えてください –

答えて

4

あなたがしていることは面倒ではありませんなぜなら、percentageという関数がないからです。しかし、あなたは1つを作ることができます。この場合、平均値は分数なので、100を掛けてパーセンテージを求めます。

例データ

library(raster) 
r <- raster() 
set.seed(0) 
values(r) <- sample(0:1, ncell(r), replace=TRUE) 

a <- aggregate(r, 4, fun=function(x,...) 100 * mean(x)) 
# or 
a <- 100 * aggregate(r, 4, mean) 

NA値それぞれの新しいセルに16個のセルを集約う4メートルの解像度に変換する

r[sample(ncell(r), 0.9 * ncell(r))] <- NA 

# Make a function and use it  
percentage <- function(x, ...) { x <- na.omit(x); 100 * mean(x) } 
a <- aggregate(r, 4, fun=percentage) 

# or do 
a <- 100 * aggregate(r, 4, fun=mean, na.rm=TRUE) 
1

ここでは行列を使用する方法です。私は40×40の行列を使用しています。

mtx <- matrix(sample(0:1, 40^2, TRUE), 40, 40) 

インデックスは、グループ化のための引数として使用する:

inds <- Map(seq, seq(1, 37, 4), seq(4, 40, 4)) 

グループを4×4ブロックに寸法が4

オリジナル行列の倍数でない場合の方法は、いくつかの考えが必要になります。 blockarrayには16行(グループ内の各要素)と100列(グループを表す)があります。結果の

pcts <- matrix(colMeans(blockarray)*100, 10, 10) 

目視検査:結果の

image(mtx, zlim = 0:1, col = c("white", "black")) 
image(pcts, zlim = c(0, 100), col = colorRampPalette(c("white", "black"))(11)) 

検証:

sum(mtx[1:4, 5:8])/16*100 
pcts[1, 2] 
40×40 = 16×100

blockarray <- mapply(function(i, j) mtx[i, j], 
        rep(inds, times = 10), 
        rep(inds, each = 10)) 

は割合行列を取得するにことに注意してください

関連する問題