如何获取 R 中大型栅格堆栈中每一层的唯一值数量?

How to get the number of unique values for each layer in a Large raster stack in R?

我有一大堆代表林地斑块(63 层)的光栅。我试图找到一种简洁的方法来获取每一层的唯一值的数量。

对于一个光栅,我已按如下方式完成。

r1 <- raster(matrix(sample(1:100, 20), 10,10)) #create mock data
length(unique(r1)) #gives number of unique values 

但是如果我有如下所示的 3 个栅格堆栈,是否有一种简洁的方法可以获取每一层的信息。

### mock data
r1 <- raster(matrix(sample(1:100, 20), 10,10))
r2 <- raster(matrix(sample(1:100, 50), 10,10))
r3 <- raster(matrix(sample(1:100, 10), 10,10))
### create raster stack
allrasters <- stack(r1, r2, 23)

一种方法可能是转换为 3D 数组并使用 apply:

library(raster)
set.seed(1)
r1 <- raster(matrix(sample(1:100, 20), 10,10))
r2 <- raster(matrix(sample(1:100, 50), 10,10))
r3 <- raster(matrix(sample(1:100, 10), 10,10))
allrasters <- stack(r1, r2, r3)
apply(as.array(allrasters),3,function(x)length(unique(as.vector(x))))
[1] 20 50 10

这不一定是你问的问题,但如果你遇到这个问题,你也可以使用 apply.

应用到栅格堆栈中
apply(as.array(allrasters),c(1,2),function(x)length(unique(x)))
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    3    3    3    3    3    3    3    3    3     3
 [2,]    3    3    3    3    3    3    3    3    3     3
 [3,]    3    2    3    3    3    3    2    3    3     3
 [4,]    3    3    3    2    3    3    3    3    2     3
 [5,]    3    3    3    3    3    3    3    3    3     3
 [6,]    3    3    3    3    3    3    3    3    3     3
 [7,]    3    3    3    3    3    3    3    3    3     3
 [8,]    3    3    3    3    3    3    3    3    3     3
 [9,]    3    3    3    3    3    3    3    3    3     3
[10,]    3    3    3    3    3    3    3    3    3     3

您可以在 raster 包中使用 freq 来获取每个图层的每个像素值的频率,然后使用 nrow 计算不同值的数量。最后,您可以将数据从列表转换为 data.frame,以便在进一步计算时更容易调用它。

library(raster)
as.data.frame(lapply(freq(allrasters), function(x) nrow(x)))

#    layer.1 layer.2 layer.3
# 1       20      50      10

示例数据

library(raster)
set.seed(1)
r1 <- raster(matrix(sample(1:100, 20), 10,10))
r2 <- raster(matrix(sample(1:100, 50), 10,10))
r3 <- raster(matrix(sample(1:100, 10), 10,10))
s <- stack(r1, r2, r3)

解决方案 1:首先获取跨层值的 唯一组合,然后逐层获取唯一值

u <- unique(s) 
x <- lapply(u, unique)
sapply(x, length)

解决方案 2:像这样遍历图层

y <- sapply(1:nlayers(s), function(i) unique(s[[i]]))
sapply(y, length)

解决方案 3:Jonathan V. Solórzano 的建议

sapply(1:nlayers(s), function(i) NROW(freq(s[[i]])))
#[1] 20 50 10