Как выбрать наиболее частые значения (режим) из стека растров

У меня есть четыре слоя в растровом стеке, и я хочу выбрать наиболее частое значение в каждой ячейке среди четырех слоев.

Вот набор данных и код:

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), ])
Другие вопросы по тегам