Если вы используете случайные значения для вашего примера, вы должны исправить случайное начальное число, чтобы сделать его воспроизводимым, просто к вашему сведению.
Это должно сделать то, что вам нужно:
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](https://i.stack.imgur.com/JSgPE.png)