R语言使用for循环按Run.Number拆分主数据框批量导出子文件
R语言按分组自动拆分数据框并批量导出CSV方案
你不需要手动修改迭代序号和对象名,用for循环配合基础R和dplyr的函数就能实现全流程自动化,后续即使Run.Number的取值数量变化,也不需要调整核心代码。
可直接运行的完整代码
你原有的加载包、读入Master List的步骤1代码不需要改动,直接把原来手动拆分的步骤2替换为以下代码即可:
# 配置项:提前定义列对应关系,后续要调整保留列直接改这里就行 origin_cols <- c( "On", "Prec..m/z", "Z", "Ret..Time.(min)", "Delta.Ret..Time.(min)", "Iso..Width", "Collision.Energy" ) export_colnames <- c( "On", "Prec. m/z", "Z", "Ret. Time (min)", "Delta Ret. Time (min)", "Iso. Width", "Collision Energy" ) # 自动提取Run.Number所有唯一值,无需手动数分组数量 run_list <- sort(unique(S1_MasterList$Run.Number)) # 批量循环处理 for (current_run in run_list) { # 筛选分组、选择保留列、重命名一步完成 temp_df <- S1_MasterList %>% filter(Run.Number == current_run) %>% select(all_of(origin_cols)) %>% setNames(export_colnames) # 自动拼接导出文件路径 export_path <- paste0( "/Users/owner/Documents/Research/Yurok/Bioassay/Bioassay Data/Runs/220425_neg_S2_Export_", current_run, ".csv" ) # 导出符合LC-MS格式要求的CSV文件 write.csv(temp_df, file = export_path, row.names = FALSE) # 如需将子数据框直接存入当前环境(和手动创建的S2_Export_x效果一致),保留下行即可 assign(paste0("S2_Export_", current_run), temp_df, envir = .GlobalEnv) # 控制台打印进度 cat("已完成序号", current_run, "分组的导出\n") }
注意事项
- 如果你确认Run.Number是连续的1-21整数,
run_list可以直接写为1:21,但用unique()提取的方式兼容性更强,即使分组序号不连续、起始值不为1也不会漏导或者报错 - 运行前请确认导出路径下的
Runs文件夹已经提前创建,否则会触发路径不存在的报错 - 你原手动代码里的管道写法存在语法问题:管道操作符会把前一步的输出作为后一个函数的第一个传入参数,不能直接在管道后写单独的赋值语句,用dplyr内置函数串联数据处理流程的写法可读性更高,也不容易出现语法错误
- 如果不需要在环境中保留21个单独的子数据框,直接删掉
assign开头的那行代码即可,不会影响CSV文件导出
内容的提问来源于stack exchange,提问作者bsaleeby
相关产品推荐
相关产品推荐

