Search code examples
rrasternetcdf

R - Calculate mean of rasterbrick


I am trying to calculate the mean of a rasterbrick over specific timesteps in R.

Subsetting the dataset shows a lay-out that appears to be correct (to me), however R does not allow any computations to follow up.

> r_sub <- b[[1699:1862]]
> r_sub
class      : RasterStack 
dimensions : 127, 147, 18669, 164  (nrow, ncol, ncell, nlayers)
resolution : 5, 5  (x, y)
extent     : 603299.4, 604034.4, 6615598, 6616233  (xmin, xmax, ymin, ymax)
crs        : NA 
names      : X2019.02.09.19, X2019.02.09.20, X2019.02.09.21, X2019.02.09.22, X2019.02.09.23, X2019.02.09.24, X2019.02.10.1, X2019.02.10.2, X2019.02.10.3, X2019.02.10.4, X2019.02.10.5, X2019.02.10.6, X2019.02.10.7, X2019.02.10.8, X2019.02.10.9, ... 

> r_mean <- calc(r_sub, mean)
Error in Rsx_nc4_get_vara_double: NetCDF: Index exceeds dimension bound
Var: SWIT  Ndims: 3   Start: 1698,0,0 Count: 1,127,147
Error in ncvar_get_inner(ncid2use, varid2use, nc$var[[li]]$missval, addOffset,  : 
  C function R_nc4_get_vara_double returned error

How to solve this specific error?


Solution

  • I am guessing that this is related to a problem with your file, not with the code.

    I did this and it worked well

    library(raster)
    b <- brick("filename.nc")
    r_sub <- b[[1699:1862]]
    r_sub
    #class      : RasterStack 
    #dimensions : 160, 320, 51200, 164  (nrow, ncol, ncell, nlayers)
    #resolution : 1.125, 1.121277  (x, y)
    #extent     : -0.5625, 359.4375, -89.70216, 89.70216  (xmin, xmax, ymin, ymax)
    #crs        : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
    
    mean(r_sub)
    #class      : RasterLayer 
    #dimensions : 160, 320, 51200  (nrow, ncol, ncell)
    #resolution : 1.125, 1.121277  (x, y)
    #extent     : -0.5625, 359.4375, -89.70216, 89.70216  (xmin, xmax, ymin, ymax)
    #crs        : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
    #source     : memory
    #names      : layer 
    #values     : 3.033032e-07, 0.0002482847  (min, max)
    

    Also, you might want to look into using stackApply