如何获取 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
我有一大堆代表林地斑块(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