TCGA新版數(shù)據(jù)庫(kù)表達(dá)矩陣提取

本文首發(fā)于公眾號(hào):醫(yī)學(xué)和生信筆記

醫(yī)學(xué)和生信筆記,專注R語(yǔ)言在臨床醫(yī)學(xué)中的使用,R語(yǔ)言數(shù)據(jù)分析和可視化。主要分享R語(yǔ)言做醫(yī)學(xué)統(tǒng)計(jì)學(xué)、meta分析、網(wǎng)絡(luò)藥理學(xué)、臨床預(yù)測(cè)模型、機(jī)器學(xué)習(xí)、生物信息學(xué)等。

現(xiàn)在使用TCGAbiolinks下載轉(zhuǎn)錄組數(shù)據(jù)后,直接是一個(gè)SummarizedExperiment對(duì)象,這個(gè)對(duì)象非常重要且好用。因?yàn)槔锩?直接包含了表達(dá)矩陣、樣本信息、基因信息,可以非常方便的通過內(nèi)置函數(shù)直接提取想要的數(shù)據(jù),再也不用手扒了!!

這個(gè)對(duì)象的結(jié)構(gòu)是這樣的:


image.png

上次我們下載了常見的組學(xué)數(shù)據(jù),今天學(xué)習(xí)下怎么提取數(shù)據(jù),就以TCGA-READ的轉(zhuǎn)錄組數(shù)據(jù)為例。

分別提取mRNA和lncRNA的表達(dá)矩陣,還要添加gene symbol的那種!

加載數(shù)據(jù)和R包

加載之前下載好的數(shù)據(jù)。

rm(list = ls())
library(SummarizedExperiment)

load("TCGA-mRNA/TCGA-READ_mRNA.Rdata")
se <- data

這個(gè)se就是你的對(duì)象,含有coldata, rowdata, meta-data,以及最重要的assay,共有6個(gè)assay

探索SummarizedExperiment對(duì)象

se
## class: RangedSummarizedExperiment 
## dim: 60660 177 
## metadata(1): data_release
## assays(6): unstranded stranded_first ... fpkm_unstrand fpkm_uq_unstrand
## rownames(60660): ENSG00000000003.15 ENSG00000000005.6 ...
##   ENSG00000288674.1 ENSG00000288675.1
## rowData names(10): source type ... hgnc_id havana_gene
## colnames(177): TCGA-AG-3580-01A-01R-0821-07
##   TCGA-AF-2692-11A-01R-A32Z-07 ... TCGA-AG-3894-01A-01R-1119-07
##   TCGA-AG-3574-01A-01R-0821-07
## colData names(107): barcode patient ... paper_vascular_invasion_present
##   paper_vital_status

看看這個(gè)對(duì)象,它告訴你:

  • 類型是:RangedSummarizedExperiment
  • 維度:60660行,177列
  • 6個(gè)assay以及它們的名字
  • 表達(dá)矩陣的行名
  • 行信息(也就是基因信息),比如gene id,gene name,gene type
  • 表達(dá)矩陣的列名(也就是樣本名)
  • 列信息,也就是樣本信息,比如生存時(shí)間、生存狀態(tài)這些

太齊全了有沒有?。?br> 每個(gè)assay你可以理解為一個(gè)表達(dá)矩陣,我們需要的counts矩陣、TPM矩陣、FPKM矩陣就是其中一個(gè)~

# 查看每個(gè)assay的名字
names(assays(se))
## [1] "unstranded"       "stranded_first"   "stranded_second"  "tpm_unstrand"    
## [5] "fpkm_unstrand"    "fpkm_uq_unstrand"

每個(gè)基因?qū)儆趍RNA還是lncRNA存儲(chǔ)在rowData中,這個(gè)rowData你可以理解為一個(gè)包含基因各種信息的數(shù)據(jù)框。
其中gene_type是基因類型,幫助我們區(qū)分到底是lncRNA還是mRNA,當(dāng)然還包括很多其他類型。

# 提取rowData
rowdata <- rowData(se)

# 看看rowData包括哪些內(nèi)容,可以看到里面有我們需要的gene_name和gene_type
names(rowdata)
##  [1] "source"      "type"        "score"       "phase"       "gene_id"    
##  [6] "gene_type"   "gene_name"   "level"       "hgnc_id"     "havana_gene"

# gene_type是基因類型,看看有哪些
table(rowdata$gene_type)
## 
##                          IG_C_gene                    IG_C_pseudogene 
##                                 14                                  9 
##                          IG_D_gene                          IG_J_gene 
##                                 37                                 18 
##                    IG_J_pseudogene                      IG_pseudogene 
##                                  3                                  1 
##                          IG_V_gene                    IG_V_pseudogene 
##                                145                                187 
##                             lncRNA                              miRNA 
##                              16901                               1881 
##                           misc_RNA                            Mt_rRNA 
##                               2212                                  2 
##                            Mt_tRNA             polymorphic_pseudogene 
##                                 22                                 48 
##               processed_pseudogene                     protein_coding 
##                              10167                              19962 
##                         pseudogene                           ribozyme 
##                                 18                                  8 
##                               rRNA                    rRNA_pseudogene 
##                                 47                                497 
##                             scaRNA                              scRNA 
##                                 49                                  1 
##                             snoRNA                              snRNA 
##                                943                               1901 
##                               sRNA                                TEC 
##                                  5                               1057 
##                          TR_C_gene                          TR_D_gene 
##                                  6                                  4 
##                          TR_J_gene                    TR_J_pseudogene 
##                                 79                                  4 
##                          TR_V_gene                    TR_V_pseudogene 
##                                106                                 33 
##   transcribed_processed_pseudogene     transcribed_unitary_pseudogene 
##                                500                                138 
## transcribed_unprocessed_pseudogene    translated_processed_pseudogene 
##                                939                                  2 
##  translated_unprocessed_pseudogene                 unitary_pseudogene 
##                                  1                                 98 
##             unprocessed_pseudogene                          vault_RNA 
##                               2614                                  1

gene_name就是gene_symbol,我們的id轉(zhuǎn)換就用這一列信息。

# gene_name就是gene_symbol,就是我們需要的
head(rowdata$gene_name)
## [1] "TSPAN6"   "TNMD"     "DPM1"     "SCYL3"    "C1orf112" "FGR"
length(rowdata$gene_name)
## [1] 60660

還有一個(gè)重要的知識(shí)點(diǎn)是:SummarizedExperiment對(duì)象可以取子集,就像對(duì)數(shù)據(jù)框取子集那樣,選擇符合條件的行和列,并且子集也是SummarizedExperiment對(duì)象!

rowdata <- rowData(se)

# 分別提取mRNA和lncRNA的SummarizedExperiment對(duì)象
# 根據(jù)gene_type取子集,太簡(jiǎn)單了!
se_mrna <- se[rowdata$gene_type == "protein_coding",]
se_lnc <- se[rowdata$gene_type == "lncRNA"]

se_mrna #還是一個(gè)SummarizedExperiment對(duì)象,神奇!
## class: RangedSummarizedExperiment 
## dim: 19962 177 
## metadata(1): data_release
## assays(6): unstranded stranded_first ... fpkm_unstrand fpkm_uq_unstrand
## rownames(19962): ENSG00000000003.15 ENSG00000000005.6 ...
##   ENSG00000288674.1 ENSG00000288675.1
## rowData names(10): source type ... hgnc_id havana_gene
## colnames(177): TCGA-AG-3580-01A-01R-0821-07
##   TCGA-AF-2692-11A-01R-A32Z-07 ... TCGA-AG-3894-01A-01R-1119-07
##   TCGA-AG-3574-01A-01R-0821-07
## colData names(107): barcode patient ... paper_vascular_invasion_present
##   paper_vital_status
se_lnc
## class: RangedSummarizedExperiment 
## dim: 16901 177 
## metadata(1): data_release
## assays(6): unstranded stranded_first ... fpkm_unstrand fpkm_uq_unstrand
## rownames(16901): ENSG00000082929.8 ENSG00000083622.8 ...
##   ENSG00000288667.1 ENSG00000288670.1
## rowData names(10): source type ... hgnc_id havana_gene
## colnames(177): TCGA-AG-3580-01A-01R-0821-07
##   TCGA-AF-2692-11A-01R-A32Z-07 ... TCGA-AG-3894-01A-01R-1119-07
##   TCGA-AG-3574-01A-01R-0821-07
## colData names(107): barcode patient ... paper_vascular_invasion_present
##   paper_vital_status

提取表達(dá)矩陣

有了這些東西,就可以提取表達(dá)矩陣了,直接使用assay()搞定!

# mRNA的counts矩陣
expr_counts_mrna <- assay(se_mrna,"unstranded")

# mRNA的tpm矩陣
expr_tpm_mrna <- assay(se_mrna,"tpm_unstrand")

# mRNA的fpkm矩陣
expr_fpkm_mrna <- assay(se_mrna,"fpkm_unstrand")

# lncRNA的counts矩陣
expr_counts_lnc <- assay(se_lnc,"unstranded")

# lncRNA的tpm矩陣
expr_tpm_lnc <- assay(se_lnc,"tpm_unstrand")

# lncRNA的fpkm矩陣
expr_fpkm_lnc <- assay(se_lnc,"fpkm_unstrand")

簡(jiǎn)單!方便!快捷!
隨便展示下:

expr_counts_mrna[1:10,1:2]
##                    TCGA-AG-3580-01A-01R-0821-07 TCGA-AF-2692-11A-01R-A32Z-07
## ENSG00000000003.15                         3199                         5839
## ENSG00000000005.6                             6                           91
## ENSG00000000419.13                          828                         1867
## ENSG00000000457.14                          386                          639
## ENSG00000000460.17                          228                          289
## ENSG00000000938.13                          130                          452
## ENSG00000000971.16                          277                         5170
## ENSG00000001036.14                         1648                         2946
## ENSG00000001084.13                          823                         2414
## ENSG00000001167.14                          619                         1487
image.png

添加gene_symbol

添加gene_symbol也就非常簡(jiǎn)單了,只要提取gene_name這一列,然后和原來(lái)的表達(dá)矩陣合并即可!

# 先提取gene_name
symbol_mrna <- rowData(se_mrna)$gene_name
head(symbol_mrna)
## [1] "TSPAN6"   "TNMD"     "DPM1"     "SCYL3"    "C1orf112" "FGR"

symbol_lnc <- rowData(se_lnc)$gene_name
head(symbol_lnc)
## [1] "LINC01587"  "AC000061.1" "AC016026.1" "IGF2-AS"    "RRN3P2"    
## [6] "AC087235.1"

和你喜歡的表達(dá)矩陣合并就行了:

expr_counts_mrna_symbol <- cbind(data.frame(symbol_mrna),
                                 as.data.frame(expr_counts_mrna))
image.png

非常順利~

但是呢,此時(shí)gene_symbol是有重復(fù)的,看上圖中就有2個(gè)CD99,需要去重!

去重復(fù)也很簡(jiǎn)單,這里我們保留最大的那個(gè)。

suppressPackageStartupMessages(library(tidyverse))

expr_read <- expr_counts_mrna_symbol %>% 
  as_tibble() %>% # tibble不支持row name,我竟然才發(fā)現(xiàn)!
  mutate(meanrow = rowMeans(.[,-1]), .before=2) %>% 
  arrange(desc(meanrow)) %>% 
  distinct(symbol_mrna,.keep_all=T) %>% 
  select(-meanrow) %>% 
  column_to_rownames(var = "symbol_mrna") %>% 
  as.data.frame()

不過還是要注意,gene_symbol是有重復(fù)的,需要去重復(fù)哦~
結(jié)果就變成大家最熟悉的表達(dá)矩陣了:


image.png

這樣一個(gè)表達(dá)矩陣就搞定了!

本文首發(fā)于公眾號(hào):醫(yī)學(xué)和生信筆記

醫(yī)學(xué)和生信筆記,專注R語(yǔ)言在臨床醫(yī)學(xué)中的使用,R語(yǔ)言數(shù)據(jù)分析和可視化。主要分享R語(yǔ)言做醫(yī)學(xué)統(tǒng)計(jì)學(xué)、meta分析、網(wǎng)絡(luò)藥理學(xué)、臨床預(yù)測(cè)模型、機(jī)器學(xué)習(xí)、生物信息學(xué)等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容