如何在单个lapply调用中对嵌套列表元素执行full_join并命名?
解决方案
步骤1:修正读取并合并每个文件夹下的CSV文件
先加载所需工具包,再调整代码逻辑:遍历每个文件夹,先读取所有CSV到子列表,再用reduce合并该子列表内的所有数据框。
library(dplyr) library(purrr) library(stringr) data_dir <- "C:/Users/thepr/Documents/data/as" num_fu <- 1:9 dirs <- paste0(data_dir, num_fu) as_list <- lapply(dirs, function(x) { # 获取当前文件夹下的所有CSV文件路径 files <- list.files(x, pattern = "\\.csv$", full.names = TRUE) # 给文件列表命名(可选,保留原文件标识) names(files) <- str_sub(basename(files), 1, 6) # 读取所有CSV为数据框列表 df_list <- lapply(files, read.csv) # 合并当前文件夹下的所有数据框 reduce(df_list, full_join, by = NULL) # 如需指定合并列,替换by参数,比如by = "你的共同列名" })
步骤2:为列表元素命名
通过names()函数直接给外层列表的每个元素赋值as1到as9:
names(as_list) <- paste0("as", num_fu)
错误原因分析
你之前的代码存在两个核心问题:
- 无效索引引用:第一个尝试的代码中,在
lapply(files, ...)内部调用reduce(full_join, as_list[[x]])时,as_list还未完成赋值,且x是文件夹路径字符串(不是列表索引),导致as_list[[x]]完全无效,触发object of type 'closure' is not subsettable错误。 - reduce参数顺序颠倒:第二个尝试的代码中,
reduce(full_join, as_list[[x]])的参数顺序错误,purrr::reduce的第一个参数应为要合并的列表,第二个才是合并函数,正确写法是reduce(数据框列表, full_join)。
内容的提问来源于stack exchange,提问作者HJ WHY
相关产品推荐
相关产品推荐

