Как рассчитать наибольшее значение пикселя в стеке слоев разных классификаций одной и той же области (большинство голосов)? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть несколько классификаций как растров, каждая из одной отдельной группы, которые имеют дискретные значения целочисленных пикселей, которые представляют определенные классы (например: 111 для стабильного хвойного леса).Я хочу выяснить, какое значение на пиксель является наиболее распространенным во всех классификациях, которые я поместил в растровый стек.

Есть ли для этого функция?Если нет идей, как решить эту задачу?

library(raster)
r1 <- raster(nrows = 4, ncols = 4, xmn = 0)
r1[] <- sample(1:4, 16, replace = T)

r2 <- raster(nrows = 4, ncols = 4, xmn = 0)
r2[] <- sample(1:4, 16, replace = T)

r3 <- raster(nrows = 4, ncols = 4, xmn = 0)
r3[] <- sample(1:4, 16, replace = T)

r <- stack(r1, r2 ,r3)
r[2,2]

Например, является ли класс 1,2,3 или 4 наиболее распространенным в пикселях [2,2]?В конце я хотел бы иметь один растровый слой с наибольшим значением пикселя и один с долей, которая имела это значение (оставаясь в приведенном выше примере, значения 1, 1 и 4, поэтому значение 1 будет «выигрывать» со скоростью66%).

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Вы можете использовать метод raster::modal. У него есть аргумент ties, который вы можете рассмотреть.

library(raster)
set.seed(42)
r <- raster(nrows = 4, ncols = 4, xmn = 0)
s <- stack(lapply(1:12, function(i) setValues(r, sample(1:4, 16, replace = TRUE))))

x <- modal(s)
plot(x)
1 голос
/ 10 мая 2019

Если вы используете случайные значения для вашего примера, вы должны исправить случайное начальное число, чтобы сделать его воспроизводимым, просто к вашему сведению.

Это должно сделать то, что вам нужно:

library(raster)

set.seed(42)

r1 <- raster(nrows = 4, ncols = 4, xmn = 0)
r1[] <- sample(1:4, 16, replace = T)

r2 <- raster(nrows = 4, ncols = 4, xmn = 0)
r2[] <- sample(1:4, 16, replace = T)

r3 <- raster(nrows = 4, ncols = 4, xmn = 0)
r3[] <- sample(1:4, 16, replace = T)

r <- stack(r1, r2 ,r3)

f <- function(x){

  n <- length(x)

  if (length(unique(x)) == n){

    return(c(NA,NA))

  }else{

    v <- as.integer(names(which.max(table(x))))

    p <- (sum(x == v) / n) * 100

    return(c(v,p))

  }
}

Мы создаемфункция, которая принимает вектор в качестве входных данных, вычисляет значение большинства и возвращает его вместе с процентом, который он имеет на длине вектора.Затем функция передается в calc для применения к стеку r.Итак, вы получите двухполосный растр.

Если повторяющихся значений нет, поэтому, если длина уникальных значений равна длине вектора, будет возвращено NA.

Не уверен, что произойдет, когда у вас два класса с одинаковым значением большинства, возможно, функция просто принимает один из них. Вы также можете добавить проверку для этого.

Так что, если мы посмотримв пикселе [2,2] мы можем проверить результаты:

Значение - 1, а дробь - 66% (как и остальные)

> r[2,2]
     layer.1 layer.2 layer.3
[1,]       3       1       1

plot(calc(x = r, fun = f2))

enter image description here

...