Search code examples
rscalerasterr-raster

scale individual cell in a raster stack


library(raster)
r <- raster(ncol=10, nrow=10)
s <- stack(lapply(1:5, function(i) setValues(r, runif(100, -1, 1))))

I want to do two things:

  1. replace negative values with NA in each raster layer

  2. scale each cell using the mean and standard deviation for that cell across the 5 layers

    for(i in 1:5){
    
     s[[i]][s[[i]] < 0] <- NA
    }
    

For the second task, how can I scale individual cell using its mean and standard deviation along the raster layer. For e.g. Is the following implementation correct?

scale(s, center = TRUE, scale = TRUE)

I think what it is doing is taking a layer, calculate the layer mean and sd and then normalising each cell by using this mean and sd. What I want is to normalise each cell using its mean and sd across the 5 layers


Solution

  • To replace negative values with NA you can use reclassify

    Example data

    library(raster)
    r <- raster(ncol=10, nrow=10)
    s <- stack(lapply(1:5, function(i) setValues(r, runif(100, -1, 1))))
    

    Solution

    x <- reclassify(s, cbind(-Inf, 0, NA))
    

    To apply scale, or a similar function, to each cell, you can use calc

    z <- calc(x, scale)