按月子集栅格堆栈

时间:2020-10-27 18:33:53

标签: r stack subset raster

我有一个具有以下说明的RasterStack:

class      : RasterStack 
dimensions : 221, 121, 26741, 14976  (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 
names      : index_1979.01.01, index_1979.01.02, index_1979.01.03, index_1979.01.04, index_1979.01.05, index_1979.01.06, index_1979.01.07, index_1979.01.08, index_1979.01.09, index_1979.01.10, index_1979.01.11, index_1979.01.12, index_1979.01.13, index_1979.01.14, index_1979.01.15, ... 
min values :         46604.85,         47328.07,         48944.12,         49320.65,         49244.67,         49516.16,         49504.01,         48959.65,         48608.90,         47603.10,         47572.72,         48564.15,         49816.92,         49078.65,         48321.72, ... 
max values :         57006.81,         56968.60,         56958.67,         56976.26,         57288.55,         57535.62,         57659.48,         57581.33,         57381.65,         57052.99,         56803.95,         56854.89,         56783.50,         56739.44,         56600.52, ... 

自1979年1月1日至2019年12月31日,每天有14 975层。现在,我想相对于月份取出12个堆栈,因此我想将其分成12个较小的堆栈。由于我无法正确更改堆栈的层名称,因此我想到了另一种方法。我制作了一个向量,该向量的字符数与堆栈层的字符数相同,前31个字符被命名为JAN,另外28个FEB以此类推...等等。

n<-names(stack)
nn<-substr(n,12,13)
nn<-gsub('01','JAN',nn)
nn<-gsub('02','FEB',nn)
...
nn<-gsub('12','DEC',nn).

现在我想通过向量nn来对堆栈进行子集化,如下所示: sub <-raster :: subset(stack,nn)。

希望您能理解我想要做什么。 每一个帮助表示感谢,谢谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

layer_name <- names(stack)
layer_name <- str_remove_all(layer_name, "[index_]")

#install.packages("lubridate")
library(lubridate)

layer_name <- ymd(layer_name)

#Create an indices to prepare it for stackApply, which takes the means for all the days of the month within each year.
indices <- format(as.Date(layer_name, format = "%Y.%m.%d"), format = "%Y.m") 

raster_mean <- stackApply(stack, indices, mean)
  • layer_name <- names(stack)将从栅格中获取名称,以准备月份的总和或均值
  • str_remove_all()会删除名称index_中的第一个单词,以将其过滤为日期 -ymd()将字符转换为日期格式以进行过滤
  • Indices选择年和月的日期格式
  • stackApply()使用索引,它从栅格中获取每个月内的所有天并获取平均值

答案 1 :(得分:0)

n <-names(stack)
n <- c("index_1979.01.01", "index_1979.01.02", "index_1979.01.03", "index_1979.01.04", "index_1979.01.05", "index_1979.01.06", "index_1979.01.07", "index_1979.01.08", "index_1979.01.09", "index_1979.01.10", "index_1979.01.11", "index_1979.01.12", "index_1979.01.13", "index_1979.01.14", "index_1979.01.15")

nn <- as.integer(substr(n,12,13))

现在获取1月的图层

sjan <- stack[[nn == 1]] 

或带有子集

subjan <-raster::subset(stack, which(nn==1))