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

R语言如何批量导入多层子文件夹Excel并添加对应标识列

R语言多层级文件夹批量导入Excel文件实现方案

前置依赖安装加载

使用readxl包读取Excel文件,tidyverse套件做路径处理、批量循环和数据合并,首次运行先执行安装:

# 安装缺失依赖
if (!require("tidyverse")) install.packages("tidyverse")
if (!require("readxl")) install.packages("readxl")

# 加载包
library(tidyverse)
library(readxl)

第一步:提取所有文件路径与标识信息

先递归遍历Data文件夹下所有Excel文件,从路径中直接提取被试ID、测试轮次(Lap)标识,避免后续手动打标签:

# 替换为你本地项目的根目录绝对路径,Windows注意把路径反斜杠改成正斜杠
root_path <- "C:/your_project_path"
data_dir <- file.path(root_path, "Data")

# 生成文件信息表
file_tb <- tibble(
  file_path = list.files(data_dir, pattern = "\\.xlsx$", recursive = TRUE, full.names = TRUE)
) %>%
  mutate(
    # 提取被试ID:匹配"subj 数字"格式,去掉中间空格得到subj1、subj2格式
    `Subject ID` = str_extract(file_path, "subj \\d+") %>% str_remove(" "),
    # 提取Lap标识:从文件名中匹配T+数字的规则
    Lap = str_extract(basename(file_path), "T\\d+")
  )

执行完建议先运行View(file_tb)检查结果,确认没有文件遗漏、Subject ID和Lap列没有缺失值,再进行后续导入。

第二步:批量导入并生成带标识的总数据框

遍历文件信息表逐份读取Excel,自动绑定之前提取的两列标识,最终合并为一个完整数据框:

all_data <- file_tb %>%
  # 逐文件读取,读取时绑定Lap标识
  mutate(
    df = map2(file_path, Lap, ~read_excel(.x) %>% mutate(Lap = .y))
  ) %>%
  # 展开所有数据,自动绑定Subject ID列
  unnest(df) %>%
  # 移除冗余的文件路径列
  select(-file_path)

运行完成后all_data就是你需要的、带Subject ID和Lap两列标识的总数据集。

按被试拆分独立数据框

如果需要为每个被试生成单独的数据框,直接按Subject ID拆分即可:

# 拆分得到被试数据框列表,列表名对应被试ID
subj_df_list <- all_data %>%
  group_split(`Subject ID`) %>%
  set_names(unique(all_data$`Subject ID`))

# 可选:直接将所有被试数据框批量输出到全局环境,直接输入subj1、subj2即可调用对应数据
list2env(subj_df_list, envir = .GlobalEnv)

更推荐保留列表格式存储被试数据,后续做批量统计、建模时可以直接用map/lapply遍历列表,不需要手动写60次重复代码。

常见问题调整

  • 如果文件是.xls格式,把list.files里的匹配规则改为pattern = "\\.xls$"即可
  • 如果Excel列类型识别错误,在read_excel()内加col_types参数手动指定列格式
  • 如果不同Excel文件列名不统一,提前统一列名再合并,否则unnest时会自动对不匹配的列填充NA
  • 如果每个Excel包含多个sheet,可在read_excel内指定sheet序号,或嵌套一层sheet遍历逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:30:16