Search code examples
rrastertiff

Finding a value for a variable according to different elevations


I have a DEM raster file of a specific region

DEMRASTER

class      : RasterLayer 
dimensions : 47, 89, 4183  (nrow, ncol, ncell)
resolution : 0.5, 0.5  (x, y)
extent     : 60.75, 105.25, 15.75, 39.25  (xmin, xmax, ymin, ymax)
crs        : NA 
source     : memory
names      : newlowelevation1 
values     : 1, 6136.012  (min, max)

I have another raster file of variable "GPP":

GPPRASTER
class      : RasterLayer 
dimensions : 47, 89, 4183  (nrow, ncol, ncell)
resolution : 0.5, 0.5  (x, y)
extent     : 60.75, 105.25, 15.75, 39.25  (xmin, xmax, ymin, ymax)
crs        : NA 
source     : memory
names      : layer 
values     : -0.333333, 0  (min, max)

How can I find the values of the GPP raster according to elevation? For instance, if I want to find a mean value of GPP for elevation from 0-2000m or 5500 to 6136m? What will be the basic code for this?

I have tried removing pixels based on the elevation that I did not want from the DEM raster file, but it is a method that takes too long. I am sure that there is a code for this, but can't put my hand on it as I am a new beginner at R myself. Thanks in advance!


Solution

  • Here is a minimal self-contained, reproducible example:

    library(raster)
    elev <- raster(ncol=47, nrow=89, ext=extent(60.75, 105.25, 15.75, 39.25))
    elev <- init(elev, "cell")
    gdp <- flip(elev, "y")/100
    

    Solution:

    ezones <- cut(elev, c(0,1000,2000,Inf))
    zonal(gdp, ezones)
    #     zone     mean
    #[1,]    1 36.83058
    #[2,]    2 26.83396
    #[3,]    3 10.92250
    

    Or with terra:

    library(terra)
    #terra version 1.2.1
    ev <- rast(ncol=47, nrow=89, ext=ext(60.75, 105.25, 15.75, 39.25))
    ev <- init(ev, "cell")
    gd <- flip(ev, "vertical")/100
    names(gd) <- "gdp"
    names(ev) <- "elevation"
    

    Solution:

    ez <- classify(ev, c(0,1000,2000,Inf))
    zonal(gd, ez)
    #    elevation      gdp
    #1    0 - 1000 36.83580
    #2 1000 - 2000 26.84370
    #3  2000 - inf 10.92752