在R中批量导入TSV文件并生成代谢物编码词典的问题
批量处理TSV代谢通路文件解决方案
需求说明
- 批量读取单个文件夹内数百个结构一致(11列)的.tsv代谢通路文件为独立数据框
- 为每个数据框添加对应文件名前缀(如PA145011109)列
- 从每个数据框的
From和To列提取唯一分子值,生成以「文件名前缀-序号」为编码的分子词典
优化实现代码
1. 环境准备与文件路径处理
library(tidyverse) library(rebus) # 替换为你的实际文件夹路径 table_pgkb <- "./your_target_folder" # 获取所有PA开头的tsv文件 filenames <- list.files(path = table_pgkb, pattern = "^PA.*\\.tsv$") # 提取文件名(去除.tsv后缀) fnames <- str_remove(filenames, pattern = "\\.tsv$") # 提取每个文件的PA前缀编码 pattern <- "PA" %R% one_or_more(DGT) path_codes <- str_extract(fnames, pattern)
2. 批量读取并处理数据框
# 用列表统一管理所有数据框,避免assign造成的全局环境混乱 path_dfs <- map2(fnames, path_codes, function(name, code) { filepath <- file.path(table_pgkb, paste0(name, ".tsv")) # 读取文件时仅保留前4列(含From、To),并添加前缀列 df <- read.delim(filepath, colClasses = c(rep("character", 4), rep("NULL", 7)), sep = "\t") %>% mutate(path_code = code) return(df) }) # 给列表命名,方便后续按文件名调用数据框 names(path_dfs) <- fnames
3. 生成分子词典
# 批量生成每个文件对应的分子词典 mol_dictionaries <- map2(path_dfs, path_codes, function(df, code) { # 提取From和To的唯一值并排序 unique_mols <- unique(c(df$From, df$To)) %>% sort() %>% as.data.frame(stringsAsFactors = FALSE) %>% rename(molecules. = ".") # 添加编码列,序号补两位前置零保证格式统一 unique_mols <- unique_mols %>% mutate(coded.mol = paste0(code, "-", str_pad(row_number(), 2, pad = "0"))) %>% relocate(coded.mol) # 将编码列移至第一列 return(unique_mols) }) # 可选:合并所有文件的词典为一个总表 total_mol_dict <- bind_rows(mol_dictionaries, .id = "source_file") # 可选:单独保存每个词典到文件夹 walk2(mol_dictionaries, path_codes, function(dict, code) { write_tsv(dict, file.path(table_pgkb, paste0(code, "_mol_dict.tsv"))) })
预期输出示例
单个文件对应的分子词典格式:
| coded.mol | molecules. |
|---|---|
| PA145011109-01 | atorvastatin lactone |
| PA145011109-02 | 2-hydroxyatorvastatin lactone |
关键优化点
- 用列表替代
assign管理数据框,避免全局环境变量混乱,更易维护 - 结合
purrr的map2函数实现批量处理,代码简洁高效 - 统一处理前缀编码和序号格式,确保输出规范
- 支持合并总词典或单独保存单个词典,灵活满足不同需求
内容的提问来源于stack exchange,提问作者Raul
相关产品推荐
相关产品推荐

