聽說你想要TCGA的miRNA表達(dá)數(shù)據(jù)

以前都是直接拿前體數(shù)據(jù)去處理,今天偶然在群里看到,想用isform做一下試試。我非常喜歡gdc-client這個(gè)官方下載工具,它的數(shù)據(jù)以樣本的方式組織,優(yōu)點(diǎn)是可以隨便組和,缺點(diǎn)是需要后期批量讀取和整理,代碼難度大。無所謂啦,習(xí)慣了都一樣。

日常小記:我8月22號講完了線上課,趁現(xiàn)在疫情已經(jīng)穩(wěn)定了,我趕緊一張機(jī)票把自己鏟回了老家。目前處于爸媽愛不釋手期(應(yīng)該是過幾天才會(huì)開始被嫌棄)。這一篇推文我寫了不到一個(gè)半小時(shí),被投喂了四次,一次是二姨家的玉米,一次是鄰居家的大桃子,一次是家門口中的葡萄,就在寫這段話的時(shí)候麻麻又去商店拎回來一箱牛奶哈哈哈哈

正文開始!

1.從網(wǎng)頁選擇數(shù)據(jù),下載manifest文件

參考(本來這里應(yīng)該有個(gè)鏈接,但是被封了,沒了,去國民聊天軟件搜生信星球看吧),選擇file的時(shí)候找到miRNAseq的isform數(shù)據(jù)即可。

2.使用gdc-client工具下載

注意

將gdc-client(mac)或gdc-client.exe(windows)放在工作目錄下;

將manifest文件放在工作目錄下。

library(stringr)
if(!dir.exists("expdata"))dir.create("expdata")
dir()
#> [1] "1_gdc-client.html"            
#> [2] "1_gdc-client.Rmd"             
#> [3] "clinical"                     
#> [4] "expdata"                      
#> [5] "gdc-client.exe"               
#> [6] "gdc_manifest.2021-08-22.txt"  
#> [7] "metadata.cart.2021-08-24.json"
#> [8] "tcga_1.Rproj"
## 這句下載的代碼要在terminal運(yùn)行
#./gdc-client.exe download -m gdc_manifest.2021-08-22.txt -d expdata

length(dir("./expdata/"))
#> [1] 45

可以看到,下載的文件是按樣本存放的,我們需要得到的是表格,需要將他們批量讀入R語言并整理。

3.整理表達(dá)矩陣

探索數(shù)據(jù):先任選兩個(gè)counts文件讀取,并觀察geneid的順序是否一致。

library(tidyverse)
x = read.table("expdata/0cbb843b-c6d4-4ad8-8678-6df63074d1a0/40a39e83-23c6-4240-a1a0-ddf221f23103.mirbase21.isoforms.quantification.txt",sep = "\t",header = T) 
head(x)
#>       miRNA_ID                isoform_coords
#> 1 hsa-let-7a-1 hg38:chr9:94175961-94175982:+
#> 2 hsa-let-7a-1 hg38:chr9:94175961-94175983:+
#> 3 hsa-let-7a-1 hg38:chr9:94175961-94175984:+
#> 4 hsa-let-7a-1 hg38:chr9:94175962-94175981:+
#> 5 hsa-let-7a-1 hg38:chr9:94175962-94175982:+
#> 6 hsa-let-7a-1 hg38:chr9:94175962-94175983:+
#>   read_count reads_per_million_miRNA_mapped
#> 1          5                       0.756391
#> 2          7                       1.058948
#> 3         12                       1.815339
#> 4        302                      45.686022
#> 5      12255                    1853.914558
#> 6      15830                    2394.734187
#>   cross.mapped        miRNA_region
#> 1            N mature,MIMAT0000062
#> 2            N mature,MIMAT0000062
#> 3            N mature,MIMAT0000062
#> 4            N mature,MIMAT0000062
#> 5            N mature,MIMAT0000062
#> 6            N mature,MIMAT0000062

可見這個(gè)數(shù)據(jù)里不只有count數(shù)據(jù),還有前體和成熟體的id,而且還是分了區(qū)間。接下來需要:

  • 只要成熟體id和count兩列
  • 按照成熟體分組求和,得出每個(gè)成熟體的count之和

一個(gè)文件整理成功后,對所有的樣本文件批量做相同的處理

x2 = x %>%
  dplyr::select(c(6,3)) %>% 
  group_by(miRNA_region) %>% 
  summarise(read_count = sum(read_count))

count_files = dir("expdata/",pattern = "*isoforms.quantification.txt$",recursive = T)

exp = list()
for(i in 1:length(count_files)){
  exp[[i]] <- read.table(paste0("expdata/",count_files[[i]]),sep = "\t",header = T) %>%
  dplyr::select(c(6,3)) %>% 
  group_by(miRNA_region) %>% 
  summarise(read_count = sum(read_count)) 
}
sapply(exp, nrow)
#>  [1] 650 828 799 791 805 725 778 783 751 781 703 780
#> [13] 757 767 731 800 714 781 722 749 777 795 735 828
#> [25] 832 760 805 911 629 719 765 733 801 825 839 924
#> [37] 730 815 710 740 776 788 711 908 832

檢查發(fā)現(xiàn),每個(gè)文件都進(jìn)來的數(shù)據(jù),它的行數(shù)(也就是miRNA成熟體的個(gè)數(shù))是不一樣多的。

所以就不能cbind了,Resuce配merge,空著的地方會(huì)填充上NA,給他改成0即可。

另,最后三行需要去掉,不是表達(dá)矩陣矩陣正式內(nèi)容。

m = Reduce(function(x, y) merge(x, y, by= 'miRNA_region',all = T), exp)
m[is.na(m)]=0
exp <- column_to_rownames(m,var = "miRNA_region")
exp = exp[-((nrow(exp)-2):nrow(exp)),]
dim(exp)
#> [1] 1753   45
exp[1:4,1:4]
#>                     read_count.x read_count.y
#> mature,MIMAT0000062        27647       167773
#> mature,MIMAT0000063        15016       122311
#> mature,MIMAT0000064         1196        10586
#> mature,MIMAT0000065          194         1521
#>                     read_count.x.1 read_count.y.1
#> mature,MIMAT0000062         183894         152801
#> mature,MIMAT0000063         206980         106415
#> mature,MIMAT0000064          13853          10759
#> mature,MIMAT0000065            912            978

4.行名轉(zhuǎn)換

行名里的前綴"mature"可以去掉。MIM開頭的是mirBase數(shù)據(jù)庫里的id,需要轉(zhuǎn)換為大多以hsa-miR開頭的成熟體id。

GDC數(shù)據(jù)庫使用的mirBasev21版本的id,我們轉(zhuǎn)換時(shí)需要使用相同的版本,使用miRBaseVersions.db包更絲滑

table(str_detect(rownames(exp),"mature,"))
#> 
#> TRUE 
#> 1753
rownames(exp) = str_remove(rownames(exp),"mature,")
library(miRBaseVersions.db)
mh <- select(miRBaseVersions.db,
               keys = rownames(exp),
               keytype = "MIMAT",
               columns = c("ACCESSION","NAME","VERSION"))
head(mh)
#>      ACCESSION          NAME VERSION
#> 1 MIMAT0000062 hsa-let-7a-5p      22
#> 2 MIMAT0000063 hsa-let-7b-5p      22
#> 3 MIMAT0000064 hsa-let-7c-5p      22
#> 4 MIMAT0000065 hsa-let-7d-5p      22
#> 5 MIMAT0000066 hsa-let-7e-5p      22
#> 6 MIMAT0000067 hsa-let-7f-5p      22
mh = mh[mh$VERSION=="21",]
mh = mh[match(rownames(exp),mh$ACCESSION),]
identical(rownames(exp),mh$ACCESSION)
#> [1] TRUE
table(!duplicated(mh$NAME))
#> 
#> TRUE 
#> 1753
rownames(exp) = mh$NAME
exp[1:4,1:4]
#>               read_count.x read_count.y
#> hsa-let-7a-5p        27647       167773
#> hsa-let-7b-5p        15016       122311
#> hsa-let-7c-5p         1196        10586
#> hsa-let-7d-5p          194         1521
#>               read_count.x.1 read_count.y.1
#> hsa-let-7a-5p         183894         152801
#> hsa-let-7b-5p         206980         106415
#> hsa-let-7c-5p          13853          10759
#> hsa-let-7d-5p            912            978

經(jīng)過這一圈折騰,終于得到一個(gè)正常行名的表達(dá)矩陣?yán)?。我比較了一下成熟體和前體id的差別和聯(lián)系,如下:

x = read.table("expdata/0cbb843b-c6d4-4ad8-8678-6df63074d1a0/40a39e83-23c6-4240-a1a0-ddf221f23103.mirbase21.isoforms.quantification.txt",sep = "\t",header = T) %>%
  dplyr::select(c(6,1)) %>% 
  distinct()
x$miRNA_region = str_remove(x$miRNA_region,"mature,")
x = merge(x,mh,by.x = "miRNA_region",by.y = "ACCESSION")  
head(x)
#>   miRNA_region     miRNA_ID          NAME VERSION
#> 1 MIMAT0000062 hsa-let-7a-3 hsa-let-7a-5p      21
#> 2 MIMAT0000062 hsa-let-7a-2 hsa-let-7a-5p      21
#> 3 MIMAT0000062 hsa-let-7a-1 hsa-let-7a-5p      21
#> 4 MIMAT0000063   hsa-let-7b hsa-let-7b-5p      21
#> 5 MIMAT0000064   hsa-let-7c hsa-let-7c-5p      21
#> 6 MIMAT0000065   hsa-let-7d hsa-let-7d-5p      21

5.列名轉(zhuǎn)換

這個(gè)仍然是參考之前的鏈接(http://www.itdecent.cn/p/af9b257c8a20),難得啊沒給我封了。

meta <- jsonlite::fromJSON("metadata.cart.2021-08-24.json")
ID = sapply(meta$associated_entities,
            function(x){x$entity_submitter_id})
file2id = data.frame(file_name = meta$file_name,
                     ID = ID)
count_files2 = stringr::str_split(count_files,"/",simplify = T)[,2]
file2id = file2id[match(count_files2,file2id$file_name),]
colnames(exp) = file2id$ID
exp[1:4,1:4]
#>               TCGA-W5-AA2O-01A-11R-A41D-13
#> hsa-let-7a-5p                        27647
#> hsa-let-7b-5p                        15016
#> hsa-let-7c-5p                         1196
#> hsa-let-7d-5p                          194
#>               TCGA-4G-AAZT-01A-11R-A41D-13
#> hsa-let-7a-5p                       167773
#> hsa-let-7b-5p                       122311
#> hsa-let-7c-5p                        10586
#> hsa-let-7d-5p                         1521
#>               TCGA-ZH-A8Y1-01A-11R-A41D-13
#> hsa-let-7a-5p                       183894
#> hsa-let-7b-5p                       206980
#> hsa-let-7c-5p                        13853
#> hsa-let-7d-5p                          912
#>               TCGA-YR-A95A-01A-12R-A41D-13
#> hsa-let-7a-5p                       152801
#> hsa-let-7b-5p                       106415
#> hsa-let-7c-5p                        10759
#> hsa-let-7d-5p                          978

6.表達(dá)矩陣的過濾

表達(dá)矩陣整理完成,需要過濾一下那些在很多樣本里表達(dá)量都為0的基因。過濾標(biāo)準(zhǔn)不唯一。

dim(exp)
#> [1] 1753   45
#exp = exp[rowSums(exp)>0,]
k = apply(exp, 1, function(x) sum(x > 0) > 9);table(k)
#> k
#> FALSE  TRUE 
#>   802   951
exp = exp[k,]
dim(exp)
#> [1] 951  45
exp[1:4,1:4]
#>               TCGA-W5-AA2O-01A-11R-A41D-13
#> hsa-let-7a-5p                        27647
#> hsa-let-7b-5p                        15016
#> hsa-let-7c-5p                         1196
#> hsa-let-7d-5p                          194
#>               TCGA-4G-AAZT-01A-11R-A41D-13
#> hsa-let-7a-5p                       167773
#> hsa-let-7b-5p                       122311
#> hsa-let-7c-5p                        10586
#> hsa-let-7d-5p                         1521
#>               TCGA-ZH-A8Y1-01A-11R-A41D-13
#> hsa-let-7a-5p                       183894
#> hsa-let-7b-5p                       206980
#> hsa-let-7c-5p                        13853
#> hsa-let-7d-5p                          912
#>               TCGA-YR-A95A-01A-12R-A41D-13
#> hsa-let-7a-5p                       152801
#> hsa-let-7b-5p                       106415
#> hsa-let-7c-5p                        10759
#> hsa-let-7d-5p                          978
exp = as.matrix(exp)

大功告成咯~

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

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

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