I want to put extract multiple NETCDF files using loop in R. The code I have made is for single file but I am stuck to apply loop for this code. Need help please.
nc_fname <- "1981_01_20_25.nc"
nc_ds <- nc_open(nc_fname)
dim_lon <- ncvar_get(nc_ds, "longitude")
dim_lat <- ncvar_get(nc_ds, "latitude")
dim_time <- ncvar_get(nc_ds, "time")
t_units <- ncatt_get(nc_ds, "time", "units")
t_ustr <- strsplit(t_units$value, " ")
t_dstr <- strsplit(unlist(t_ustr)\[3\], "-")
date <- ymd(t_dstr) + dhours(dim_time)
date
coords <- as.matrix(expand.grid(dim_lon, dim_lat, date))
var1 <- ncvar_get(nc_ds, "mn2t", collapse_degen=FALSE)
var2 <- ncvar_get(nc_ds, "mx2t", collapse_degen=FALSE)
var3 <- ncvar_get(nc_ds, "t2m", collapse_degen=FALSE)
var4 <- ncvar_get(nc_ds, "slt", collapse_degen=FALSE)
var5 <- ncvar_get(nc_ds, "swvl1", collapse_degen=FALSE)
var6 <- ncvar_get(nc_ds, "u10", collapse_degen=FALSE)
var7 <- ncvar_get(nc_ds, "e", collapse_degen=FALSE)
var8 <- ncvar_get(nc_ds, "ro", collapse_degen=FALSE)
var9 <- ncvar_get(nc_ds, "tp", collapse_degen=FALSE)
var10 <- ncvar_get(nc_ds, "lai_hv", collapse_degen=FALSE)
var11 <- ncvar_get(nc_ds, "lai_lv", collapse_degen=FALSE)
nc_df <- data.frame(cbind(coords, var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11))
names(nc_df) <- c("lon", "lat", "time", "Mintemp", "Maxtemp","Temp","SoilType","SoilVol_1",
"Wind","Evap","Runoff","Prec","LAI_H","LAI_L")
csv_fname <- "netcdf_filename.csv"
write.csv(nc_df, "1981_01_20_25.csv")
I have tried to modified it but its not working.
If you can create a list of all of your file names with dir()
or list.files()
, you can index these files in the first and last steps like this:
setwd("YOUR/WORKING/DIRECTORY")
FilesList<-dir(pattern="\\.nc$")
for(i in 1:length(FilesList)){
nc_fname <- FilesList[i]
nc_ds <- nc_open(nc_fname)
dim_lon <- ncvar_get(nc_ds, "longitude")
dim_lat <- ncvar_get(nc_ds, "latitude")
dim_time <- ncvar_get(nc_ds, "time")
t_units <- ncatt_get(nc_ds, "time", "units")
t_ustr <- strsplit(t_units$value, " ")
t_dstr <- strsplit(unlist(t_ustr)\[3\], "-")
date <- ymd(t_dstr) + dhours(dim_time)
date
coords <- as.matrix(expand.grid(dim_lon, dim_lat, date))
var1 <- ncvar_get(nc_ds, "mn2t", collapse_degen=FALSE)
var2 <- ncvar_get(nc_ds, "mx2t", collapse_degen=FALSE)
var3 <- ncvar_get(nc_ds, "t2m", collapse_degen=FALSE)
var4 <- ncvar_get(nc_ds, "slt", collapse_degen=FALSE)
var5 <- ncvar_get(nc_ds, "swvl1", collapse_degen=FALSE)
var6 <- ncvar_get(nc_ds, "u10", collapse_degen=FALSE)
var7 <- ncvar_get(nc_ds, "e", collapse_degen=FALSE)
var8 <- ncvar_get(nc_ds, "ro", collapse_degen=FALSE)
var9 <- ncvar_get(nc_ds, "tp", collapse_degen=FALSE)
var10 <- ncvar_get(nc_ds, "lai_hv", collapse_degen=FALSE)
var11 <- ncvar_get(nc_ds, "lai_lv", collapse_degen=FALSE)
nc_df <- data.frame(cbind(coords, var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11))
names(nc_df) <- c("lon", "lat", "time", "Mintemp", "Maxtemp","Temp","SoilType","SoilVol_1",
"Wind","Evap","Runoff","Prec","LAI_H","LAI_L")
csv_fname <- "netcdf_filename.csv" ## I am not sure you need this line, it doesn't get called again
write.csv(nc_df, paste0(gsub("\\.nc$","",FilesList[i]),".csv"))
}