我有多年的月度栅格,我想从中计算基于特定月份(10月至2月)的季节性总和。
library (terra)
#create rasters
r1 <- rast(nrows=50, ncols=50)
rr <- lapply(1:36, function(i) setValues(r1, runif(ncell(r1), min = 0, max = 1000)))
#create raster stack
stk <-rast(rr)
#create date vector
dte <- seq(as.Date("2015-1-1"), as.Date("2017-12-31"), by="month")
#apply date vector to raster names
names(stk) <- dte
使用栅格名称中指定的月份,我想通过计算每年从10月到2月的五个月的季节和来创建一个新的栅格堆栈。
有从堆栈中提取特定月份的例子,按月对Rasterstack进行子集设置,或计算三学期的平均值,其中季节贯穿多年R如何使用stackApply计算每年的季节平均值?在本例中,索引长度相等。
**indices <-**
seasonal_sum <- stackApply(stk, indices, sum)
想知道如何在应用stackapply(5个月- 10月至2月和7个月- 3月至9月)之前获得不同年份的指数。如果有更好的方法,谢谢你的帮助
您可以使用terra::tapp
(相当于raster::stackApply
)
library (terra)
set.seed(1)
stk <- rast(nrows=50, ncols=50, nlyr=36)
values(stk) <- runif(size(stk), min = 0, max = 1000)
指定时间(也可以使用名称,但这样更简单)
time(stk) <- seq(as.Date("2015-1-1"), as.Date("2017-12-31"), by="month")
我将首先删除不感兴趣的月份。
dte <- time(stk)
m <- as.numeric(format(dte, "%m"))
i <- (m < 3 | m > 9)
x <- stk[[i]]
现在按季节(10月至2月)对值求和。为此,我将1月和2月移到前一年。
d <- time(x)
y <- as.numeric(format(d, "%Y"))
m <- as.numeric(format(d, "%m"))
y[m<3] <- y[m<3]-1
z <- tapp(x, y, sum)
z
#class : SpatRaster
#dimensions : 50, 50, 4 (nrow, ncol, nlyr)
#resolution : 7.2, 3.6 (x, y)
#extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84
#source : memory
#names : X2014, X2015, X2016, X2017
#min values : 5.9095, 600.6971, 582.8348, 128.1672
#max values : 1983.775, 4843.461, 4422.809, 2896.181
如果您只关心10 - 2月的季节,下面是另一条效率较低的路线。
d <- time(stk)
m <- as.numeric(format(dte, "%m"))
y <- as.numeric(format(d, "%Y"))
y[m<3] <- y[m<3] - 1
m <- ifelse(m < 3 | m > 9, "w", "s")
ym <- paste0(y, m)
zz <- tapp(stk, ym, sum)
subset(zz, grep("w", names(zz)))
#class : SpatRaster
#dimensions : 50, 50, 4 (nrow, ncol, nlyr)
#resolution : 7.2, 3.6 (x, y)
#extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84
#source : memory
#names : X2014w, X2015w, X2016w, X2017w
#min values : 5.9095, 600.6971, 582.8348, 128.1672
#max values : 1983.775, 4843.461, 4422.809, 2896.181
对于其他正在看这个问题的人。对于更简单的情况,您只想按日历年汇总值,您可以执行(使用terra>= 1.6.0)
r <- tapp(stk, "years", sum)