前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >生信编程8.ID转换

生信编程8.ID转换

作者头像
生信技能树
发布于 2021-03-24 08:25:48
发布于 2021-03-24 08:25:48
1.9K00
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:0
代码可运行

有一些五六年前的学生们都成长为了各个生物信息学相关公司的小领导,而且他们都有了自己的公众号,知乎号,也算是一番人物。最近他们跟我反馈面试找不到或者说很难直接考核筛选到认真干活的生信工程师,挺有意思的。让我想起来了早在生信技能树论坛创立之初我为了引流,而规划的200个生信工程师面试题。值得继续分享:

200个生信工程师面试考题

为什么要进行ID转化?

简单来说,ID转换就是找到对应的关系表,然后用bash或者字典对应一下即可。但是也可以很复杂:

在进行ID转换之前,我们需要回答一些问题:

  1. 有多少种ID?

IDs

解释

来源

entrez ID

自于NCBI旗下的Entrez gene数据库所使用的编号

Entrez Gene数据库(NCBI中的Gene数据库)

EnsembleID

Ensembl数据库的ID编号

Ensembl基因组数据库

Gene Symbol

HUGO Gene Symbol(也叫做HGNC Symbol,即基因符号)是HGNC组织对基因进行命名描述的一个缩写标识符(如:TP53)

HGNC((HUGO Gene Nomenclature Committee)人类基因命名委员会

RefSeq ID

RefSeq 有一套特殊的 Accesion Number(就是我们通常用的RefSeq ID)

RefSeq参考序列数据库

probeset ID

芯片数据中的探针ID

PubmedID

相当于文献的身份证号

[Omim ID]

OMIM中收集整理的表型(疾病)和基因均会有一个唯一的ID

  1. 什么ID最权威

Entrez ID是目前国际上最权威的Gene ID编号

  1. ID是一一对应的吗?

gene的symbol与entrez ID绝对不是一一对应的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
suppressMessages(library(org.Hs.eg.db))
all_symbol=mappedkeys(org.Hs.egSYMBOL2EG)

all_EGID =mappedkeys(org.Hs.egSYMBOL)
tmp=as.list(org.Hs.egSYMBOL2EG[all_symbol])
#tmp=as.list(org.Hs.egSYMBOL[all_EGID ])
tmp=unlist(lapply(tmp,length))
tmp=tmp[tmp>1]
as.list(org.Hs.egSYMBOL2EG[names(tmp)])

结果展示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$HBD
[1] "3045"      "100187828"

$RNR1
[1] "4549" "6052"

$RNR2
[1] "4550" "6053"

$TEC
[1] "7006"      "100124696"

$MEMO1
[1] "7795"  "51072"

$MMD2
[1] "221938"    "100505381"

$DEL11P13
[1] "100528024" "107648861"

$`TRNAV-CAC`
[1] "107985614" "107985615" "107985753"

这说明有多个entrez ID对应一个symbol的现象出现,但是没有一个symbol对应多个entrez ID的现象,而且entrez ID也会过期

  1. ID有版本吗?

有的,ID版本还会过期。Ensembl 数据库非常贴心的为我们提供了ID History Converter工具帮助使用者进行ID的新旧版本的转换。

多种ID的对应关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm(list = ls())
library(org.Hs.eg.db)
eg2symbol=toTable(org.Hs.egSYMBOL) #gene_id->symbol
eg2name=toTable(org.Hs.egGENENAME) #gene id->gene name
eg2alis = toTable(org.Hs.egALIAS2EG) #gene id-> alias gene ID基因别名(多个基因别名对应一个gene id)

#split函数的功能是将向量x中的数据根据f进行分组
eg2alis_list = lapply(split(eg2alis, eg2alis$gene_id), function(x)
  {paste0(x[,2],collapse = ";")}) #将geneID与alis的对应关系进

GeneList=mappedLkeys(org.Hs.egSYMBOL)

if(GeneList[1] %in% eg2symbol$symbol){
  symbols=GeneList
  geneIDs=eg2symbol[match(symbols,eg2symbol$symbol),'gene_id']
}else{
  geneIDs=GeneList
  symbols=eg2symbol[match(geneIDs,eg2symbol$gene_id),'symbol']
}

#match函数返回它的第一个参数在第二个参数中的(第一个)匹配的位置
geneNames = eg2name[match(geneIDs,eg2name$gene_id),'gene_name']
geneAlias=sapply(geneIDs,function(x) {
  ifelse(is.null(eg2alis_list[[x]]),"no_alias",eg2alis_list[[x]])
})

createLink <- function(base,val){
  sprintf('<a href="%s" class="btn btn-link" target="_blank">%s</a>',base,val)
}

gene_info = data.frame(symbols=symbols,
                       geneIDs=createLink(paste0("http://www.ncbi.nlm.nih.gov/gene/",geneIDs),geneIDs),
                       geneNames=geneNames,
                       geneAlias=geneAlias,
                       stringsAsFactors = F)

file='all_gene_bioconductor.html'
y <- DT::datatable(gene_info,escape = F,rownames=F)
library(DT)
y <- DT::datatable(gene_info,escape = F,rownames = F)
DT::saveWidget(y,file)

结果文件如下:

转换affymetrix芯片的探针ID:得到的变量my_probe就是我们需要的探针ID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm(list = ls())
library("hgu95av2.db")
ls("package:hgu95av2.db")
probe2entrezID = toTable(hgu95av2ENTREZID)
probe2symbol=toTable(hgu95av2SYMBOL)
probe2genename=toTable(hgu95av2GENENAME)

my_probe = sample(unique(mappedLkeys(hgu95av2ENTREZID)),30)
tmp1 = probe2symbol[match(my_probe,probe2symbol$probe_id),]
tmp2 = probe2entrezID[match(my_probe,probe2entrezID$probe_id),]
tmp3 = probe2genename[match(my_probe,probe2genename$probe_id),]

all_IDs<-merge(merge(tmp1,tmp2,by='probe_id',all=TRUE),tmp3,by='probe_id',all=T)

结果文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  probe_id   symbol gene_id                           gene_name
1  1324_at    RAD9A    5883   RAD9 checkpoint clamp component A
2  1583_at TNFRSF1B    7133  TNF receptor superfamily member 1B
3 32194_at    CEBPZ   10153 CCAAT enhancer binding protein zeta
4 32227_at     SRGN    5552                           serglycin
5 32658_at    VPS52    6293       VPS52 subunit of GARP complex
6 32745_at   MRPL40   64976 mitochondrial ribosomal protein L40

转换illumina探针ID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library("illuminaHumanv4.db")
ls('package:illuminaHumanv4.db')
probe2entrezID = toTable(illuminaHumanv4ENTREZID)
probe2symbol = toTable(illuminaHumanv4SYMBOL)
probe2genename = toTable(illuminaHumanv4GENENAME)

my_probe = sample(unique(mappedLkeys(illuminaHumanv4ENTREZID)),30)

illu_1<-probe2symbol[match(my_probe,probe2symbol$probe_id),]
illu_2<-probe2entrezID[match(my_probe,probe2entrezID$probe_id),]
illu_3<-probe2genename[match(my_probe,probe2genename$probe_id),]
all_illu<-merge(merge(illu_1,illu_2,by='probe_id',all=T),illu_3,by='probe_id',all=T)

结果文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     probe_id symbol gene_id                                                            gene_name
1 ILMN_1651950  TPST1    8460                                    tyrosylprotein sulfotransferase 1
2 ILMN_1652037   UPP2  151531                                              uridine phosphorylase 2
3 ILMN_1670343  MAGI1    9223 membrane associated guanylate kinase, WW and PDZ domain containing 1
4 ILMN_1684256  EFNA3    1944                                                            ephrin A3
5 ILMN_1685045 CHI3L2    1117                                                   chitinase 3 like 2
6 ILMN_1689625    RAX   30062                             retina and anterior neural fold homeobox

芯片探针与基因的对应关系的获取方式

  1. 去基因芯片厂家的官网直接下载manifest文件
  2. 从NCBI的GPL平台下载:http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL6947
  3. 直接使用bioconductor的包,根据对应的GPL平台号下载对应的探针ID
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(Biobase)
library(GEOquery)
gset <- getGEO("GSE119054", GSEMatrix = TRUE, getGPL = FALSE) #下载GEO数据集
if(length(gset) > 1) idx <- grep("GPL19615", attr(gset, "names")) else idx <- 1 #从中抓取出目标的数据集
gset <- gset[[idx]]
class(gset)
annotation(gset) #过的芯片数据的平台号,获得注释好

#安装注释包AnnoProbe,包含探针和基因symbol
library(devtools)
#install_github("jmzeng1314/AnnoProbe")
library(AnnoProbe) 
gpl <- "GPL19615" #通过annotation(gset)获得
probe2gene = idmap(gpl, type = "pipe") #根据自己的平台号获取对象的probeID和symbol
head(probe2gene)
dim(probe2gene)

#进行ID转换
expr <- exprs(gset) #获得表达矩阵,行名就是probe_ID 
expr <- cbind(expr, rownames(expr)) #将行名作为独立列,便于之后匹配ID
colnames(expr)[ncol(expr)] = c("probe_id") #保持expr中的probe_id的列名与probe2gene中的一样
head(expr)
expr_symbol <- merge(expr, probe2gene,by="probe_id") #根据probe_id进行合并,检查最后两列,就能得到你需要的probe_ID和symbol
head(expr_symbol)
write.csv(expr_symbol,"D:/music/Documents/GSE119054_expr_symbol.csv")

Python实现ID转换

以affymetrix芯片探针为例:

需要的文件:

  1. probe_id.txt
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
403_s_at
36238_at
1324_at
40876_at
38501_s_at
36179_at
39922_at
36649_at
503_at
32194_at
35767_at
  1. probe2entrezID.txt
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1000_at 5595
1001_at 7075
1002_f_at 1557
1003_s_at 643
1004_at 643
1005_at 1843
1006_at 4319
1008_f_at 5610
1009_at 3094
100_g_at 5875
  1. probe2genename.txt
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1000_at mitogen-activated protein kinase 3
1001_at tyrosine kinase with immunoglobulin like and EGF like domains 1
1002_f_at cytochrome P450 family 2 subfamily C member 19
1003_s_at C-X-C motif chemokine receptor 5
1004_at C-X-C motif chemokine receptor 5
1005_at dual specificity phosphatase 1
1006_at matrix metallopeptidase 10
1008_f_at eukaryotic translation initiation factor 2 alpha kinase 2
1009_at histidine triad nucleotide binding protein 1
100_g_at Rab geranylgeranyltransferase subunit alpha
  1. 'probe2symbol.txt'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1000_at MAPK3
1001_at TIE1
1002_f_at CYP2C19
1003_s_at CXCR5
1004_at CXCR5
1005_at DUSP1
1006_at MMP10
1008_f_at EIF2AK2
1009_at HINT1
100_g_at RABGGTA

python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
from collections import OrderedDict

probe2entrezID=OrderedDict()
with open('probe2entrezID.txt','r') as f:
     for line in f:
         arr = line.strip().split(' ')
         if arr[0] not in probe2entrezID:
            probe2entrezID[arr[0]] = []
            probe2entrezID[arr[0]].append(arr[1])
         else:
            probe2entrezID[arr[0]].append(arr[1])

probe2genename=OrderedDict()
with open('probe2genename.txt','r') as f:
      for line in f:
          arr = line.strip().split(' ')
          if arr[0] in probe2entrezID:
             probe2entrezID[arr[0]].append(arr[1])
          else:
             probe2genename[arr[0]] = []
             probe2genename[arr[0]].append(arr[1])


probe2symbol=OrderedDict()
with open('probe2symbol.txt','r') as f:
     for line in f:
         arr = line.strip().split(' ')
         if arr[0] in probe2entrezID:
            probe2entrezID[arr[0]].append(arr[1])
         elif arr[0] in probe2genename:
            probe2genename[arr[0]].append(arr[1])
         else:
            probe2symbol[arr[0]] = []
            probe2symbol[arr[0]].append(arr[1])
            
probes=[]
with open('my_probe.txt','r') as f:
     for line in f:
         probes.append(line.strip())

Aimed_IDs={key:value for key,value in probe2entrezID.items() if key in probes}
print(Aimed_IDs)

IDs_pd=pd.DataFrame.from_dict(Aimed_IDs,orient='index',dtype=None)
IDs_pd.columns=['EntrezID','GeneName','Symbol']
print(IDs_pd)

结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
           EntrezID            GeneName     Symbol
1324_at        5883                RAD9      RAD9A
1583_at        7133                 TNF   TNFRSF1B
32194_at      10153               CCAAT      CEBPZ
32227_at       5552           serglycin       SRGN
32658_at       6293               VPS52      VPS52
32745_at      64976       mitochondrial     MRPL40
33547_i_at     2524  fucosyltransferase       FUT2
34435_at        366           aquaporin       AQP9
34935_at       2327              flavin       FMO2
35767_at      11345                GABA  GABARAPL2

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ID转换大全
实际上掌握了编程的思维,任何一门语言都可以做id转换! 对于初学者来说,这个是非常实用的一个,很多人当初就是因为要做这个转换,才慢慢走入了编程的道路。 使用大部分软件的时候,第一步就是文件数据准备,基本上都是数据的拆分和整合,这个拿id转换做基础练习也挺好的! 本来应该作为第一讲,但是当初认为太基础了,而忽略掉了,放在这里也好,大部分同学已经跟我们学习两个月了,可以拿这个题目来检验自己的水平了! ID转换简单来说,就是找到对应关系表,然后用hash或者字典对应一下即可。但也可以很复杂: 为什么要转换id?
生信技能树
2018/03/08
2.8K0
ID转换大全
生信中各种ID转换
1.Uniprot ID mapping 可以很方便地把 ID 转换为其他 ID 类型, 所包含的类型十分全面【https://www.uniprot.org/uploadlists/】
DoubleHelix
2020/06/04
11.3K1
生信中各种ID转换
生信技能树 Day8 9 GEO数据挖掘 基因芯片数据
有时eSet里面有两个对象,可以到网页看一下,可能是因为测了两种芯片,我们分开分析就好。
用户11064093
2024/04/19
4430
输出人类全部基因的全名和别名
如果你通过数据分析拿到了一系列感兴趣的基因,但是只有类似于TP53这样的基因标准symbol名字,想批量拿到全部的基因的全名和别名,这里有一个代码分享给大家。
生信技能树
2023/02/28
5870
输出人类全部基因的全名和别名
探针注释之其他基因id转换
注意看:if you get error by this code ,please try different type parameters
用户11414625
2024/12/20
1090
探针注释之其他基因id转换
GEO数据挖掘-2
GEO数据挖掘—2 四、代码分析流程 1. 下载数据并从中提取有用信息 gse_number = "GSE56649" eSet <- getGEO(gse_number, destdir = '.', getGPL = F) #(1)提取表达矩阵exp exp <- exprs(eSet) dim(exp) exp[1:4,1:4] 关于表达矩阵里的负值 取过log,有负值 —— 正常 没取过log,有负值 ——错误数据 有一半负值 ——做了标准化 获取实验分组和探针注释 # 生成Grou
大胖橘
2023/03/18
8180
三阴性乳腺癌表达数据分析笔记之PAM50
取出PAM50基因,根据这些基因的表达了绘制热图,并添加分组信息,与原始分组(TNBC,noTNBC)进行对比。
生信技能树
2020/10/26
3.3K0
三阴性乳腺癌表达数据分析笔记之PAM50
GEO多数据集联合分析-文献复现
文献题目:基于生物信息学的新型铁死亡基因生物标志物和免疫浸润谱在糖尿病肾病中的应用Huang, Y., & Yuan, X. (2024). Novel ferroptosis gene biomarkers and immune infiltration profiles in diabetic kidney disease via bioinformatics. FASEB journal : official publication of the Federation of American Societies for Experimental Biology, 38(2), e23421. https://doi.org/10.1096/fj.202301357RR. IF: 4.8 Q1
用户11008504
2024/05/11
3752
GPL14877、GPL570、hgu133plus2.db 比较
但是,我在在利用hgu133plus2.db进行探针名转换为基因名时出现问题 ,代码如下:
生信技能树
2020/12/03
3.2K0
GPL14877、GPL570、hgu133plus2.db 比较
第一个万能芯片探针ID注释平台R包
首先,我们说官网,肯定可以找到,不然这种芯片出来就没有意义了!然后,我们看看NCBI下载的,会比较大
生信技能树
2019/12/05
13.7K0
什么基因研究最多??
如果我们想探索一下什么基因研究的最多,那就是检索pubmed数据库资源。在 NCBI的ftp里面关于人的一些基因信息 :
DoubleHelix
2022/01/17
4270
什么基因研究最多??
生信 | 利用Bioconductor包注释探针,进行探针ID转换
不同的GPL进行注释所需要用到的R包是不同的,我们首先要明白我们的GPL应该用什么R包
LN生物笔记
2023/02/23
2.5K0
你的ID转换错啦
这个基本上不太可能啊,GAPDH和ACTB这两个都是比较常见的高表达量基因,不应该是这样的数值 !
生信技能树
2021/05/27
7610
你的ID转换错啦
使用R语言获取人类所有基因的名字,ID,symbol以及别名
然后直接把下面的代码运行一下,把输出的all_gene_bioconductor.html文件好好看看, 就明白了。
生信技能树
2018/07/27
3.6K0
使用R语言获取人类所有基因的名字,ID,symbol以及别名
【资源分享】生物信息学编程实战
市面上唯一适合生物信息学从业者的教学视频 直接复制链接 https://ke.qq.com/course/285055 到浏览器即可打开购买 永不打折,但是会下架,请抓紧机会购买! 编程这个技能,随着
生信技能树
2018/06/07
3.9K0
学徒笔记——芯片数据的注释文件获取
写文章确实是个严谨的事,但是万一呢,有时候做个脑瘤的分析整个糖尿病的编号在里面,也是大受震撼,一般来说起码都是一个物种的,平台一不一致问题不大的样子。通篇检查一下,可能就是差那么一位数,但是一定有写对的地方。
生信技能树
2021/07/06
4.5K0
GEO数据挖掘-基于芯片
在require()函数中,如果直接传递包的名称作为参数,不需要加引号;如果包的名称以字符串形式存储在变量中,则需要使用character.only = TRUE来指定这个变量是一个字符串
sheldor没耳朵
2024/07/23
3280
GEO数据挖掘-基于芯片
R语言练习题10道,有答案代码,还有视频
根据R包org.Hs.eg.db找到下面ensembl 基因ID 对应的基因名(symbol)
生信技能树
2018/12/27
1.4K0
生信马拉松 Day9-10 GEO数据分析笔记
今天正式开始教画图了,具体的代码其实挺多地方讲到了,上课的好处就是可以听到很多细节和经验,是自己零散地找资料不能相比的,收获很多,感觉要全部吞下来还要再复习几遍
阿呆的月历
2024/01/26
2721
(16)芯片探针与基因的对应关系-生信菜鸟团博客2周年精选文章集
这个我非常喜欢,目录如下: 用R获取芯片探针与基因的对应关系三部曲-bioconductor 用R获取芯片探针与基因的对应关系三部曲-NCBI下载对应关系 gene的各种ID转换终结者-bioconductor系列包 现有的基因芯片种类不要太多了! 但是重要而且常用的芯片并不多! 一般分析芯片数据都需要把探针的ID切换成基因的ID,我一般喜欢用基因的entrez ID。 一般有三种方法可以得到芯片探针与gene的对应关系。 金标准当然是去基因芯片的厂商的官网直接去下载啦!!! 一种是直接用bioconduc
生信技能树
2018/03/08
6K0
推荐阅读
相关推荐
ID转换大全
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验