计算不同时间步长的堆栈栅格中的均值,中值和标准差

时间:2017-06-21 02:22:35

标签: r stack mean raster

我在R中有一个栅格砖/堆栈(使用光栅包),从1970年到2015年有45年的年降雨量数据。我想计算给定年份的平均值,中位数和标准偏差,例如: 2015年使用最近5年,10年,15年,20年,30年。 我希望从2000年到2015年这样做,每年使用堆叠数据重复此过程并保存给定年份的新派生栅格。这是示例代码。任何帮助是极大的赞赏。

raster <- raster(ncol=10, nrow=10)
raster_brick <- brick( sapply(1:45, function(i) setValues(r, rnorm(ncell(r), i, 3))))
plot(raster_brick)
str(raster_brick)

1 个答案:

答案 0 :(得分:6)

要完成此任务,我们可以使用栅格包中的calc函数。我们还需要知道如何对RasterBrick对象进行子集化。

数据准备

library(raster)
set.seed(123)
r <- raster(ncol=10, nrow=10)
r_brick <- brick(sapply(1:45, function(i) setValues(r, rnorm(ncell(r), i, 3))))

计算函数的示例

calc可以为RasterBrick对象中的所有图层应用函数。最终结果是栅格图层。

# Calculate mean
r_mean <- calc(r_brick, mean)
# Calculate median
r_median <- calc(r_brick, median)
# Calculate sd
r_sd <- calc(r_brick, sd)

请注意r_meanr_medianr_sd都是RasterLayer

RasterBrick

的子集示例

我们可以使用索引来对图层进行子集化。例如,

r_sub <- r_brick[[1:3]]

r_subr_brick

的前三层

进行分析的功能

了解calc和子集的技术,我们可以设计一个函数来进行分析。

要做的第一件事是创建一个矢量作为年份和索引的参考。

# Create the index
ind <- 1:45
names(ind) <- 1971:2015

将年份号码调用ind将返回索引。例如,

# Get the index of 2015
ind[as.character(2015)]
#2015 
#  45

现在设计一个函数,它有五个参数

end_year:分析的最后一年

n_year:就结束年度而言的最后n

FUN:一个功能,例如meanmediansd

index:年份索引(ind

ras_brickRasterBrick

一起使用
# Define the function

raster_stat <- function(end_year, n_year, FUN, index, ras_brick){

  # Subset the raster
  index_temp <- index[as.character((end_year - n_year + 1):end_year)]
  ras_brick_temp <- ras_brick[[index_temp]]

  # Calculate the statistics
  ras_result <- calc(ras_brick, FUN)

  # Set the name
  names(ras_result) <- paste("Y", end_year, n_year, substitute(FUN), sep = "_")

  return(ras_result)
}

现在我们可以测试这个功能了。

raster_stat(2015, 5, FUN = sd, index = ind, ras_brick = r_brick)
#class       : RasterLayer 
#dimensions  : 10, 10, 100  (nrow, ncol, ncell)
#resolution  : 36, 18  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory
#names       : Y_2015_5_sd 
#values      : 12.05333, 14.61298  (min, max)

请注意raster_stat函数的结果名称为Y_2015_5_sd。这有助于确定应用了end_yearn_yearFUN

应用功能

我们可以使用for循环将raster_stat应用于所有end_yearn_year。以下是计算mean

的示例
# Set the range of end_year and n_year
end_year_vec <- 2000:2015
n_year_vec <- c(5, 10 , 15, 20, 30)

# Create an empty list to store result
r_mean_list <- list()

for (i in end_year_vec){
  for(j in n_year_vec){
      result_temp <- raster_stat(end_year = i, n_year = j, FUN = mean, 
                                 index = ind, ras_brick = r_brick)
      # Add the raster layer to the result_list
      r_mean_list[[names(result_temp)]] <- result_temp
  }
} 

所有结果都存储在r_mean_list中,并带有唯一的名称。我们可以对mediansd使用相同的方法。