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