基因 ID 和 Symbol 轉(zhuǎn)換

前言

看了這么多期的 circos鸿染,都有點(diǎn)乏了,換換口味也是好的乞巧。

下面涨椒,咱就開始吧。

做生信分析绽媒,總是免不了要給基因 IDSymbol 轉(zhuǎn)換來轉(zhuǎn)換去蚕冬。

方法

一般要進(jìn)行 IDSymbol 的轉(zhuǎn)換呢,主要有兩種方式:

  1. 網(wǎng)站提供的工具是辕,比如 biodbnet
  2. 編寫代碼

1. 用網(wǎng)站轉(zhuǎn)換

如果不會(huì)編寫代碼的話囤热,可以使用這個(gè)網(wǎng)站 biodbnet

image.png

這種方式比較簡(jiǎn)單,比如上面的例子获三,我們輸入的是人類(9606)基因 symbol旁蔼,需要對(duì)應(yīng)的基因 id,提交之后

image.png

可以下載轉(zhuǎn)換的結(jié)果疙教。

但是以我的經(jīng)驗(yàn)來說棺聊,這個(gè)網(wǎng)站如果輸入的基因很多,速度非常慢贞谓,而且很多基因 symbol 無法轉(zhuǎn)換到 id 的限佩,所以對(duì)于有編程基礎(chǔ)的朋友,并不推薦這種方式

2. 編程實(shí)現(xiàn)

編程的話裸弦,很多語言都可以實(shí)現(xiàn)祟同,看自己比較喜歡,比較擅長(zhǎng)用什么語言

下面主要介紹一下 R 以及 Python 兩種語言實(shí)現(xiàn)方式

2.1 R

R 實(shí)現(xiàn)的話烁兰,一般都是使用 org.Hs.eg.db 這個(gè)模塊提供的數(shù)據(jù)來進(jìn)行轉(zhuǎn)換

安裝和導(dǎo)入
# install
if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")
BiocManager::install("org.Hs.eg.db")

# library
library('org.Hs.eg.db')

安裝這個(gè)包之后,對(duì)于的路徑下面會(huì)有一個(gè) org.Hs.eg.sqlite 文件徊都,存儲(chǔ)了人類基因數(shù)據(jù)沪斟,后面的各種轉(zhuǎn)換其實(shí)都是對(duì)這個(gè)文件進(jìn)行操作。

查看基本信息
# 獲取所有可用的表
columns(org.Hs.eg.db)

#  [1] "ACCNUM"       "ALIAS"        "ENSEMBL"      "ENSEMBLPROT"  "ENSEMBLTRANS" "ENTREZID"    
#  [7] "ENZYME"       "EVIDENCE"     "EVIDENCEALL"  "GENENAME"     "GO"           "GOALL"       
# [13] "IPI"          "MAP"          "OMIM"         "ONTOLOGY"     "ONTOLOGYALL"  "PATH"        
# [19] "PFAM"         "PMID"         "PROSITE"      "REFSEQ"       "SYMBOL"       "UCSCKG"      
# [25] "UNIGENE"      "UNIPROT" 

從上面的輸出信息可以看出,包含了很多數(shù)據(jù)表主之,如 ENSEMBL择吊、ENTREZID、SYMBOL

# keytype 配合 keys 使用槽奕,在 select 函數(shù)中匹配 keys 參數(shù)指定的 id
keytypes(org.Hs.eg.db)
# [1] "ACCNUM"       "ALIAS"        "ENSEMBL"      "ENSEMBLPROT"  "ENSEMBLTRANS" "ENTREZID"    
#  [7] "ENZYME"       "EVIDENCE"     "EVIDENCEALL"  "GENENAME"     "GO"           "GOALL"       
# [13] "IPI"          "MAP"          "OMIM"         "ONTOLOGY"     "ONTOLOGYALL"  "PATH"        
# [19] "PFAM"         "PMID"         "PROSITE"      "REFSEQ"       "SYMBOL"       "UCSCKG"      
# [25] "UNIGENE"      "UNIPROT"   

查看數(shù)據(jù)庫或數(shù)據(jù)表的鍵

#  keys 返回?cái)?shù)據(jù)庫或表的鍵
head(keys(org.Hs.eg.db))
# [1] "1"  "2"  "3"  "9"  "10" "11"
head(keys(org.Hs.eg.db, keytype = 'SYMBOL'))
# [1] "A1BG"  "A2M"   "A2MP1" "NAT1"  "NAT2"  "NATP"

好了几睛,看完了這些信息,我們就可以開工啦粤攒!

先讀取想要轉(zhuǎn)換的基因的 symbol

# read gene symbol
symbol <- read.table(file = '~/Downloads/symbol.txt', sep = '\t', header = FALSE)
symbol <- as.character(unique(symbol$V1))

讀取完成所森,將 symbol 轉(zhuǎn)換為 entrezid

# 將 symbol 對(duì)應(yīng)到 entrezid
entrezid <- select(org.Hs.eg.db, keys=symbol, columns = 'ENTREZID', keytype = 'SYMBOL')
# 'select()' returned 1:1 mapping between keys and columns

可以看到最后的輸出信息,表示是一對(duì)一匹配的

那到這是不是就結(jié)束了呢夯接,我們來看看結(jié)果

      SYMBOL ENTREZID
1    COL10A1     1300
2     CTHRC1   115908
3      POSTN    10631
4    COL11A1     1301

  ... ...
  
120     MURC     <NA>
121    H2AFX     <NA>
122 HIST1H1T     <NA>
123 C14orf80     <NA>

咦焕济,怎么沒匹配到 ID 呢,這可咋辦呢盔几。

在這里晴弃,我們就要引出一個(gè)基因 “別名(alias)”:

通常,基因 symbol 是由 HUGO(Human Genome Organisation) 基因命名法給出的權(quán)威性的命名逊拍,但是在這之前上鞠,許多研究中對(duì)基因的命名并沒有那么規(guī)范,不同研究中可能會(huì)對(duì)同一個(gè)基因有不同的稱呼芯丧,其中一些名稱已經(jīng)被廣泛使用芍阎,

因此會(huì)存在一個(gè)基因或其對(duì)應(yīng)的蛋白質(zhì)會(huì)有不同的別名,不同的別名可能會(huì)對(duì)應(yīng)于同一個(gè)基因注整,這種一對(duì)多或多對(duì)一的關(guān)系能曾。

詳情請(qǐng)自行維基百科:Gene nomenclature

好了,既然 symbol 找不對(duì)肿轨,那就試試 alias

# 是否存在未匹配的 SYMBOL
no_map <- sort(as.character(entrezid[is.na(entrezid$ENTREZID),'SYMBOL']))

先把未匹配上的基因挑出來

# 進(jìn)一步查看是否是基因別名 alias
alias <- select(org.Hs.eg.db, keys=no_map, columns = c('SYMBOL', 'ENTREZID'), keytype = 'ALIAS')

# 'select()' returned 1:many mapping between keys and columns

我們把 keytype 換成了 ALIAS寿冕,與 keys 參數(shù),也就是我們認(rèn)為是別名的基因椒袍。

然后要對(duì)應(yīng)到的是 SYMBOLENTREZID驼唱。

看看輸出信息,many mapping驹暑?出現(xiàn)多對(duì)一了玫恳?

看看 alias 長(zhǎng)啥樣

# >alias
# 
#       ALIAS  SYMBOL ENTREZID
# 1    FAM63A  MINDY1    55793
# 2   FAM129B  NIBAN2    64855
# 3    MB21D1    CGAS   115004
# 4      AIM1  CRYBG1      202
# 5      AIM1   AURKB     9212
# 6      AIM1 SLC45A2    51151
# 7    TMEM57   MACO1    55219
# 8     WISP1    CCN4     8840
# 9     PYCRL   PYCR3    65263
# 10 C16orf59   TEDC2    80178
# 11  SDCCAG3   ENTR1    10807
# 12   GATSL3 CASTOR1   652968
# 13 C11orf84 SPINDOC   144097
# 14   DOPEY2   DOP1B     9980
# 15    AIM1L  CRYBG2    55057
# 16  FAM109A  PHETA1   144717
# 17    TMEM2  CEMIP2    23670
# 18 KIAA1524   CIP2A    57650
# 19   FAM64A  PIMREG    54478
# 20     GSG2  HASPIN    83903
# 21 KIAA1468   RELCH    57614
# 22     MURC  CAVIN4   347273
# 23    H2AFX    H2AX     3014
# 24 HIST1H1T    H1-6     3010
# 25 C14orf80   TEDC1   283643

可以看到 4-6 行輸出結(jié)果唐础,別名 AIM1 對(duì)應(yīng)到了 3 個(gè)基因 symbol

確實(shí)出現(xiàn)了我們上面說到的情況猾瘸。那這種情況要怎么處理呢曹傀?

一般對(duì)我來說觅捆,我會(huì)選擇刪掉蝉衣,畢竟這種無法確定這個(gè)基因別名到底對(duì)應(yīng)的是哪個(gè) symbol

# 刪除多重配對(duì)的結(jié)果
uni_alias <- mapIds(org.Hs.eg.db, keys = no_map, column = 'SYMBOL', keytype = 'ALIAS', multiVals = 'filter')

我們使用 mapIds酷愧,用法和 select 差不多箕昭,并設(shè)置 multiVals='filter'歌憨,意思是刪除這些重復(fù)匹配,你也可以設(shè)置其他值财饥,如 first 保留第一個(gè)值等等换吧。

最后返回的 uni_alias 為刪除多匹配結(jié)果的 symbol

# 重新匹配到 id
alias_symbol_id <- select(org.Hs.eg.db, keys = uni_alias, columns = 'ENTREZID', keytype = 'SYMBOL')
# 'select()' returned 1:1 mapping between keys and columns

從輸出信息可以看出,已經(jīng)變成一對(duì)一了

最后钥星,將兩個(gè)結(jié)果合并沾瓦,并輸出

# 合并結(jié)果
res <- rbind(entrezid[!is.na(entrezid$ENTREZID),], alias_symbol_id)
# 輸出結(jié)果
write.table(res, file = '~/Downloads/symbol_id.txt', sep = '\t', row.names = FALSE)

2.2 Python

Python 版本的話,作為一個(gè)進(jìn)階谦炒。下面我就簡(jiǎn)單介紹一下我之前用過的方法贯莺。

我之前是直接去 NCBI ftp ,下載對(duì)應(yīng)的基因信息文件编饺,然后利用正則表達(dá)式提取自己想要的信息乖篷,重新存為一個(gè) Excel。如 idsymbol 或其他像 ensemble 等基因或蛋白質(zhì)的信息透且。

需要的時(shí)候撕蔼,直接從存儲(chǔ)的文件中進(jìn)行匹配。這些操作比較復(fù)雜秽誊,感興趣的可以私聊鲸沮。

下面我就直接把前面安裝 R 包的時(shí)候下載的文件拿來用了,加入一些數(shù)據(jù)庫查詢語句锅论,簡(jiǎn)單匹配一下讼溺,大家作為例子了解一下

import pandas as pd
import sqlite3

# org.Hs.eg.db 包中的 sqlite 數(shù)據(jù)文件
db = "org.Hs.eg.db/extdata/org.Hs.eg.sqlite"
# 建立連接
conn = sqlite3.connect(db)

導(dǎo)入模塊,并對(duì)數(shù)據(jù)文件建立連接

查詢文件中所包含的所有表

pd.read_sql('select * from sqlite_master where type="table"', con=conn)
image.png

查詢文件中所包含的所有視圖

pd.read_sql('select * from sqlite_master where type="view"', con=conn)
image.png

查詢文件中所包含的所有索引

pd.read_sql('select * from sqlite_master where type="index"', con=conn)
image.png

可以看到最易,類似 R怒坯,存在許多表,例如

pd.read_sql('select * from gene_info', con=conn)
image.png

獲取基因 symbol 及其 id

df = pd.read_sql('select gene_id,symbol from gene_info inner join genes on gene_info._id = genes._id', con=conn)
type(df)
# pandas.core.frame.DataFrame

最后藻懒,這就變成一個(gè) pandas DataFrame 格式數(shù)據(jù)了

image.png

symbol = pd.read_csv('~/Downloads/symbol.txt', header=None, names=['symbol'])
df.loc[df.symbol.isin(symbol.symbol)]
image.png

可以看到匹配到了 100 個(gè)基因

后續(xù)代碼

# 獲取基因 symbol剔猿、別名列表
alias = pd.read_sql('select symbol, alias_symbol from alias inner join gene_info on alias._id = gene_info._id', con=conn)
# 獲取為匹配的別名
no_map = symbol.loc[~symbol.symbol.isin(entrezid.symbol)]
# 未匹配的別名再匹配到 symbol
tmp = alias.loc[alias.alias_symbol.isin(no_map.symbol)]
left_symbol = tmp.loc[tmp.alias_symbol.isin(tmp.alias_symbol.drop_duplicates(keep=False))]
# 再用 symbol 匹配 id
left_id = df.loc[df.symbol.isin(left_symbol.symbol)]

# 合并輸出并輸出
res = pd.concat([entrezid, left_id])
res.to_csv('~/Downloads/symbol_id.p.txt', index=
image.png

大功告成!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嬉荆,一起剝皮案震驚了整個(gè)濱河市归敬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鄙早,老刑警劉巖汪茧,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異限番,居然都是意外死亡舱污,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門弥虐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扩灯,“玉大人别威,你說我怎么就攤上這事÷刻蓿” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵粥庄,是天一觀的道長(zhǎng)丧失。 經(jīng)常有香客問我,道長(zhǎng)惜互,這世上最難降的妖魔是什么布讹? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮训堆,結(jié)果婚禮上描验,老公的妹妹穿的比我還像新娘。我一直安慰自己坑鱼,他們只是感情好膘流,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲁沥,像睡著了一般呼股。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上画恰,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天彭谁,我揣著相機(jī)與錄音,去河邊找鬼允扇。 笑死缠局,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的考润。 我是一名探鬼主播狭园,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼额划!你這毒婦竟也來了妙啃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤俊戳,失蹤者是張志新(化名)和其女友劉穎揖赴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抑胎,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡燥滑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阿逃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铭拧。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赃蛛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搀菩,到底是詐尸還是另有隱情呕臂,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布肪跋,位于F島的核電站歧蒋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏州既。R本人自食惡果不足惜谜洽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吴叶。 院中可真熱鬧阐虚,春花似錦、人聲如沸蚌卤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逊彭。三九已至磕洪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诫龙,已是汗流浹背析显。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留签赃,地道東北人谷异。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锦聊,于是被迫代替她去往敵國(guó)和親歹嘹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容