在R中读取CSV文件时为数据框添加文件名与文件夹名列的方法
问题解决:给CSV数据添加文件名和文件夹名列
你的代码问题分析
- 赋值
df$filename <- myfiles时,你把所有文件的路径列表赋值给了当前文件的每一行,而非单个文件名 - 完全缺少提取并添加文件夹名的逻辑
修正后的基础循环代码
# 指定目标文件夹路径 mydir <- "C:/Users/Administrator/Downloads/Data/Device 1 - Bin 4 - LongTube" # 分别获取文件完整路径和仅文件名 myfiles_full <- list.files(path = mydir, full.names = TRUE) myfiles_names <- list.files(path = mydir, full.names = FALSE) # 创建空列表存储处理后的数据集 datalist <- list() # 遍历每个文件 for (i in seq_along(myfiles_full)) { # 读取当前CSV文件 df <- read.csv(myfiles_full[i], header = TRUE) # 添加"文件名"列:取当前文件的纯文件名 df$filename <- myfiles_names[i] # 添加"文件夹名"列:提取路径最后一级的文件夹名称 df$foldername <- basename(mydir) # 将处理好的数据框存入列表 datalist[[i]] <- df } # 可选:把所有数据框合并成一个大的数据集 combined_df <- do.call(rbind, datalist)
更简洁的tidyverse实现(推荐)
如果你熟悉tidyverse工具包,以下代码可一步完成读取、添加列和合并:
library(tidyverse) mydir <- "C:/Users/Administrator/Downloads/Data/Device 1 - Bin 4 - LongTube" # 读取所有文件、添加列并合并 combined_df <- list.files(path = mydir, full.names = TRUE) %>% map_dfr(function(file) { read.csv(file, header = TRUE) %>% mutate( filename = basename(file), # 从完整路径提取纯文件名 foldername = basename(mydir) # 提取目标文件夹名称 ) })
关键说明
basename()函数可从完整路径中提取最后一级名称(文件或文件夹),避免手动写死名称,提升代码灵活性- 循环时用索引
i对应单个文件,确保每个数据框只关联自己的文件名 map_dfr会自动将多个数据框按行合并,省去手动调用do.call(rbind, ...)的步骤
内容的提问来源于stack exchange,提问作者Niro Mal
相关产品推荐
相关产品推荐

