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

使用map_df读取多子目录CSV文件遇空列表问题求助

解决多子目录CSV文件读取问题

先梳理你代码里的几个核心问题:

  • 循环中用了未定义的变量i,且paste0(i)存在语法错误(缺少闭合括号)
  • list.files默认返回仅文件名,直接传给read_csv会因路径不全找不到文件
  • 手动用paste拼接路径易出现斜杠缺失/重复,应该用file.path做标准化路径拼接
  • 最终没有将各子目录读取的DataFrame合并为一个整体

下面提供两种基于tidyverse的简洁解决方案:

方法1:递归遍历所有子目录(推荐)

直接用list.files的递归参数一次性获取所有CSV的完整路径,再批量读取合并:

library(tidyverse)

common_path <- "/home/documents/myfolder/mysubfolder"

# 获取所有子目录下的CSV完整路径
all_csv_paths <- list.files(
  path = common_path,
  pattern = "\\.csv$",  # 用正则精准匹配.csv结尾的文件
  recursive = TRUE,
  full.names = TRUE     # 返回完整绝对路径,确保read_csv能定位文件
)

# 读取并合并所有CSV
df <- all_csv_paths %>% map_df(read_csv)

方法2:手动遍历子目录(适合需对子目录做额外处理的场景)

如果需要逐个处理子目录(比如标记文件来源),可以遍历子目录列表再读取文件:

library(tidyverse)

common_path <- "/home/documents/myfolder/mysubfolder"

# 获取所有子目录的完整路径
primary_dirs <- list.files(
  path = common_path,
  full.names = TRUE,
  recursive = FALSE
)

# 遍历每个子目录,读取CSV并合并,可添加字段标记来源目录
df <- primary_dirs %>% 
  map_dfr(function(dir) {
    csv_files <- list.files(
      path = dir,
      pattern = "\\.csv$",
      full.names = TRUE
    )
    csv_files %>% map_df(read_csv) %>% mutate(source_directory = dir)
  })

关键注意点

  • full.names = TRUE是必须设置的参数,确保返回的路径是完整可直接使用的
  • 用\\.csv$正则匹配比*.csv更严谨,避免误匹配带.csv后缀的非CSV文件
  • map_dfr等价于map %>% bind_rows,能自动将多个DataFrame按行合并,无需手动维护列表

内容的提问来源于stack exchange,提问作者i.b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:05:04