Как выбрать наиболее частые значения (режим) из стека растров
У меня есть четыре слоя в растровом стеке, и я хочу выбрать наиболее частое значение в каждой ячейке среди четырех слоев.
Вот набор данных и код:
require(raster)
a <- raster(matrix(c(12,11,11,
NA,11,11,
11,11,13),nrow=3))
b <- raster(matrix(c(12,12,12,
NA,12,12,
14,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))
stk <- stack(a,b,c,d)
Интересно, можно ли сделать это с кодом что-то вроде?
which.freqV <- function(x, ...){
???
}
max <- stackApply(stk,1,which.freqV,na.rm=NULL)
2 ответа
Решение
Мне пришлось это сделать в моих скриптах (вычисление режима стека) и я нашел что-то, что отлично работает:
Mode <- function(x) {
ux <- unique(x)
ux=ux[!is.na(ux)]
ux[which.max(tabulate(match(x, ux)))]
}
layers_mode=calc(stack, fun=Mode)
Теперь, если вы хотите рассчитать частоту режима для каждой ячейки, используйте это:
###calculate proportion of layers that have mode value as measure of uncertainty
Mode_count <- function(x) {
ux <- unique(x)
ux=ux[!is.na(ux)]
mode=ux[which.max(tabulate(match(x, ux)))]
sum(x==mode, na.rm=T)
}
layers_mode_freq=calc(stack, fun=Mode_count)
Вы также можете рассмотреть модальную функцию из растрового пакета, которая также предоставляет некоторые способы работы со связями.
# S4 method for Raster
modal(x, ..., ties='random', na.rm=FALSE, freq=FALSE)
Что -то очень простое
a <- freq(stk, merge=TRUE)
a$nt <- rowSums(a[, -1], na.rm = T)
with(a, a[order(nt, decreasing = T), ])