在嵌套的 for 循环中使用 rbind 问题

using rbind problem inside nested for loop

我正在尝试打开和读取多个 NetCDF 文件,我想将结果保存到一个包含许多数据框的列表中。 在我的工作目录中,文件夹 "main_folder" 包含五个文件夹(x1、x2、x3、x4 和 x5),这五个文件夹中的每个文件夹都包含不同数量的子文件夹,例如文件夹 x1 包含文件夹 "y1" 到 "y20" 的子文件夹。文件夹 y1 包含 n1 个 NetCDF 文件。文件夹 y2 包含 n2 个 NetCDF 文件等。与其他文件夹 x2、x3、x4、x5 类似。 从文件夹 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# 步而不是手动输入吗?

#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)
})