Средняя длина прогонов, выбранных из растрового кирпича в R

Я работаю с растровым кирпичом "а" с тысячами слоев, для моей задачи более подробное описание не требуется. Я использую следующую функцию для создания растрового слоя из общего количества прогонов не менее 5 дней со значениями больше 1 (один слой в кирпиче - это один день):

       indices<-rep(1:69,each=90)
 ff<-function(x,na.rm=TRUE){
 y<-x > 1
 n<- ave(y,cumsum(y == 0), FUN = cumsum)
 sum(n==5)
 }
 Y<-stackApply(a,indices,fun=ff)

Это отлично работает, я это тестировал. Аналогичным образом я написал новую функцию:

       fff<-function(x,na.rm = TRUE){
 y <- x > 1
 n <- ave(y, cumsum(y == 0), FUN = cumsum)
 mean(n[n >= 5])
 }
 X<-stackApply(a,indices,fun=fff)

Используя эту функцию, я хотел создать растровый слой со средней длиной этих прогонов более 5 дней. Вроде разумно и нормально, но работает некорректно. Например, когда есть пробег продолжительностью 6 дней (удовлетворяющий моему критерию ценности> 1), он учитывает два пробега, один из 5 и другой из шести, и, таким образом, среднее значение составляет 5,5 вместо 6. Я не участвую. уверен, как настроить мою функцию fff. Если есть способ сделать это, было бы здорово, в противном случае я был бы очень рад, если бы кто-нибудь поделился другим способом вычисления средних значений этих прогонов. Спасибо!

1 ответ

В будущем, пожалуйста, включите минимальный, воспроизводимый, самодостаточный пример . Не описывайте поведение вашего кода, а показывайте его. Кроме того, будьте предельно ясны по поводу вопроса. Как-то трудно понять, что ваш вопрос вообще не касается растровых данных, поскольку вы ищете функцию, которая работает с любым числовым вектором (который затем вы можете применить к растровым данным).

Вы ищете функцию, которая находит локальные максимумы больше 5 в совокупной сумме соседей, которые больше 1; а затем усреднить эти локальные максимумы.

У вас есть эта функция

      ff<-function(x,na.rm=TRUE){
   y<-x > 1
   n <- ave(y,cumsum(y == 0), FUN = cumsum)
   sum(n==5)
}

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

      x <- c(-1:10, -1:3, -1:6)
x
#  [1] -1  0  1  2  3  4  5  6  7  8  9 10 -1  0  1  2  3 -1  0  1  2  3  4  5  6

ff(x)
# [1] 2

(два локальных максимума больше 5)

Чтобы написать желаемую функцию, мы можем начать с того, что у нас есть

      y <-x > 1
n <- ave(y,cumsum(y == 0), FUN = cumsum)
n        
# [1] 0 0 0 1 2 3 4 5 6 7 8 9 0 0 0 1 2 0 0 0 1 2 3 4 5

В этом случае вам нужно найти числа 9 и 5. Начать можно с

      n[n<5] <- 0
n
# [1] 0 0 0 0 0 0 0 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 5

И теперь мы можем использовать diffнайти локальные максимумы. Это значения, для которых разница с предыдущим значением отрицательна. Обратите внимание на ноль, добавленный к n считать последний элемент вектора.

      i <- which(diff(c(n, 0)) < 0)
i
# [1] 12 25
n[i]
# [1] 9 5

Таким образом, мы можем объединить вышеперечисленное в функцию, подобную этой

      f <- function(x) {
   y <- x > 1
   n <- ave(y,cumsum(y == 0), FUN = cumsum)
   n[n<5] <- 0
   i <- which(diff(c(n, 0)) < 0)
   mean(n[i])
}

f(x)
# [1] 7

Если у вас есть NAты можешь сделать

      f <- function(x) {
   y <- x > 1
   y[is.na(y)] <- FALSE
   n <- ave(y,cumsum(y == 0), FUN = cumsum)
   n[n<5] <- 0
   i <- which(diff(c(n, 0)) < 0)
   mean(n[i])
}
Другие вопросы по тегам