如何用parLapplyLB并行读取不同工作表名的Excel工作簿?
用parLapplyLB读取不同Excel文件的对应工作表
当然可以实现,核心是把文件路径和对应工作表名称配对成统一的对象,让parLapplyLB遍历这个配对对象,就能在函数里同时获取两个关联信息。具体步骤如下:
1. 准备配对数据
首先你需要有一个和file.list顺序完全对应的工作表名称向量(比如sheet_names),然后将文件路径与工作表名打包成列表:
# 示例:假设file.list的顺序对应这些工作表名 sheet_names <- c("abc", "xyz", "def") # 将文件路径与工作表名配对为列表(每个元素是包含两个字段的小列表) file_sheet_pairs <- mapply( function(file, sheet) list(file_path = file, sheet_name = sheet), file.list, sheet_names, SIMPLIFY = FALSE )
如果工作表名可以从文件名自动提取(比如文件名是data_abc.xlsx这种格式),可以用正则表达式自动生成sheet_names,避免手动输入出错:
# 从文件名提取工作表名(示例:匹配"文件名_工作表名.xlsx"格式) sheet_names <- stringr::str_extract(basename(file.list), "(?<=_)\\w+(?=\\.xlsx)")
2. 并行读取文件
接下来修改parLapplyLB的调用,遍历配对后的列表,在函数中分别取出文件路径和工作表名:
# 确保集群节点已加载readxl包(如果还没初始化集群,先创建) # cl <- makeCluster(detectCores() - 1) # 可选:创建集群 clusterEvalQ(cl, library(readxl)) # 并行读取每个文件的对应工作表 test <- parLapplyLB(cl, file_sheet_pairs, function(pair) { readxl::read_excel(pair$file_path, sheet = pair$sheet_name) }) # 完成后关闭集群 stopCluster(cl)
原理说明
parLapplyLB的核心是遍历一个输入列表X,将每个元素传入自定义函数。通过把文件路径和工作表名打包成单个列表元素,就能让函数同时获取两个关联参数,解决了单参数遍历的限制。
内容的提问来源于stack exchange,提问作者user101874
相关产品推荐
相关产品推荐

