如何用list.files生成对应嵌套文件夹结构的多级列表(R语言)
如何根据嵌套文件夹结构自动生成多级列表?
我有如下文件夹结构:
- ConditionA
- Subcondition1
- data1.Rds
- data2.Rds
- Subcondition2
- data1.Rds
- data2.Rds
- Subcondition1
- ConditionB
- Subcondition1
- data1.Rds
- data2.Rds
- Subcondition2
- data1.Rds
- data2.Rds
- Subcondition1
使用list.files(recursive = T, full.names = T)会得到扁平的文件路径列表,但我需要生成一个与嵌套文件夹结构对应的多级列表,该列表需与以下手动构建的列表结构一致(注:手动代码中命名存在笔误,实际应为Subcondition1/2而非Condition1/2):
sublist1 <- list("data1.Rds", "data2.Rds") sublist2 <- list("data1.Rds", "data2.Rds") sublist3 <- list("data1.Rds", "data2.Rds") sublist4 <- list("data1.Rds", "data2.Rds") sublist5 <- list(sublist1, sublist2) names(sublist5) <- c("Subcondition1", "Subcondition2") sublist6 <- list(sublist3, sublist4) names(sublist6) <- c("Subcondition1", "Subcondition2") final_list <- list(sublist5, sublist6) names(final_list) <- c("ConditionA", "ConditionB")
调用final_list会输出对应嵌套结构的列表。请问如何自动化实现这一需求,而非手动构建列表?
解决方案:分层拆分路径+递归构建列表
通过拆分文件路径的层级,逐层递归构建带命名的嵌套列表,完全匹配文件夹结构,具体实现如下:
代码实现
# 获取所有文件的相对路径(避免全路径前缀干扰) files <- list.files(recursive = TRUE, full.names = FALSE) # 定义递归函数:将路径列表转换为嵌套列表 path_to_nested_list <- function(paths) { # 拆分每条路径的层级 split_paths <- strsplit(paths, .Platform$file.sep) # 提取当前层级的文件夹/文件名 current_level <- sapply(split_paths, `[`, 1) # 按当前层级分组 grouped <- split(paths, current_level) # 对每个分组递归处理:如果是文件则返回文件名列表,否则继续拆分下一层 lapply(grouped, function(g) { sub_paths <- sapply(strsplit(g, .Platform$file.sep), function(x) paste(x[-1], collapse = .Platform$file.sep)) if (all(nchar(sub_paths) == 0)) { # 当前分组是文件,返回文件名列表 as.list(basename(g)) } else { # 还有下一层级,递归处理子路径 path_to_nested_list(sub_paths) } }) } # 生成目标嵌套列表 final_list <- path_to_nested_list(files)
代码说明
- 使用
.Platform$file.sep保证跨平台兼容性(自动适配Windows的\和Linux/macOS的/) - 递归函数会自动识别路径层级,从顶层文件夹开始逐层向下构建结构
- 列表元素的名称会自动匹配文件夹/文件名,无需手动设置
验证结果
调用final_list会输出与手动构建完全一致的嵌套结构:
$ConditionA $ConditionA$Subcondition1 $ConditionA$Subcondition1[[1]] [1] "data1.Rds" $ConditionA$Subcondition1[[2]] [1] "data2.Rds" $ConditionA$Subcondition2 $ConditionA$Subcondition2[[1]] [1] "data1.Rds" $ConditionA$Subcondition2[[2]] [1] "data2.Rds" $ConditionB $ConditionB$Subcondition1 $ConditionB$Subcondition1[[1]] [1] "data1.Rds" $ConditionB$Subcondition1[[2]] [1] "data2.Rds" $ConditionB$Subcondition2 $ConditionB$Subcondition2[[1]] [1] "data1.Rds" $ConditionB$Subcondition2[[2]] [1] "data2.Rds"
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

