使用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
相关产品推荐
相关产品推荐

