如何用更简洁方式通过lapply和substr命名嵌套列表
问题解决:嵌套列表的正确命名方式
你的代码问题出在列表命名逻辑错误:用嵌套lapply给外层列表赋值时,每个外层元素的名字被强制转换成了列表的字符串形式,且未给内层子列表设置正确名称。以下是修正后的代码和说明:
修正后的代码
library(stringr) data_dir <- "C:/Users/thepr/Documents/data/as" num_fu <- 1:9 dirs <- paste0(data_dir, num_fu) # 获取每个文件夹下的CSV文件完整路径 flnames <- lapply(dirs, list.files, pattern = "\\.csv$", full.names = TRUE) # 读取所有CSV文件,生成嵌套列表 as_list <- lapply(flnames, lapply, read.csv) # 给外层列表命名(对应文件夹名:as1 ~ as9) names(as_list) <- basename(dirs) # 给每个子列表(单文件夹下的CSV集合)命名 as_list <- mapply(function(sub_list, files) { # 提取文件名:去掉后缀,取前6位 sub_names <- str_sub(sub("\\.csv$", "", basename(files)), 1, 6) names(sub_list) <- sub_names sub_list }, as_list, flnames, SIMPLIFY = FALSE)
关键修正点
- 外层列表命名:用
basename(dirs)直接提取文件夹名称(如as1),生成长度匹配的字符向量,赋值给names(as_list)。 - 内层子列表命名:通过
mapply遍历每个子列表和对应的文件路径列表,单独为每个子列表设置你需要的前6位短文件名,确保每个CSV元素都有正确的名字。
验证结果
运行后可得到你期望的输出:
# 查看第一个文件夹下的所有CSV名称 names(as_list[[1]]) # 输出:as1_01 as1_02 as1_03 ... # 查看第一个CSV的名称 names(as_list[[1]])[1] # 输出:as1_01
内容的提问来源于stack exchange,提问作者HJ WHY
相关产品推荐
相关产品推荐

