如何用tidyverse方法保存数据框列表为原文件名CSV文件
解决方案
问题出在你的df_list没有设置原始文件名作为列表元素的名称,所以imap中的.y默认取的是列表的索引序号(1、2...),而非文件名。以下是修正后的完整流程:
1. 修正文件读取代码(改用tidyverse风格)
用map读取文件,同时直接给列表设置原始文件名作为元素名称:
library(tidyverse) # 获取所有CSV文件的完整路径 df_paths <- dir(pattern = "\\.csv$", full.names = TRUE) # 提取纯文件名(去掉路径部分),作为列表元素的名称 df_names <- basename(df_paths) # 读取所有文件并生成带名称的数据框列表 df_list <- map(df_paths, ~read_csv(.x, sep = ";")) %>% set_names(df_names)
2. 导出CSV文件(保留原文件名)
直接用imap,此时.y会取到每个列表元素对应的原始文件名:
imap(df_list, ~write_csv(.x, path = .y))
如果你不想修改原读取代码
可以在保存前手动给df_list添加名称:
# 给已有的df_list设置文件名 names(df_list) <- basename(df) # 再执行导出 imap(df_list, ~write_csv(.x, path = .y))
补充说明
basename()函数用于从完整路径中提取纯文件名(比如/data/file1.csv会变成file1.csv),如果需要保留完整路径作为输出路径,直接用df_paths作为列表名称即可。- 原读取代码中的
seq_along(networks)是笔误,应该替换为seq_along(df),否则会报错。
内容的提问来源于stack exchange,提问作者Luiz Gabriel Ferreira
相关产品推荐
相关产品推荐

