использование проблемы rbind внутри вложенного цикла for - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь открыть и прочитать несколько файлов NetCDF и хочу сохранить результат в одном списке из множества фреймов данных. в моем рабочем каталоге у меня есть папка "main_folder", содержащая пять папок (x1, x2, x3, x4 и x5), каждая папка из этих пяти содержит различное количество подпапок, скажем, например, папка x1 содержит подпапки изпапка "y1", "y20". папка y1 содержит n1 количество файлов NetCDF. папка y2 содержит n2 количество файлов NetCDF и так далее. аналогично для других папок х2, х3, х4, х5. Из папки x1 я хочу открыть, прочитать и получить переменные из всех файлов NetCDF и сделать их одним кадром данных df1. и из папки x2 я хочу сделать второй фрейм данных df2 и так далее. В конце у меня будет пять фреймов данных, соответствующих содержимому каждой папки. и затем я хочу составить список из этих пяти фреймов данных.

Я написал один код, он работает, за исключением одной проблемы: второй фрейм данных в списке содержит данные df1, к ним добавлены данныевторой файл df2. и df5 содержит данные df1 + df2 + df3 + df4 + df5. Как я могу решить эту проблему. вот мой код

setwd("E:/main_folder")
#1#  list all files in the main_folder
folders<- as.list(list.files("E:/main_folder"))

#2# make list of subfiles 
subfiles<- lapply(folders, function(x) as.list(list.files(paste("E:/main_folder",x, sep="/"))))

#3# list the netcdf files from each subfiles
files1<- lapply(subfiles[[1]], function(x) list.files(paste( folders[1],x, sep = "/"),pattern='*.nc',full.names=TRUE))
files2<- lapply(subfiles[[2]], function(x) list.files(paste( folders[2],x, sep = "/"),pattern='*.nc',full.names=TRUE))
files3<- lapply(subfiles[[3]], function(x) list.files(paste( folders[3],x, sep = "/"),pattern='*.nc',full.names=TRUE))
files4<- lapply(subfiles[[4]], function(x) list.files(paste( folders[4],x, sep = "/"),pattern='*.nc',full.names=TRUE))
files5<- lapply(subfiles[[5]], function(x) list.files(paste( folders[5],x, sep = "/"),pattern='*.nc',full.names=TRUE))

#4# join all files in one list
filelist<- list(files1,files2,files3,files4,files5)



#5# Read the NetCDF and get the desired variables 
df<-  data.frame()
MissionsData<- list()
for (i in seq_along(filelist)){
  n<- length(filelist[[i]])
  for (j in 1:n){
    for( m in 1:length( filelist[[i]][[j]])){
   nc<- nc_open(filelist[[i]][[j]][[m]])
lat<-  ncvar_get(nc, "glat.00")
lon<- ncvar_get(nc, "glon.00")
ssh<-  ncvar_get(nc, "ssh.53")
jdn<- ncvar_get(nc, "jday.00")

df<- rbind(df,data.frame(lat,lon,ssh,jdn))
nc_close(nc)
    }
  }

  MissionsData[[i]]<- df

}

Кроме того, можно ли выполнить шаг # 3 # за один раз вместо того, чтобы вводить их вручную?

1 Ответ

1 голос
/ 11 ноября 2019
#3 Nesting the code inside another `lapply` should do the job:

filelist = lapply(subfiles, function(subfile){
    lapply(subfile, function(x) list.files(paste(folders[1],x, sep = "/"),
    pattern='*.nc', full.names=TRUE))
})

#This might work as #5. 
#It was written without reproducible code so I didn't test it  

MissionsData = lapply(filelist, function(x){
    # I don't see the j and m indexes used for any other purpose than looping
    # so I just unlist these files into a vector 
    files_i = unlist(x, recursive = TRUE)
    df_list = lapply(files_i, function(file_i){
        nc = nc_open(file_i)
        lat = ncvar_get(nc, "glat.00")
        lon = ncvar_get(nc, "glon.00")
        ssh = ncvar_get(nc, "ssh.53")
        jdn = ncvar_get(nc, "jday.00") 
        nc_close(nc)  
        return(data.frame(lat,lon,ssh,jdn))
    })
    df = do.call(rbind, df_list)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...