2016-08-23 6 views
2

1 미터 해상도에서 이진 래스터 (r)를 가지고 있으며이를 4m 해상도에서 백분율 값으로 변환하고 싶습니다.이 새로운 래스터는 각 픽셀 값이 백분율 , 4 픽셀 중 1의 총 주파수를 기준으로 계산했습니다. aggregate 기능을 가진 raster 패키지를 보았습니다. 그러나 이것은 작동하지 않습니다.이진 래스터를 백분율로 집계하는 방법 R

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

을 고려 집계하지 4.겠습니까 원래 래스터 항상 각 차원에 4 개의 셀이 여러 개 있습니까? – Bazz

+0

원래 래스터의 셀이 4의 배수가 아니지만 4m 해상도와 일치하도록 크기를 조정할 수 있습니다. – Arihant

+0

돕기가 더 쉽도록 재현 가능한 예제를 제공하십시오. –

답변

4

당신이하는 일은 나쁘지 않습니다. k는 percentage이라는 기능이 없으므로 그러나 당신은 하나를 만들 수 있습니다. 이 경우 평균값은 분수이므로 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 개 세포를 집계 할 4m 해상도로 변환

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 x 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)) 

는 백분율 행렬을 얻기 위해 참고