R语言如何编写循环遍历dataframe行生成含多变量的正确文件路径
问题根源
你使用三层嵌套循环的逻辑是将Name、Institution、Department三列的所有取值做全排列拼接,而非和DataFrame每行对应的三个字段绑定,因此会生成444=64条不符合预期的路径,远多于你需要的4条路径,这就是多余文件、目录不存在报错的核心原因。
修复方案
方案1:单层按行循环(最易理解,和你原有写法兼容性最高)
注意:请确认你存储人员全量数据的DataFrame变量名,代码中统一用
Data指代,如果你实际变量名是data请自行替换;另外需要补全你自己的模板文件路径。
library(openxlsx) # 用到loadWorkbook等函数需要提前加载该包 parent_dir <- "Documents/Files" template_path <- "你的模板文件路径.xlsx" # 先批量生成所有目标路径,提前创建不存在的目录避免报错 List$file_path <- file.path(parent_dir, List$Institution, List$Department, paste0(List$Name, ".xlsx")) # 提取所有路径的目录部分,去重后批量创建 dir_paths <- unique(dirname(List$file_path)) lapply(dir_paths, function(p) dir.create(p, recursive = TRUE, showWarnings = FALSE)) # 单层循环遍历每一行即可 for (i in 1:nrow(List)) { current_name <- List$Name[i] current_path <- List$file_path[i] # 提取对应人员数据 answer <- Data[Data$Name == current_name, ] # 复制模板写入数据 file.copy(template_path, current_path, overwrite = TRUE) wb <- loadWorkbook(current_path, create = FALSE) writeWorksheet(wb, answer, sheet = "Staff", header = FALSE) saveWorkbook(wb, current_path, overwrite = TRUE) }
方案2:向量化操作(更符合R的书写习惯,效率更高)
如果数据量较大,可以用apply系列函数替代显式循环:
library(openxlsx) parent_dir <- "Documents/Files" template_path <- "你的模板文件路径.xlsx" # 生成路径+创建目录 List$file_path <- file.path(parent_dir, List$Institution, List$Department, paste0(List$Name, ".xlsx")) dir_paths <- unique(dirname(List$file_path)) lapply(dir_paths, function(p) dir.create(p, recursive = TRUE, showWarnings = FALSE)) # 批量处理文件 invisible(apply(List, 1, function(row) { current_name <- row[["Name"]] current_path <- row[["file_path"]] answer <- Data[Data$Name == current_name, ] file.copy(template_path, current_path, overwrite = TRUE) wb <- loadWorkbook(current_path, create = FALSE) writeWorksheet(wb, answer, sheet = "Staff", header = FALSE) saveWorkbook(wb, current_path, overwrite = TRUE) }))
内容的提问来源于stack exchange,提问作者Beni
相关产品推荐
相关产品推荐

