我每天有200个带有气温的栅格存储在一个目录中,我希望每天的温度累积总和,例如:
day1 = day1; day2 = day1 + day2; day3 = day1 + day2 + day3等
我尝试在raster
包中执行此操作,但cumsum
函数计算每个栅格中所有单元格的累积总和,而不是各个栅格的累积总和(至少从我的结果看来) 。
我试着这样做:
library(raster)
setwd("C:/Air_temperatures/AT") # set working directory
AT.files <- list.files(pattern="AT") # list files with name AT
All.AT <- unique(AT.files) # unique files
for (i in 1:200) {
AT.i <- All.AT[i] # make i
AT.raster.i<-raster(AT.i) # make rasters from files
AT.sum.i <- cumsum(AT.raster.i) # ???calculate cumulative sum???
writeRaster(AT.sum.i,
paste(AT.i, "_cumsum.tif", sep = ""),
datatype='FLT4S', overwrite=TRUE) # write new files and paste new name
}
当我尝试为每个栅格添加一个常量等时,这个循环有效,但我不知道如何计算累积和。
答案 0 :(得分:2)
Reduce
功能可能对此有所帮助。该函数依次根据指定的函数组合对象。由于+
个对象有Raster*
方法,因此您可以将其用作函数并获取栅格值的累积和。
首先,在列表中创建200个栅格对象:
theATs <- lapply(All.AT, raster)
然后,使用Reduce
函数并将accumulate
参数设置为TRUE
res <- Reduce("+", theATs, accumulate = TRUE)
然后将结果写入文件:
lapply(seq_along(res), function(x) {
writeRaster(res[[x]],
# Apparently, using .tif files threw an error
# paste(All.AT[x], "_cumsum.tif", sep = ""),
# Alternatively, omit file extension to write default type (usually .grd)
paste(All.AT[x], "_cumsum", sep = ""),
datatype = 'FLT4S', overwrite = TRUE)
})
您在此处创建的栅格存储在内存中,因此如果原始文件非常大,您可能会遇到问题。