在嵌套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,依此类推。 最后,我将有五个与每个文件夹内容相对应的数据帧。然后我要列出这五个数据帧的列表。

我写了一个代码,它起作用了,除了一个问题,该问题是列表中的第二个数据帧包含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],sep = "/"),pattern='*.nc',full.names=TRUE))
files2<- lapply(subfiles[[2]],function(x) list.files(paste( folders[2],full.names=TRUE))
files3<- lapply(subfiles[[3]],function(x) list.files(paste( folders[3],full.names=TRUE))
files4<- lapply(subfiles[[4]],function(x) list.files(paste( folders[4],full.names=TRUE))
files5<- lapply(subfiles[[5]],function(x) list.files(paste( folders[5],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步,而不必手动输入吗?

wkao0705120104 回答:在嵌套for循环内使用rbind问题

#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)
})
本文链接:https://www.f2er.com/3125394.html

大家都在问