Средняя длина прогонов, выбранных из растрового кирпича в 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])
}