如何将数据导入命名列表?含lapply与purrr::map实现方法
给导入的CSV列表添加名称(含lapply/purrr实现)
问题场景
你已通过以下代码导出并导入CSV文件,但得到的imported_files列表没有名称:
# 导出数据为CSV write.csv(mtcars, "mtcars.csv") write.csv(iris, "iris.csv") # 获取CSV文件列表 files <- list.files(pattern="*.csv") # 循环导入文件 imported_files <- list() for(i in seq_along(files)){ imported_files[[i]] <- readr::read_csv(file = files[[i]]) } # 查看列表名称 names(imported_files) # NULL
你希望列表名称对应去掉.csv后缀的文件名,比如:
names(imported_files) # "iris" "mtcars"
解决方案
1. 修改原循环代码
核心是先提取去掉后缀的文件名,再给列表元素直接命名:
# 获取文件名(自动去掉.csv后缀) file_names <- tools::file_path_sans_ext(files) # 循环导入时指定列表元素名称 imported_files <- list() for(i in seq_along(files)){ imported_files[[file_names[i]]] <- readr::read_csv(file = files[[i]]) } # 验证名称 names(imported_files) # 输出结果示例:"mtcars" "iris"(顺序由list.files返回的文件顺序决定)
2. 使用lapply实现
可以分两步完成,也可以用setNames一步到位:
file_names <- tools::file_path_sans_ext(files) # 方法一:先导入再命名 imported_files <- lapply(files, readr::read_csv) names(imported_files) <- file_names # 方法二:一步完成 imported_files <- setNames(lapply(files, readr::read_csv), file_names)
3. 使用purrr::map实现
结合purrr的set_names函数,支持管道写法更简洁:
library(purrr) file_names <- tools::file_path_sans_ext(files) # 方法一:先map再命名 imported_files <- map(files, readr::read_csv) imported_files <- set_names(imported_files, file_names) # 方法二:管道一步完成 imported_files <- map(files, readr::read_csv) %>% set_names(file_names)
补充说明
tools::file_path_sans_ext()是基础包自带的工具函数,比手动写正则匹配后缀更稳定可靠。- 如果需要固定列表元素的顺序,可以手动指定
files的顺序,比如files <- c("mtcars.csv", "iris.csv")。
内容的提问来源于stack exchange,提问作者writer_typer
相关产品推荐
相关产品推荐

