R中多个栅格的累积总和

时间:2014-06-26 11:34:44

标签: r gis raster

我每天有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
  } 

当我尝试为每个栅格添加一个常量等时,这个循环有效,但我不知道如何计算累积和。

1 个答案:

答案 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)
    })

您在此处创建的栅格存储在内存中,因此如果原始文件非常大,您可能会遇到问题。