Я хочу извлечь 365 файлов netcdf, используя цикл - PullRequest
0 голосов
/ 02 июля 2019

У меня есть код в R, который извлекает данные для одного файла netcdf.Тем не менее, у меня есть 365 файлов netcdf.Я хочу извлечь данные из всех этих файлов с помощью цикла и записать их в отдельные файлы CSV.

Я подготовил код для одного файла.Нужна помощь для нескольких файлов netcdf.

library(ncdf4)
ncname = "ESACCI-L3S_SOILMOISTURE-SSMV-MERGED-19781102000000-fv00.1"
ncfname = paste(ncname, ".nc", sep = "")
dname = "sm"
ncin = nc_open(ncfname)
print(ncin)
lon <- ncvar_get(ncin, "lon")
nlon <- dim(lon)
head(lon)
lat <- ncvar_get(ncin, "lat", verbose = F)
nlat <- dim(lat)
head(lat)
print(c(nlon, nlat))
sm_array <- ncvar_get(ncin,dname)
dlname <- ncatt_get(ncin,dname,"long_name")
dunits <- ncatt_get(ncin,dname,"units")
fillvalue <- ncatt_get(ncin,dname,"_FillValue")
dim(sm_array)
ls()
m <- 1
sm.slice <- sm_array[,]
sm.vec <- as.vector(sm.slice)
length(sm.vec)
lonlat <- expand.grid(lon, lat)
sm.df01 <- data.frame(cbind(lonlat, sm.vec))
names(sm.df01) <- c("lon", "lat", paste(dname, as.character(m), sep = "_"))
head(na.omit(sm.df01), 20)
csvfile <- "sm_trial2.csv"
write.table(na.omit(sm.df01), csvfile, row.names = FALSE, sep = ",")

Мне нужно изменить этот код для 365 файлов netcdf.

1 Ответ

3 голосов
/ 02 июля 2019

Я бы порекомендовал обернуть ваш код в функцию и использовать lapply() следующим образом:

library(ncdf4)

my_read_function <- function(ncname) {
  ncfname = ncname
  dname = "sm"
  ncin = nc_open(ncfname)
  print(ncin)
  lon <- ncvar_get(ncin, "lon")
  nlon <- dim(lon)
  head(lon)
  lat <- ncvar_get(ncin, "lat", verbose = F)
  nlat <- dim(lat)
  head(lat)
  print(c(nlon, nlat))
  sm_array <- ncvar_get(ncin,dname)
  dlname <- ncatt_get(ncin,dname,"long_name")
  dunits <- ncatt_get(ncin,dname,"units")
  fillvalue <- ncatt_get(ncin,dname,"_FillValue")
  dim(sm_array)
  ls()
  m <- 1
  sm.slice <- sm_array[,]
  sm.vec <- as.vector(sm.slice)
  length(sm.vec)
  lonlat <- expand.grid(lon, lat)
  sm.df01 <- data.frame(cbind(lonlat, sm.vec))
  names(sm.df01) <- c("lon", "lat", paste(dname, as.character(m), sep = "_"))
  head(na.omit(sm.df01), 20)
  csvfile <- paste0(ncname, ".csv")  ## change the outfile name appropriately
  write.table(na.omit(sm.df01), csvfile, row.names = FALSE, sep = ",")
}

my_files <- list.files("/path/to/all/those/files")
lapply(my_files, my_read_function)
...