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

如何在R循环中为结果文件设置输入文件名作为行名

问题分析与解决

核心问题

原代码中每次循环设置行名时,rownames(big_data)= paste0(basename(files[i]))会把所有行的行名统一替换成当前循环的文件名,循环结束后所有行名都会变成最后一个输入文件的名字——这是因为每次循环都会重新生成big_data并覆盖行名。另外,循环内重复执行do.call(rbind, datalist)和write.csv也属于冗余操作。

修正方案

把汇总数据的处理逻辑移到循环外部,同时给存储结果的列表元素命名,绑定后自动生成对应行名:

# 修正正则匹配,确保只选中.tsv结尾的文件
files <- list.files(path=".", pattern="\\.tsv$")
files
datalist = list()

for(i in 1:length(files)) {  
  other_trait <- read.table(files[i])
  coloc_res = coloc::coloc.abf(dataset1 = other_trait, dataset2 = dataset2, p12 = 1e-5)
  coloc_results <- matrix(ncol=6, nrow=1, 0)
  coloc_results[1,] <- coloc_res$summary
  write.csv(coloc_results, paste0("processed_", basename(files[i])))
  datalist[[i]] <- coloc_results
  # 给列表元素命名,对应输入文件名
  names(datalist)[i] <- basename(files[i])
}

# 循环外统一生成汇总文件
big_data <- do.call(rbind, datalist)
colnames(big_data) <- c("n_snps","H0","H1","H2","H3","H4")
# 若未给datalist命名,也可手动设置行名:rownames(big_data) <- sapply(files, basename)
write.csv(big_data, "results.csv")

关键改动说明

  1. 循环内仅处理单个文件的计算、保存,并给datalist的每个元素设置对应输入文件名作为名字,避免行名被重复覆盖。
  2. 汇总数据的绑定、行名列名设置、文件写入统一放在循环外部,减少冗余计算,确保行名与输入文件一一对应。
  3. 修正list.files的匹配规则,用\\.tsv$精准匹配以.tsv结尾的文件,避免误匹配其他文件。

内容的提问来源于stack exchange,提问作者holly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:45:32