2016-08-23 9 views
2

У меня есть бинарный растровый (r) с разрешением 1 метр, и я хочу преобразовать его в процентное значение с разрешением 4 м. Этот новый растровый показатель будет иметь каждое значение пикселя, представляющее процент , рассчитанный на основе общей частоты 1 из четырех пикселей. Я посмотрел на пакет raster, который имеет функцию aggregate. Однако это не работает.Как заполнить бинарный растр в процентах в R

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

Преобразование в резолюции 4м бы агрегировать 16 клеток в каждую новую ячейку, а не 4. Будет ли исходный растр всегда есть несколько из четырех ячеек в каждом измерении? – Bazz

+0

У моего оригинального растра может быть не много кратных четырех ячеек, но я могу изменить его размер в соответствии с разрешением 4 м. – 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 значения

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. Метод требуют некоторых мыслей, если размеры не кратны 4.

Оригинальной матрицы:

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

Индексов для использования в качестве аргументов для группировки:

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

Group в 4 на 4-х блоках. blockarray имеет 16 строк (каждый элемент внутри групп) и 100 столбцов (представляющих группы). Обратите внимание, что 40 х 40 = 16 х 100.

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

Чтобы получить процент матрицы:

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]