从R中的RASTER计算长期每日均值

问题描述

我在R中有一个RasterBrick对象,称为z500(等压面500 hPa的地势高度)。其描述如下:

class      : RasterBrick 
dimensions : 221,121,26741,59900  (nrow,ncol,ncell,nlayers)
resolution : 0.25,0.25  (x,y)
extent     : 14.875,45.125,24.875,80.125  (xmin,xmax,ymin,ymax)
crs        : +proj=longlat +datum=wgs84 
source     : C:/Users/Adam/AppData/Local/Temp/Rtmpct79pT/raster/r_tmp_2020-10-23_122821_43760_36114.Grd 
names      : X1979.01.01.00.50.39,X1979.01.01.06.50.39,X1979.01.01.12.50.39,X1979.01.01.18.50.39,X1979.01.02.00.50.39,X1979.01.02.06.50.39,X1979.01.02.12.50.39,X1979.01.02.18.50.39,X1979.01.03.00.50.39,X1979.01.03.06.50.39,X1979.01.03.12.50.39,X1979.01.03.18.50.39,X1979.01.04.00.50.39,X1979.01.04.06.50.39,X1979.01.04.12.50.39,... 
min values :             4769.189,4746.817,4732.399,4728.390,4753.844,4795.936,4853.804,4893.073,4947.256,4990.038,5002.388,5007.603,4996.633,5000.276,5014.048,... 
max values :             5815.242,5813.691,5810.005,5814.445,5810.501,5802.763,5810.199,5813.260,5812.462,5805.134,5807.656,5807.419,5806.255,5801.406,5811.816,... 

所以我得到了59900层,因为从1979年1月1日到2019年12月31日,我每天每6小时具有z500的值。

现在,我想以某种方式对RasterBrick进行子集化,以便在每个栅格中,我在整个时间序列中都具有同一日历日的值。因此,它应该在一个子栅格中为4 * 41层(每天4个值,41年)。最后,我很容易就能找到z500的长期日均值,但是上述步骤对我来说并不容易。

感谢所有帮助,谢谢!

解决方法

您可以从z500的名称中提取日期并将其用作索引

# n <- names(z500)
# example data
n <- c("X1979.01.01.00.50.39","X1979.01.01.06.50.39","X1979.01.01.12.50.39","X1979.01.02.00.50.39","X1979.01.02.06.50.39","X1979.02.01.12.50.39","X1980.01.01.00.50.39","X1980.01.01.06.50.39","X1980.01.01.12.50.39","X1980.01.02.00.50.39","X1980.01.02.06.50.39","X1980.02.01.12.50.39")

获取相关部分(月日)

md <- substr(n,7,11)
md 
# [1] "01.01" "01.01" "01.01" "01.02" "01.02" "02.01" "01.01" "01.01" "01.01"
#[10] "01.02" "01.02" "02.01"

并与raster::stackApply

一起使用
x <- stackApply(z500,md,mean)

您可以像这样子集(但是每天创建一个对象是一个糟糕的主意)。

jan1 <- z500[[md ==  "01.01"]]