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

如何在嵌套列表中按行合并子列表内的数据集?

需求与解决方案

我使用以下代码将数据集分组存入嵌套列表:

init = c('PQ', 'MG')
dir = c('com', 'set', 'rit')

list3 = NULL
for (i in files){
  for (j in init){
    for (k in dir){
      list3[[j]][[k]][[i]] = 
        if(str_detect(i, pattern = j) 
           && str_detect(i, pattern = k) == TRUE)
        {read_excel(i)}
      
    }
  }
  
}

目前代码可正常运行,但我希望每个子列表(如com项)下不是以文件名为子项的多个子列表,而是将所有符合条件的数据集按行合并后的单个数据集。请问如何修改现有代码实现该需求?

修改后的代码

library(readxl)
library(stringr)

init = c('PQ', 'MG')
dir = c('com', 'set', 'rit')

# 提前初始化嵌套列表结构,每个子项设为空数据框,方便后续合并
list3 <- setNames(lapply(init, function(x) {
  setNames(lapply(dir, function(y) data.frame()), dir)
}), init)

for (i in files){
  for (j in init){
    for (k in dir){
      # 判断文件名是否同时包含指定模式
      if(str_detect(i, pattern = j) && str_detect(i, pattern = k)){
        # 读取当前文件数据
        current_data <- read_excel(i)
        # 将当前数据与已有数据按行合并
        list3[[j]][[k]] <- rbind(list3[[j]][[k]], current_data)
        # 若需兼容列数/列名不一致的情况,推荐用dplyr的bind_rows:
        # list3[[j]][[k]] <- dplyr::bind_rows(list3[[j]][[k]], current_data)
      }
    }
  }
}

关键改动说明

  • 初始化列表结构:提前创建与init、dir对应的嵌套列表,每个子项初始化为空数据框,避免原代码中NULL列表赋值的潜在问题,让合并逻辑更顺畅。
  • 替换赋值逻辑:不再将单个文件数据存为子列表,而是读取后直接用rbind(或bind_rows)追加到目标列表项中,最终每个list3[[j]][[k]]就是所有符合条件文件合并后的单个数据集。
  • 简化条件判断:去掉冗余的== TRUE写法,str_detect本身返回布尔值,可直接用于条件判断。

内容的提问来源于stack exchange,提问作者12666727b9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:52:16