我有一个大的栅格堆栈,它代表林地斑块(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)
你可以使用 freq
里面 raster
包来获取每层像素的频率值,然后只需用 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
一种方法可能是投射到一个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