如何计算同一区域不同类别的图层堆栈中的最丰富像素值(多数表决)?

时间:2019-05-10 12:28:00

标签: r spatial raster r-raster

我有多个栅格分类,每个栅格属于一个不同的组,它们具有代表某些类别的离散整数像素值(例如:对于稳定的针叶林,为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]

例如,像素[2,2]中的1,2,3或4类最丰富吗? 最后,我希望有一个光栅层具有最丰富的像素值,而一个光栅层具有该值具有的分数(在上面的示例中,值1、1和4保持不变,因此值1将以“ 66%)。

2 个答案:

答案 0 :(得分:1)

如果您为示例使用随机值,则应修复随机种子以使其可重现,仅供参考。

这应该可以满足您的需求

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。因此,您将获得一个2波段栅格。

如果没有重复值,那么如果唯一值的长度等于向量的长度,则将返回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

答案 1 :(得分:1)

您可以使用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)