加入我們用TCGAbiolinks下載之后我們可以看一下另外一種操作
image.png
data_download_from_gdc
打開后發現是1208個文件夾,為什么是1208個,這跟我當時學的數據有關系,可以不用管讓 每個文件夾里面還有個壓縮文件,我們現在的任務就是,如何把每個文件夾里面的壓縮文件放置在統一的文件夾中 假設我們的文件夾是這個,
首先設置工作目錄到這一文件夾下:
00_data_read_in_one_file
并且他就是創建在 data_download_from_gdc中,所以現在文件夾的總體數目是應該是1208加1就是1209個 我們在R語言中輸入
length(list.files())
這個命令中list.files()的意思就是列舉當前工作目錄中文件,length的意思就是有有多少個,一看,果真是1209個 其實
length(dir())
這個命令也能做這個事情。 為什么我的文件夾要起一個這么詭異的名字? 以00開頭??
這是因為我需要讓他處于文件中第一個位置,我們來驗證一下:
dir()[1]
發現第一個文件夾就是他,這樣我就每次循環訪問后面的1208個文件夾,每次都把看到的東西復制過來就可以了
你說我為什么這么事無巨細,因為我可以很簡潔,也可以很啰嗦,取決于我是否想要別人聽的懂。
在R語言里面是可以直接創建文件夾的,鼠標右擊也可以
dir.create("00_data_read_in_one_file") #創建新的文件夾,確保文件夾排在第一位
遍歷和復制,為什么從2開始,因為第一個文件夾你已經知道了
for (dirname in dir()[2:length(dir())]){
file <- list.files(dirname,pattern = "*.counts") #找到對應文件夾中的內容,pattern可以是正則表達式
file.copy(paste0(dirname,"/",file),"00_data_read_in_one_file") #復制內容到新的文件夾
}
運行完了之后,我們可以打開文件夾看一下,確實在里面,這時候可以全部選擇,
將文件解壓到data_unzip文件夾,解壓數據1.42GB,
我們發現即使這個樣子,文件的名稱也是怪怪的
那我們就來轉換,轉換的信息藏在metadata文件中,這個要去看開始的那個帖子下載
切換一下工作目錄
setwd("~/skill_practice/BRCA_999")
注意一開始我就建立了 BRCA_999這個文件夾, data_download_from_gdc是他的子文件夾, 00_data_read_in_one_file又是 data_download_from_gdc的子文件夾 metadata是json格式的
讀入json格式的文件,他是一個1208行,15列的數據框
metadata <- jsonlite::fromJSON("metadata.cart.2017-11-15T09_56_59.722935.json")
我們轉換的信息就是兩列filename和associatedentities,我們把它選出來
require(dplyr)
metadata_id <- metadata %>%
dplyr::select(c(file_name,associated_entities))
我需要的是 file_name和樣本名稱,樣本名稱藏在了 associated_entities 列表中里面包括了 entity_id, case_id, entity_submitter_id, entity_type這四個項目,查看第一個了解一下
metadata$associatedentities[1] [[1]]
entityid caseid 1 52033f64-1e6f-4657-a4fb-7cfeffc61951 39de7761-e762-4811-b95c-8216b79ae06b entitysubmitterid entitytype 1 TCGA-AN-A0XW-01A-11R-A109-07 aliquot
現在的想法是我把filename和 associated_entities中的 entity_submitter_id提取出來,做成一個數據框,然后我批量對應轉換
naid_df <- data.frame()
for (i in 1:1208){
naid_df[i,1] <- substr(metadata_id$file_name[i],1,nchar(metadata_id$file_name[i])-3)
naid_df[i,2] <- metadata_id$associated_entities[i][[1]]$entity_submitter_id
}
現在把1208個小文件讀入一個矩陣文件,并且給每一個文件加上 filename和 entity_submitter_id 論壇有道題目就是處理的這個問題
生信編程直播第四題:多個同樣的行列式文件合并起來
http://www.biotrainee.com:8080/thread-603-1-1.html
我自己也給出了R語言的解法
在R語言中將多個同樣的行列式文件合并起來
http://guoshipeng.com/2017/11/10/14-R-for-binding-colums/
但是當時不知道,TCGA的單個文件是沒有列名的,導致無法合并,所以本次要復雜一點
讀入所有解壓的文件 1208個
nameList <- list.files("data_unzip/")
location <- which(naid_df==nameList[1],arr.ind = TRUE) ##which函數有一個已知value返回坐標的功能
TCGA_id <- as.character(naid_df[location[1],2]) ##通過坐標,獲取TCGA_id
expr_df<- read.table(paste0("data_unzip/",nameList[1]),stringsAsFactors = F, header = F) #讀入第一個文件,保存為data.frame
names(expr_df) <- c("gene_id",TCGA_id) #給剛才數據庫命名
這邊開始批量作業
for (i in 2:length(nameList)){
location <- which(naid_df==nameList[i],arr.ind = TRUE)
TCGA_id <- as.character(naid_df[location[1],2])
dfnew <- read.table(paste0("data_unzip/",nameList[i]),stringsAsFactors = F,header = F)
names(dfnew) <- c("gene_id",TCGA_id)
expr_df <- inner_join(expr_df,dfnew,by="gene_id")
}
晚上走的時候沒運行完,早上來的時候已經完畢,限速環節應該是read.table,早上再來嘗試運行一次總是說內存不夠 我嘗試了一下fread來解決這個問題:
require(data.table)
nameList <- list.files("data_unzip/")
location <- which(naid_df==nameList[1],arr.ind = TRUE)
TCGA_id <- as.character(naid_df[location[1],2])
expr_df<- fread(paste0("data_unzip/",nameList[1]))
names(expr_df) <- c("gene_id",TCGA_id)
for (i in 2:length(nameList)){
location <- which(naid_df==nameList[i],arr.ind = TRUE)
TCGA_id <- as.character(naid_df[location[1],2])
dfnew <- fread(paste0("data_unzip/",nameList[i]))
names(dfnew) <- c("gene_id",TCGA_id)
expr_df <- inner_join(expr_df,dfnew,by="gene_id")
}
結果大概2分鐘搞定,速度喜人!!!! 總共60488行,查看最后幾行發現有5行不是我們要的
tail(expr_df$gene_id,10)
去掉最后五行
expr_df <- expr_df[1:(length(expr_df$gene_id)-5),]
保存數據,大概是3個G左右
save(expr_df,file = "expr_df.Rda")
下面開始id轉換,信息在GTF文件中表達矩陣里面的gene_id有小數點, 而GTF文件中沒有,調整一下,先以“.”分列,在去掉小數點后的列
require(dplyr)
require(tidyr)
expr_df_nopoint <- expr_df %>%
tidyr::separate(gene_id,into = c("gene_id","drop"),sep="\\.") %>%
dplyr::select(-drop)
save(expr_df_nopoint,file = "expr_df_nopoint.Rda")
load(file = "expr_df_nopoint.Rda")
下載GTF文件來注釋 ftp://ftp.ensembl.org/pub/release-90/gtf/homo_sapiens
安裝包:
source("https://bioconductor.org/biocLite.R")
options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/")
biocLite("rtracklayer")
biocLite("SummarizedExperiment")
讀入GTF數據
gtf1 <- rtracklayer::import('Homo_sapiens.GRCh38.90.chr.gtf')
gtf_df <- as.data.frame(gtf1)
保存數據
save(gtf_df,file = "gtf_df.Rda")
讀入27個變量,2612129個觀測,測試一下顯示的不錯
test <- gtf_df[1:5,]
View(test)
進展的很快,我們現在可以提取mRNA的表達矩陣啦, 以gtf文件中的 gene_biotype為標準,里面寫 protein_coding的就是編碼基因
首先要把這些基因提取出來,然后與表達譜融合,我在這個例子還提取了 gene_name, gene_id,所以最后的時候,我把三種表達方式合在了一起 這樣,以后我無論用什么方式都可以選出我要的基因了
require(dplyr)
require(tidyr)
mRNA_exprSet <- gtf_df %>%
dplyr::filter(type=="gene",gene_biotype=="protein_coding") %>% #篩選gene,和編碼指標
dplyr::select(c(gene_name,gene_id,gene_biotype)) %>%
dplyr::inner_join(expr_df_nopoint,by ="gene_id") %>%
tidyr::unite(gene_id,gene_name,gene_id,gene_biotype,sep = " | ")
得到19688行,跟我們的認知很吻合
保存數據
save(mRNA_exprSet,file = "mRNA_exprSet.Rda")
下面進行標準化
suppressPackageStartupMessages(library(DESeq2))
suppressPackageStartupMessages(library(edgeR))
本次使用的方法是DESeq2中vst法 至于有哪幾種方法,還有該選什么方法,明天會有一個帖子介紹
制作metadata,區別腫瘤和正常組,這時候需要對TCGA的id有個了解,從左往右數數,第14,15上的數字很重要 其中01-09是tumor,也就是癌癥樣本;其中10-29是normal,也就是癌旁
metadata <- data.frame(names(mRNA_exprSet)[-1])
for (i in 1:length(metadata[,1])) {
num <- as.numeric(substring(metadata[i,1],14,15))
if (num %in% seq(1,9)) {metadata[i,2] <- "T"}
if (num %in% seq(10,29)) {metadata[i,2] <- "N"}
}
加個名稱
names(metadata) <- c("TCGA_id","sample")
將sample轉化成factor
metadata$sample <- as.factor(metadata$sample)
我們可總結一下,有112例normal,1096例腫瘤組織
metadata %>% dplyr::group_by(sample) %>% summarise(n())
保存數據,我想問一下,為什么你老是要保存數據,因為我眼里常含淚花
save(metadata,file = "metadata.Rda")
制作countData
mycounts <- mRNA_exprSet
keepGene=rowSums(edgeR::cpm(mycounts[-1])>0) >=2
table(keepGene);dim(mycounts)
這是數據維度19668 和1209
dim(mycounts[keepGene,])
剩余19546 1209
mycounts <-mycounts[keepGene,]
構建 DESeq對象
dds <-DataSetFromMatrix(countData=mycounts,
colData=metadata,
design=~sample,
tidy=TRUE)
標準化vst法,5分鐘
vsd <- vst(dds, blind = FALSE)
mRNA_exprSet_vst <- as.data.frame(assay(vsd))
save(mRNA_exprSet_vst,file = "mRNA_exprSet_vst.Rda")
load(file = "dds.Rda")
下面就是完整的過程
dds <- DESeq(dds)
save(dds,file = "dds_DEseq.Rda")
res <- results(dds, tidy=TRUE) #獲取結果
res <- as_tibble(res)
require(dplyr)
res <- res %>%
separate(row,c("symbol","ensemble","genetype"),sep = " \\| ") %>%
dplyr::select(- c(ensemble,genetype)) %>%
arrange(desc(abs(log2FoldChange))) %>% #排序。為了去重
distinct(symbol,.keep_all = TRUE) %>%
arrange(desc(log2FoldChange))#再次按照log2FoldChange從大到小排序
save(res,file = "result.Rda")
既然做了差異分析,那對下游基因注釋就是順手 的事情啦,我們沒有選擇,就用Y叔的包,clusterprofiler 在這之前我們需要獲得差異基因列表 這一步,就是基本數據框的基本操作,按照pvalue和fc來排序,選擇自己一定數量的基因,數量你來定,最終得到基因列表gene(我沒有演示,需要自己做)
加載包,加載之前確定自己裝了
library(DOSE)
library(GO.db)
library(org.Hs.eg.db)
library(topGO)
library(GSEABase)
library(clusterProfiler)
基因名稱轉換,返回的是數據框
gene = bitr(gene, fromType="SYMBOL", toType="ENTREZID", OrgDb="org.Hs.eg.db")
head(gene)
GO分析 細胞組分
ego_CC <- enrichGO(gene = gene$ENTREZID,
OrgDb= org.Hs.eg.db,
ont = "CC",
pAdjustMethod = "BH",
minGSSize = 1,
pvalueCutoff = 0.01,
qvalueCutoff = 0.01,
readable = TRUE)
生物過程
ego_BP <- enrichGO(gene = gene$ENTREZID,
OrgDb= org.Hs.eg.db,
ont = "BP",
pAdjustMethod = "BH",
minGSSize = 1,
pvalueCutoff = 0.01,
qvalueCutoff = 0.01,
readable = TRUE)
分子功能:
ego_MF <- enrichGO(gene = gene$ENTREZID,
OrgDb= org.Hs.eg.db,
ont = "MF",
pAdjustMethod = "BH",
minGSSize = 1,
pvalueCutoff = 0.01,
qvalueCutoff = 0.01,
readable = TRUE)
作圖
barplot(ego_CC, showCategory=20,title="EnrichmentGO_CC")#條狀圖,按p從小到大排的
dotplot(ego_BP,title="EnrichmentGO_BP_dot")#點圖,按富集的數從大到小的
KEGG分析
kk <- enrichKEGG(gene = gene$ENTREZID,
organism ="human",
pvalueCutoff = 0.01,
qvalueCutoff = 0.01,
minGSSize = 1,
#readable = TRUE ,
use_internal_data =FALSE)
作圖
barplot(kk)
dotplot(kk)