如何将R中以/分隔的基因ID替换为对应基因符号?
斜杠分隔基因ID转基因符号的R实现
示例数据准备
先定义输入的基因ID向量和映射数据框:
geneIDs <- c("100/1000/100008586","1277/63923/8516","1133/1132/1956/8516") gene_symbols <- data.frame( ENTREZID = c(1, 10, 100, 1000, 10000, 100008586, 1277, 63923, 8516, 1133, 1132, 1956), SYMBOL = c("A1BG", "NAT2", "ADA", "CDH2", "AKT3", "GAGE12F", "RAF1", "FOXP2", "CXCR4", "CSF1R", "CSF1", "JUN") )
核心处理步骤
- 统一ID格式:将映射表中的
ENTREZID转为字符型,避免大数字因科学计数导致匹配失败:
gene_symbols$ENTREZID <- as.character(gene_symbols$ENTREZID)
- 自定义转换函数:实现拆分ID、匹配符号、重新合并的逻辑:
convert_gene_ids <- function(id_str, mapping) { # 拆分斜杠分隔的ID ids <- strsplit(id_str, "/")[[1]] # 匹配对应的基因符号 symbols <- mapping$SYMBOL[match(ids, mapping$ENTREZID)] # 可选:将未匹配的ID保留原值,避免出现NA symbols[is.na(symbols)] <- ids[is.na(symbols)] # 重新合并为斜杠分隔的字符串 paste(symbols, collapse = "/") }
- 批量转换:将函数应用到整个基因ID向量:
geneSymbols <- sapply(geneIDs, convert_gene_ids, mapping = gene_symbols) # 查看结果 geneSymbols
运行后输出:
#> "ADA/CDH2/GAGE12F" "RAF1/FOXP2/CXCR4" "CSF1R/CSF1/JUN/CXCR4"
Tidyverse风格实现(适合数据框列处理)
如果是处理数据框中的列,用tidyverse工具链更便捷:
library(tidyverse) df <- tibble(geneIDs = geneIDs) df_processed <- df %>% mutate( geneSymbols = str_split(geneIDs, "/") %>% map(~ gene_symbols$SYMBOL[match(.x, gene_symbols$ENTREZID)]) %>% map_chr(paste, collapse = "/") ) print(df_processed)
输出结果:
#> # A tibble: 3 × 2 #> geneIDs geneSymbols #> <chr> <chr> #> 1 100/1000/100008586 ADA/CDH2/GAGE12F #> 2 1277/63923/8516 RAF1/FOXP2/CXCR4 #> 3 1133/1132/1956/8516 CSF1R/CSF1/JUN/CXCR4
内容的提问来源于stack exchange,提问作者Victor Hugo Calegari de Toledo
相关产品推荐
相关产品推荐

