You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用list.files生成对应嵌套文件夹结构的多级列表(R语言)

如何根据嵌套文件夹结构自动生成多级列表?

我有如下文件夹结构:

  • ConditionA
    • Subcondition1
      • data1.Rds
      • data2.Rds
    • Subcondition2
      • data1.Rds
      • data2.Rds
  • ConditionB
    • Subcondition1
      • data1.Rds
      • data2.Rds
    • Subcondition2
      • data1.Rds
      • data2.Rds

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:00:19