R 基于另一个光栅堆栈对光栅堆栈中的像素值求和

R 基于另一个光栅堆栈对光栅堆栈中的像素值求和,r,time-series,r-raster,R,Time Series,R Raster,我有一个光栅堆栈,表示蒸散量ET,共有396层3个光栅层,一个月,总共11年——2009年至2019年。对于每个月,光栅层始终表示一个月的第1天、第11天和第21天,称为dekads。这是示例数据集 library(raster) #create a raster with random numbers r <- raster(ncol=5, nrow=5, xmx=-80, xmn=-150, ymn=20, ymx=60) values(r) <- runif(ncell(r)

我有一个光栅堆栈,表示蒸散量ET,共有396层3个光栅层,一个月,总共11年——2009年至2019年。对于每个月,光栅层始终表示一个月的第1天、第11天和第21天,称为dekads。这是示例数据集

library(raster)

#create a raster with random numbers
r <- raster(ncol=5, nrow=5, xmx=-80, xmn=-150, ymn=20, ymx=60)
values(r) <- runif(ncell(r))

#create a random raster stack for 3 raster a month for 11 years
n <- 396 #number of raster
s <- stack(replicate(n, r)) # convert to raster stack

#rename raster layers to reflect date
d =rep(c(1,11,21),132)
m =rep(1:12, 11, each =3)
y = rep (2009:2019, each =36)
df.date <- as.Date(paste(y, m, d,sep="-"), "%Y-%m-%d")
names(s) = df.date
我还有另外两个光栅堆栈,像素值表示2009年至2019年的季节开始SS11层和季节结束se11层

#create a raster stack representing season start (ss) and season end (se)
# The pixel value represents dekad number. Each raster layer covers exactly three calendar years with the target year in the middle.
# (1-36 for the first year, 37-72 for the target year, 73-108 for the next year). 
ss.1 = r # season start raster
values(ss.1)= as.integer(runif(ncell(ss.1), min=1, max=72))
se.1 = ss.1+10 # season end raster
yr = 11
ss <- stack(replicate(yr, ss.1)) # season start raster stack
se <- stack(replicate(yr, se.1)) #season end rasterstack
现在,我需要根据s光栅堆栈估计每年的季节性总和,这样,通过考虑3年的移动窗口,每个像素总和的时间段应该对应于ss和se的像素值

这里是一个输出的例子,我需要一个时间步长3年窗口,一个季度开始ss光栅和一个季度结束se光栅。但真正打动了三个光栅堆栈,s表示数据集,ss表示季节开始日期,se表示季节结束日期。 谢谢你的帮助

# Example to calculate pixel based sum for 1 time step
#subset first 3 years - equal to 108 dekads
s.sub = subset(s, 1:108)
# sum each grid cells of "s" raster stack using "ss.1" and "se.1" as an indicator for the three year subset.
for (i in 1:ncell(s.sub)) {
  x[i] <- sum(s[[ss.1[i]:se.1[i]]][i], na.rm = T)
}

您的示例的最后一部分不起作用,我将其改为此一年

x <- rep(NA, ncell(s))
for (i in 1:ncell(s)) {
  x[i] <- sum(s[i][ss.1[i]:se.1[i]], na.rm = T)
}
x <- setValues(ss.1, x)
x
#class      : RasterLayer 
#dimensions : 5, 5, 25  (nrow, ncol, ncell)
#resolution : 14, 8  (x, y)
#extent     : -150, -80, 20, 60  (xmin, xmax, ymin, ymax)
#crs        : +proj=longlat +datum=WGS84 +no_defs 
#source     : memory
#names      : layer 
#values     : 0.6505058, 10.69957  (min, max)

请提供一个最小的、独立的、可复制的示例。换句话说,不要引用您拥有的文件,而是使用R附带的文件或在内存中创建一些值。尽可能小的例子;并显示至少一个网格单元的输入和预期输出。抱歉,Robert Hijmans没有包括一个工作示例。现在用一个工作示例编辑它。非常感谢您的帮助。它工作得很好。期待terraUpdate-我相信rapp功能在这篇文章发表后有了一些变化。我确实做到了,谢谢,现在更新了。
idx <- stack(ss.1, se.1)
thefun <- function(x, y){
    apply(cbind(y, x), 1, function(i) sum(i[(i[1]:i[2])+2], na.rm = T))
}  
z <- overlay(s, idx, fun=thefun)
    
library(terra)
r <- rast(ncols=5, nrows=5, xmin=-150, xmax=-80, ymin=20, ymax=60)
values(r) <- 1:ncell(r)
s <- rast(replicate(36, r))

ss.1 <- r 
values(ss.1) <- as.integer(runif(ncell(ss.1), min=1, max=72))
se.1 <- ss.1+10 

x <- rapp(s, ss.1, se.1, sum)