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