问题描述
我在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"]]