R使用data.table批量合并txt文件时如何新增原始文件名列
可直接复用的修改方案
你现在的脚本没法溯源来源的核心原因很简单:读每个文件的时候,没有把当前文件名和读到的表格内容绑定,后续合并自然丢了对应的溯源信息。完全不需要靠row.names绕弯(这个方法本来也不适合这个场景),直接调整读文件和合并的逻辑就行,整体效率还比你原来的脚本更高,适配5000个大文件的处理规模:
setwd("/path") library(data.table) # 按需调整:full.names=TRUE时会存带完整路径的文件名,FALSE只存纯文件名 temp2 <- list.files(path = "path", pattern = "*.txt", full.names = FALSE) myfiles2 <- lapply(temp2, function(current_file) { # 用fread替代read.table,速度比基础读取函数快数倍,天生适配data.table格式 dt <- fread( input = current_file, header = TRUE, sep = "\t", comment.char = "#", na.strings = ".", quote = "", fill = FALSE ) # 给当前读好的文件新增一列,所有行都绑定对应的原始文件名 dt[, phenotype := current_file] return(dt) }) # 合并时自动保留新增的phenotype列,fill参数兼容不同文件列数不完全对齐的场景 merged_dataset <- rbindlist(myfiles2, fill = TRUE) write.table( merged_dataset, file = "merged_dataset.txt", sep = "\t", quote = FALSE, row.names = FALSE )
如果你想代码更精简,也可以用
rbindlist自带的溯源参数,不用在循环里手动加列:# 给文件列表的每个元素绑定对应的文件名 names(temp2) <- temp2 myfiles2 <- lapply(temp2, function(x) fread(x, header=T, sep="\t", comment.char="#",na.strings=".", quote="",fill=FALSE)) # 直接指定idcol参数,合并时自动生成phenotype溯源列 merged_dataset <- rbindlist(myfiles2, fill=TRUE, idcol="phenotype")
常见调整场景
- 如果不需要
.txt后缀展示在phenotype列,给赋值语句加个简单的文本替换就行:dt[, phenotype := gsub("\\.txt$", "", current_file)] - 如果遇到某个文件是空表的场景,只要在读表的时候加个空值判断就行,避免合并报错:
if (nrow(dt) == 0) return(NULL) - 之前尝试
row.names = TRUE没用的原因:rbindlist默认不会抓取每个源表自带的行名,就算把行名改成文件名,合并后这个信息也会丢失,反而要多写一步提取行名的代码,完全是冗余操作。
内容的提问来源于stack exchange,提问作者kllrdr
相关产品推荐
相关产品推荐

