Raster R – Calculating Mean Values of All Cells in Raster Files using R

averagemeanrrasterterra

I have monthly raster (.tiff) files such as 200501.tif, 200502.tif and so on…till 202012.tif.

I want to calculate mean values of each raster (i.e. of all the cells (all rows and columns) of each raster file) (cellStats(r, 'mean')) and export them in a .csv or .xls as two columns:

Date     Value
Jan 2005  25
Feb 2005  36
...
...
...
Dec 2020  12

I am doing it in R.

Best Answer

You can use global function from {terra} library:

library(terra)

r = rast()

values(r) = 1:ncell(r)

global(r, 'mean')
#          mean
# lyr.1 32400.5

For a reproducible example I'm adding a list of random rasters loaded into a list:

library(terra)

set.seed(123)

r = rast()
rl <- sapply(1:48, function(X) setValues(r, rnorm(ncell(r))))

For computing mean for every element of the raster list, use lapply with global function:

means = lapply(rl, function(x) global(x, 'mean'))

means = do.call(rbind.data.frame, means)
row.names(means) = paste0(rep(2005:2008,each=12),sprintf("%02d",rep(1:12,times=4)))

head(means)
#                 mean
# 200501  0.0001132137
# 200502  0.0046515731
# 200503  0.0041824118
# 200504  0.0010558954
# 200505 -0.0035873522
# 200506  0.0027042357

For saving the result to your machine, use write.csv:

write.csv(means, 'path/to/means.csv')

Adaptation to OP code:

library(terra)

f = list.files(path="D:/Test/", pattern=".tiff$", full.names=TRUE)
rl = lapply(f, function(x) rast(x))

means = lapply(rl, function(x) global(x, 'mean'))
means = do.call(rbind.data.frame, means)

write.csv(means, 'path/to/means.csv')