首页 > 解决方案 > 在嵌套 for 循环中使用 rbind 问题

问题描述

我正在尝试打开和读取多个 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 等等。最后,我将拥有与每个文件夹内容相对应的五个数据框。

我写了一段代码,除了一个问题,它是列表中的第二个数据框包含附加到它的第二个文件 df2 的数据的 df1 的数据。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#而不是手动输入吗?

标签: rloopsrbind

解决方案


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

推荐阅读