r - 在嵌套 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#而不是手动输入吗?
解决方案
#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)
})
推荐阅读
- jenkins - 如何在詹金斯管道(在机器2上)中查看远程詹金斯作业(在机器1上)
- javascript - GA 客户 ID 正在更改
- c++ - 如何创建平面图?(基于图的方法)
- angular - 在 Nativescript 上检查连接时出错
- java - 按钮 OnClickListener 给出 ViewPostImeInputStage ACTION_DOWN 错误
- c# - C# - Cosmos DB 批量更新插入
- date - 无法解析的日期 +01:00 groovy
- php - 单击多个复选框删除记录
- python - “如果语句与逻辑运算符'and'混淆逻辑错误”
- javascript - webpack bunde size 中模块导入的区别