Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中获得大型光栅堆栈中每个层的唯一值数量?_R_Stack_Gis_Raster - Fatal编程技术网

如何在R中获得大型光栅堆栈中每个层的唯一值数量?

如何在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 <

我有一个大的光栅堆栈,表示林地斑块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 <- 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