[英]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.