Here’s a script that loops over climate NetCDF bricks in a folder and extracts the values for each layer in the brick of each file, in this case averaged over polygons in a shape file.
rm(list = ls()) library(raster) library(rgdal) library(ncdf4) library(reshape2) library(stringr) library(data.table) setwd("where your climate files are") your_shapefile <- readOGR("path to your shapefile","the layer name for your shapefile") climate <- rbindlist(lapply(list.files(pattern="nc"), function(climate_file) { #in my case, the weather variable is in the filename climate_var = ifelse(grepl("pr",climate_file),"pr",ifelse(grepl("tmax",climate_file),"tmax","tmin")) print(climate_var) climate_variable <- brick(climate_file,varname=climate_var,stopIfNotEqualSpaced=FALSE) #I needed to shift the x-axis to be on a -180 to 180 scale extent(climate_variable)=c(xmin(climate_variable)-360, xmax(climate_variable)-360, ymin(climate_variable), ymax(climate_variable)) blocks <- spTransform(blocks,projection(climate_variable)) r.vals <- extract(climate_variable, blocks, fun=mean,na.rm=TRUE,df=TRUE,layer=1,nl=1680) r.vals <- melt(r.vals, id.vars = c("ID"),variable.name = "date") r.vals$climate <- climate_var #depending on the filename convention of your files, get a variable for your climate model and name it "modelname" r.vals$model <- modelname climate_variables[[length(climate_variables)+1]] <- r.vals })) climate <- rbindlist(climate_variables)
At this point, you have a data frame called “climate” that has all your data long-form. You can cast this as you see appropriate depending on your needs!