r根据预定义的时间步长进行栅格累积和计算

时间:2018-03-06 14:29:13

标签: r time-series r-raster cumulative-sum

我有10个每日栅格数据的时间序列,我需要根据参考栅格的像素值(=时间0)计算-5到+5时间步长累积和。

我能够计算年度累计金额(以下称为“sum_YY”)

step1创建10个每日光栅时间序列

require(raster)
idx <- seq(as.Date("2010/1/1"), as.Date("2011/12/31"), '10 days')
r <- raster(ncol=5, nrow=5)
s <- stack(lapply(1:length(idx), function(x) setValues(r, values = sample(x = c(-5:5),size = ncell(r), replace = T))))
s <- setZ(s, idx)

步骤2按年计算累计总和

Y <- unique(format(as.Date(getZ(s), format = "X%Y.%m.%d"), format = "%Y"))
sum_YY <- stack()
for (i in Y) {
  dates <- format(getZ(s), "%Y") == i
  t <- calc(subset(s, which(dates)), cumsum)
  sum_YY <- stack(sum_YY,t)
}

但这不是我要找的输出。 我需要根据参考光栅使用cumsum&#39;参考&#39;。

步骤3创建参考栅格

refer <- raster(ncol=5, nrow=5)
refer <- setValues(refer,sample(x = c(15:25),size = ncell(refer), replace = T))

'refer'栅格像素值表示时间步长'X',我想计算每年的“堆栈”时间步长X-5到X + 5的累积总和

即。如果'参考'像素值X = 20我需要计算每年从15到25层的累积总和。对于其他像素采用相同的方法,请参考&#39;

我不知道如何在计算中引入参考栅格,任何帮助??

万分感谢!!!

1 个答案:

答案 0 :(得分:2)

我想不出干净的方法。但这是一种方法:

rs <- stack(refer, s)
a <- calc(rs, fun=function(x) sum(x[(x[1]-4):(x[1]+6)]))

StackSelect是针对这样的问题而设计的,但我现在意识到它需要更多的灵活性。能够一次选择多个图层并应用函数会很高兴。但你可以这样做(可能效率低下)

x <- calc(refer, function(x) (x-5):(x+5), forceapply=T)
y <- stackSelect(s, x)
z <- sum(y)