簡體   English   中英

如何獲取 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)

您可以在raster package 中使用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

一種方法可能是轉換為 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM