R -根据R中指定月份计算季节栅格



我有多年的月度栅格,我想从中计算基于特定月份(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)

最新更新