Определить, какой слой в стеке растров первым удовлетворяет условию?

Я хочу проанализировать стек растра и определить первый слой в стеке, который удовлетворяет условию для каждого пикселя.

# Generate stack of random values
library(raster)

r1 <- r2 <- r3 <- r4 <-r5 <- r6 <- r7 <- raster(ncol=10, nrow=10)
r1[] <- rpois(ncell(r1), 1)
r2[] <- rpois(ncell(r2), 1)
r3[] <- rpois(ncell(r3), 1)
r4[] <- rpois(ncell(r4), 1)
r5[] <- rpois(ncell(r5), 1)
r6[] <- rpois(ncell(r6), 1)
r7[] <- rpois(ncell(r7), 1)

# stack them
s <- stack(r1,r2,r3,r4,r5,r6,r7)

Я хочу взять этот стек и определить, что первый слой удовлетворяет условию, например: «Значение = 1 для 3 последовательных слоев» или «2 из последних 3-х слоев имеют значение = 1».

Вы можете придумать какую-нибудь функцию для этого?

Если я запускаю rasterToPoints, я могу преобразовать стек в фрейм данных со столбцами, представляющими каждое значение слоя. Это может упростить задачу.

values<-as.data.frame(rasterToPoints(s))
values<-values[,3:ncol(values)]  #eliminates two columns at the beginning
values$first<-NA

На этом этапе я думаю, что мне нужно пройти цикл и заполнить значения $ first столбец первым столбцом, отвечающим моему условию.

Как только я определю правильный слой для каждого пикселя, мне понадобится выходной растр с правильным номером слоя в качестве значения для каждого пикселя.

Буду признателен за любую помощь!

В чем-то похожий вопрос размещен здесь, хотя здесь подсчитывается количество слоев, удовлетворяющих определенному условию.


person Scott Z    schedule 11.07.2019    source источник


Ответы (1)


Вы можете написать функцию, которая может сделать это для вектора, а затем использовать ее в raster::calc.

Например, чтобы найти первый слой со значением 3

f <- function(x) which(x == 3)[1] 

(и обрабатывает случай, когда ни одно из значений не равно 3, возвращая NA)

Например

library(raster)
s <- stack(system.file("external/rlogo.grd", package="raster"))
f <- function(x) which(x == 255)[1] 
x <- calc(s, f)
plot(x)
person Robert Hijmans    schedule 11.07.2019
comment
Это полезно, спасибо! Но можете ли вы придумать способ ссылаться на несколько слоев стека? Например, хотите найти три слоя подряд, равных трем? Я обошел это сейчас, запустив rasterToPoints, чтобы создать фрейм данных, а затем цикл while для этого. - person Scott Z; 12.07.2019
comment
Вам нужно написать функцию, которая сделает это для вектора; а затем используйте это с calc (как я показал выше). - person Robert Hijmans; 13.07.2019