我在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)
答案 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_mean
,r_median
和r_sd
都是RasterLayer
。
我们可以使用索引来对图层进行子集化。例如,
r_sub <- r_brick[[1:3]]
r_sub
是r_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
:一个功能,例如mean
,median
和sd
index
:年份索引(ind
)
ras_brick
:RasterBrick
与
# 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_year
,n_year
和FUN
。
我们可以使用for循环将raster_stat
应用于所有end_year
和n_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
中,并带有唯一的名称。我们可以对median
和sd
使用相同的方法。