Определите, какой слой в растровом стеке первым отвечает условию? - PullRequest
0 голосов
/ 11 июля 2019

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

# 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 первым столбцом, отвечающим моим условиям.

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

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

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

1 Ответ

0 голосов
/ 11 июля 2019

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