You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 15:45:01