0

我正在使用具有数千层的光栅砖“a”,我的问题不需要更详细的描述。我正在使用以下函数创建一个至少 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 次运行一次,6 次运行一次,因此平均值是 5,5 而不是 6。我不是确定如何调整我的功能 fff。如果有办法做到这一点,那就太好了,否则,如果有人分享另一种方法来计算这些运行的平均值,我会很高兴。谢谢!

4

1 回答 1

0

将来,请包括一个最小的、可重复的、独立的示例。不要描述代码的行为,但要显示它。另外,要非常清楚这个问题。照原样很难看出您的问题根本与栅格数据无关,因为您正在寻找适用于任何数字向量的函数(然后您可以将其应用于栅格数据)。

您正在寻找在 > 1 的邻居的累积总和中找到大于 5 的局部最大值的函数;然后平均这些局部最大值。

你有这个功能

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

如果你有NAs 你可以做

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])
}
于 2021-03-23T00:13:53.190 回答