如何在嵌套列表中按行合并子列表内的数据集?
需求与解决方案
我使用以下代码将数据集分组存入嵌套列表:
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
相关产品推荐
相关产品推荐

