如何用lapply读取多CSV并在bind_rows阶段添加文件名标识列
解决方法
方法一:合并阶段设置文件名标识
你可以用setNames()给读取后的列表数据框设置对应文件名作为名称,再借助bind_rows()的.id参数直接生成文件名列:
bind_rows(setNames(df, basename(files)), .id = "id")
basename(files)会提取纯文件名(去掉完整路径),用它给列表里的每个数据框命名.id参数会自动把列表的名称作为新列id的取值,也就是对应的文件名
方法二:读取阶段直接添加文件名列
也可以在读取文件的环节就给每个数据框新增一列存储文件名,后续合并时无需额外处理:
df <- lapply(files, function(i){ read.csv(i, header=TRUE, skip=4) %>% mutate(filename = basename(i)) }) # 直接合并所有数据框 combined_df <- bind_rows(df)
问题背景
我有多个CSV文件,列名位于第5行,因此会跳过前4行保证所有文件列结构一致,但希望添加一列ID标签,内容为对应CSV的文件名(文件名也可能重复出现在前4行的某个单元格中)。
当前代码流程:
- 生成文件名列表:
folder = "my\\desktop\\path" files = list.files( path = folder, pattern = "_indicator.*csv$", recursive = TRUE, # 包含子文件夹 ignore.case = T, full.names = T )
- 读取所有文件:
df <- lapply(files, function(i){ read.csv(i, header=TRUE, skip=4) })
读取后得到包含70个数据框的列表,结构符合预期,但用bind_rows(df.list, .id = "id")合并时,id列仅显示数字序号,想知道能否在合并或读取阶段直接设置文件名为标识,避免后续用mutate替换的低效操作。
内容的提问来源于stack exchange,提问作者user3278
相关产品推荐
相关产品推荐

