如何在R中获得大型光栅堆栈中每个层的唯一值数量?
我有一个大的光栅堆栈,表示林地斑块63层。我试图找到一种简洁的方法来获得每个层的唯一值的数量如何在R中获得大型光栅堆栈中每个层的唯一值数量?,r,stack,gis,raster,R,Stack,Gis,Raster,我有一个大的光栅堆栈,表示林地斑块63层。我试图找到一种简洁的方法来获得每个层的唯一值的数量 ### 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 <
### 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)
对于一个光栅,我做了如下操作
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)
一种方法可能是将其转换为三维阵列并使用apply:
一种方法可能是将其转换为三维阵列并使用apply: 您可以在光栅包中使用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
您可以在光栅包中使用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)
示例数据
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)
此解决方案适用于较小的数据集,但可能导致无法加载到RAM的大型数据集出现问题此解决方案适用于较小的数据集,但可能导致无法加载到RAM的大型数据集出现问题
y <- sapply(1:nlayers(s), function(i) unique(s[[i]]))
sapply(y, length)
sapply(1:nlayers(s), function(i) NROW(freq(s[[i]])))
#[1] 20 50 10