Как получить количество уникальных значений для каждого слоя в большом стеке растров в R? - PullRequest
1 голос
/ 05 мая 2020

У меня есть большой набор растров, представляющих участки леса (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)

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Вы можете использовать freq внутри пакета raster, чтобы получить значение частоты на пиксель для каждого слоя, а затем просто подсчитать количество различных значений с помощью 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
1 голос
/ 05 мая 2020

Пример данных

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 : l oop поверх таких слоев

y <- sapply(1:nlayers(s), function(i) unique(s[[i]]))
sapply(y, length)

Решение 3: предложение Джонатана В. Солорзано

sapply(1:nlayers(s), function(i) NROW(freq(s[[i]])))
#[1] 20 50 10
0 голосов
/ 05 мая 2020

Один из подходов может заключаться в преобразовании в трехмерный массив и использовании 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...