Рассчитать максимальную длину последовательных дней выше определенного порога в стеке растров - PullRequest
0 голосов
/ 22 мая 2019

Я хотел бы рассчитать максимальную длину последовательных дней выше порога (> 90) в стеке растров

С учетом растрового стека s, как показано ниже

x1 <- raster(nrows=10, ncols=10)
 x2=x3=x4=x5=x6=x1
 x1[]= runif(ncell(x1))
 x2[]= runif(ncell(x1))
 x3[]= runif(ncell(x1))
 x4[]= runif(ncell(x1))
 x5[]= runif(ncell(x1))
 x6[]= runif(ncell(x1))
 s=stack(x1,x2,x3,x4,x5,x6)*56

Вот моя текущая функция.

cd <- function(x) {
  seq <- rle(as.numeric(x) > as.numeric(x)[[nlayers(s)]])
  n = max(length(seq$values >= 90.0))
  return(n)

Я ожидаю растровый слой в качестве выходных данных со значениями в диапазоне 0-6.

1 Ответ

1 голос
/ 22 мая 2019

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

library(raster)

set.seed(42)

x1 <- raster(nrows=10, ncols=10)

s <- do.call(stack,lapply(1:6,function(x) setValues(x1,runif(ncell(x1)))*56))

Что касается вашего вопроса, единственное, что вам нужно, это простая функция, которую можно передать в calc для получения желаемых результатов:

cd <- function(x,t){

  y <- rle((x > t)*1)

  z <- y$lengths[y$values==1]

  return(max(z,0))

}

Эта функция использует rle, или кодировку длины серии, для расчета количества последовательных серий в векторе. В этом случае я ищу максимальное количество последовательных 1 с, которые получаются умножением значений ИСТИНА (значение выше порога t) на 1.

В конце вы хотите вернуть максимальный прогон значения 1, при этом 0 является запасным вариантом в случае отсутствия вхождения (sidenote: 1 указывает на одно непоследовательное вхождение).

Наконец, cd может быть передан в calc, в этом случае с порогом 40:

plot(calc(s,function(x) cd(x,40)))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...