我在很长一段时间内有一大堆海面温度栅格层(每小时一个),但是我想找到这些层在六个小时周期 00:00 - 0600、0600 - 1200、1200 - 的平均值1800 和 1800 - 2400)。
当前名称示例:
names(sstrasters)
[1] "X2021.01.31.00" "X2021.01.31.01" "X2021.01.31.02" "X2021.01.31.03" "X2021.01.31.04" "X2021.01.31.05" "X2021.01.31.06"
[8] "X2021.01.31.07" "X2021.01.31.08" "X2021.01.31.09" "X2021.01.31.10" "X2021.01.31.11" "X2021.01.31.12" "X2021.01.31.13"
[15] "X2021.01.31.14" "X2021.01.31.15" "X2021.01.31.16" "X2021.01.31.17" "X2021.01.31.18" "X2021.01.31.19" "X2021.01.31.20"
[22] "X2021.01.31.21" "X2021.01.31.22" "X2021.01.31.23" "X2021.02.01.00" "X2021.02.01.01" "X2021.02.01.02" "X2021.02.01.03"
[29] "X2021.02.01.04" "X2021.02.01.05" "X2021.02.01.06" "X2021.02.01.07" "X2021.02.01.08" "X2021.02.01.09" "X2021.02.01.10"
[36] "X2021.02.01.11" "X2021.02.01.12" "X2021.02.01.13" "X2021.02.01.14" "X2021.02.01.15" "X2021.02.01.16" "X2021.02.01.17"
然后,我想创建一个仅包含这些平均图层的新栅格堆栈,命名如下(基于最后一小时):
2021 01 31: 0000 - 0600 = "X2021.01.31.06"
2021 01 31: 0600 - 1200 = "X2021.01.31.12"
2021 01 31: 1200 - 1800 = "X2021.01.31.18"
2021 01 31: 1800 - 2400 = "X2021.01.31.00"
我尝试使用索引,但对它们的工作原理有点困惑,堆栈不包含最后一整天,因此不能被 6 整除。
这是一个工作示例。为了将来,请添加一个最小的可重现示例,这样会更容易为您提供帮助。
library(terra)
#create an hourly sequence for 1 year
namer <- seq(as.POSIXct("2021-01-01 01:00:00"), as.POSIXct("2021-12-31 24:00:00"), by="hour")
#create example data with 1 layer for each hour
r <- rast(nrow = 10, ncol = 10, vals = rnorm(100),nlyrs=length(namer),time=namer)
#create indexes for aggregation
index <- rep(1:(length(namer)/6),each=6)
#aggregate with tapp
sixhourly <- tapp(r,index,fun=mean)
time(sixhourly) <- namer[seq(6,length(name),6)]
其想法是将栅格分成 6 层块(每小时一层)并计算平均值。
tapp
包中的函数terra
正是为此目的而设计的。有关更多详细信息,请参阅 ?tapp
,但它应用了 base::tapply()
相同的概念。
为了将名称分配给最终栅格,我对我感兴趣的名称进行了索引。但是,由于我们正在处理时间,因此这里最好的选择是将最终时间分配给 rast
对象的时隙函数 terra::time()<-
(如果您希望将时间信息指定为名称,请使用 names(sixhourly)<-namer[seq(6,length(name),6)])