You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何批量读取多路径CSV并按对应路径分别合并

R语言批量按受试者维度合并文件夹内CSV文件方案

针对当前目录结构(每个受试者ID对应独立文件夹,文件夹内存放需合并的同结构CSV),无需逐人手动调用rbind,直接通过循环逻辑批量处理即可,230个受试者的全量数据数秒即可跑完,以下是两种可直接复用的实现:


基础R实现(无需安装额外包)

核心逻辑是遍历所有受试者文件夹,批量读取文件夹内CSV后一次性按行合并,自动绑定受试者ID避免数据混淆。

  • 首先将R工作路径设置为所有受试者文件夹的上级根目录(即存放subject1、subject2……文件夹的顶层目录):
    # 替换为个人根目录实际路径,Windows系统注意把路径里的反斜杠改成正斜杠
    setwd("C:/your_project/raw_data")
    
  • 获取所有有效受试者文件夹路径,自动过滤非目录文件、系统隐藏文件:
    # 提取第一层所有子文件夹路径
    subj_folders <- list.dirs(full.names = TRUE, recursive = FALSE)
    # 匹配命名规则,只保留受试者文件夹(如果文件夹前缀不是subject可自行修改匹配规则)
    subj_folders <- subj_folders[grepl("^subject", basename(subj_folders))]
    
  • 执行循环批量合并:
    # 初始化空列表存储所有受试者的合并结果,列表名直接对应受试者ID
    merged_result <- list()
    
    for (folder in subj_folders) {
      # 从文件夹路径提取当前受试者ID
      current_id <- basename(folder)
      # 获取当前文件夹下所有CSV文件的完整路径
      current_csvs <- list.files(folder, pattern = "\\.csv$", full.names = TRUE)
      
      # 批量读取当前受试者的所有CSV文件
      df_list <- lapply(current_csvs, function(csv_path) {
        # 可根据文件实际格式调整参数:比如加fileEncoding="GBK"适配中文编码,sep=";"适配分号分隔的文件
        read.csv(csv_path, stringsAsFactors = FALSE)
      })
      
      # 一次性合并当前受试者的所有数据,效率远高于逐次调用rbind
      current_merged <- do.call(rbind, df_list)
      # 新增subjectID列,标记数据归属
      current_merged$subjectID <- current_id
      
      # 存入结果列表
      merged_result[[current_id]] <- current_merged
      
      # 可选:直接将单个受试者的合并结果存为独立CSV到根目录,减少内存占用
      write.csv(current_merged, paste0(current_id, "_merged.csv"), row.names = FALSE)
    }
    

如果后续需要把所有受试者的数据拼成一张总表,直接运行all_subjects_df <- do.call(rbind, merged_result)即可。


tidyverse实现(代码更简洁,适配大文件)

如果日常用tidyverse生态做数据处理,可以用更简洁的写法,大文件读取和合并速度更快:

# 首次使用先运行安装:install.packages("tidyverse")
library(tidyverse)

# 设置根目录
setwd("C:/your_project/raw_data")

# 递归查找所有层级下的CSV文件,自动关联路径信息
all_csv_paths <- list.files(pattern = "\\.csv$", recursive = TRUE, full.names = TRUE)

# 批量读取、打标、按受试者分组合并
merged_result <- map_df(all_csv_paths, function(path) {
  # 从文件路径拆分出所属受试者ID
  subj_id <- str_split(path, "/", simplify = TRUE)[1,1]
  # 读取CSV并新增ID列
  read_csv(path, show_col_types = FALSE) %>% 
    mutate(subjectID = subj_id)
}) %>% 
  # 按subjectID拆分,得到和基础方案一致的按人存储的列表
  group_split(subjectID, .keep = TRUE)

注意事项

  • 运行前请确认所有CSV的列名、列数据结构一致,否则合并会报错;如果存在少量列不匹配的情况,可以把基础方案里的rbind替换成dplyr::bind_rows(),缺失列会自动填充为NA
  • 如果文件总量较大担心内存不足,建议用基础方案里的逐人写入磁盘的方式,不要把所有数据都存在内存列表里
  • 如果读取CSV出现乱码、列错位问题,优先调整read.csv/read_csv的编码、分隔符参数适配源文件格式

内容的提问来源于stack exchange,提问作者BrySeye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:18:49