RでEnsembl gene IDからEntrez Gene ID (NCBI Gene ID)に変換する

# 目的

たとえばEnsemblのGTFをつかってでてきたRNA-seqからのDEGのリストがあって、GOstatsなどでGO解析をしたいのでEntrez Gene ID (NCBI Gene ID; 以下EG)に変換したい。

# 準備

ヒトならBioconductorにある`org.Hs.eg.db`をインストールしておく。
マウスなら`org.Mm.eg.db`になる。

※ちなみに以下はR version 3.5.1 (2018-07-02)でやっています

# 例

```R
library(org.Hs.eg.db)
ENSEMBL <- c( "ENSG00000162591","ENSG00000162745","ENSG00000178882","ENSG00000285347")
ENTREZ <- as.vector(unlist(as.list(org.Hs.egENSEMBL2EG)[ENSEMBL]))
```

EGが重複している可能性はあるので、ここではしていないけどsortしたりuniqueしたりしておくといいかも。
結果は以下のようにこうなっているはず。

```R
# 実行例

> ENTREZ
[1] "1953"      "25903"     "144347"    "100533183"

# ENSG0000017888 に相当するEGが2つでてきて、ENSG00000285347 に相当するEGが出てきていないことに注意
```

**<注意>**

- ENSG00000178882のように、リストのなかに2つ以上のEntrez Gene IDがある場合でも展開してくれるけど、かわりにそれぞれにnames属性があらたに作成される。
- ENSG00000285347のようにそもそもエントリがないものは、なにもなかったように扱われる。

as.vecter()をつけずに下記のようにつかっても元々vectorとして返ってくるけど、「ENSG00000178882」にはEGとして「144347」と「100533183」があるので、それぞれにuniqueなIDとして末尾に**1**と**2**が付加されて「ENSG0000017888*1*」と「ENSG0000017888*2* 」がnames属性としてついている。ので後々間違えやすいので、names(x) <- NULLなどをしてnamesを消しておくかas.vector()をかませておく。


```R
# 実行例

> as.list(org.Hs.egENSEMBL2EG)["ENSG00000178882"]
$ENSG00000178882
[1] "144347"    "100533183"

> as.list(org.Hs.egENSEMBL2EG)["ENSG00000285347"]
$<NA>
NULL

> unlist(as.list(org.Hs.egENSEMBL2EG)[TEST])

ENSG00000162591  ENSG00000162745 ENSG000001788821 ENSG000001788822
         "1953"          "25903"         "144347"      "100533183"

# ENSG0000017888 が2つでてきて、ENSG00000285347 がなくなっていることに注意
```

名前が2EG表記のデータであれば同様にできるので、`org.Hs.egENSEMBL2EG`だけでなく`org.Hs.egSYMBOL2EG`,  `org.Hs.egREFSEQ2EG`, `org.Hs.egENSEMBLTRANS2EG`, `org.Hs.egENSEMBLPROT2EG`, `org.Hs.egACCNUM2EG`, `org.Hs.egOMIM2EG`などでもできる。

逆にもちろん応用すればEGからほかのIDの参照もできる。(`org.Hs.egENSEMBL`や`org.Hs.egACCNUM`や`org.Hs.egSYMBOL`などなど)

使えそうなのは以下で調べてみる。

```R
ls("package:org.Hs.eg.db")
```

```R
# 実行例
> ls("package:org.Hs.eg.db")
 [1] "org.Hs.eg"                "org.Hs.eg_dbconn"
 [3] "org.Hs.eg_dbfile"         "org.Hs.eg_dbInfo"
 [5] "org.Hs.eg_dbschema"       "org.Hs.eg.db"
 [7] "org.Hs.egACCNUM"          "org.Hs.egACCNUM2EG"
 [9] "org.Hs.egALIAS2EG"        "org.Hs.egCHR"
[11] "org.Hs.egCHRLENGTHS"      "org.Hs.egCHRLOC"
[13] "org.Hs.egCHRLOCEND"       "org.Hs.egENSEMBL"
[15] "org.Hs.egENSEMBL2EG"      "org.Hs.egENSEMBLPROT"
[17] "org.Hs.egENSEMBLPROT2EG"  "org.Hs.egENSEMBLTRANS"
[19] "org.Hs.egENSEMBLTRANS2EG" "org.Hs.egENZYME"
[21] "org.Hs.egENZYME2EG"       "org.Hs.egGENENAME"
[23] "org.Hs.egGO"              "org.Hs.egGO2ALLEGS"
[25] "org.Hs.egGO2EG"           "org.Hs.egMAP"
[27] "org.Hs.egMAP2EG"          "org.Hs.egMAPCOUNTS"
[29] "org.Hs.egOMIM"            "org.Hs.egOMIM2EG"
[31] "org.Hs.egORGANISM"        "org.Hs.egPATH"
[33] "org.Hs.egPATH2EG"         "org.Hs.egPFAM"
[35] "org.Hs.egPMID"            "org.Hs.egPMID2EG"
[37] "org.Hs.egPROSITE"         "org.Hs.egREFSEQ"
[39] "org.Hs.egREFSEQ2EG"       "org.Hs.egSYMBOL"
[41] "org.Hs.egSYMBOL2EG"       "org.Hs.egUCSCKG"
[43] "org.Hs.egUNIGENE"         "org.Hs.egUNIGENE2EG"
[45] "org.Hs.egUNIPROT"
```

# 付記

この方法を覚えておくと、RNA-seqなり他のプラットフォームなりで解析したあと、GOstatsなどをつかってGO解析したいときに、それぞれで必要なbackgroundのIDセットも変わる筈なので、そういうbackgroundのIDセットを用意するときにも利用できる。

（具体的には単純にもともとのGTFに含まれているもののみをbackgroundにしないと、backgroundが大きすぎてFDRなどの多重検定の補正で過小評価されるのを避けたい）