author: "Hannisal"
date: "2020/10/4"
【TCGA数据库简介】
TCGA是美国国家癌症研究所(National Cancer Institute)和美国人类基因组研究所(National Human Genome Research Institute)共同监督的一个项目,旨在应用高通量的基因组分析技术,以帮助人们对癌症有个更好的认知,从而提高对于癌症的预防、诊断和治疗能力。
TCGA第一阶段的测试项目,是以胶质母细胞瘤、肺癌和卵巢癌作为研究重点。其后的第二阶段,计划到2014年完成20-25种不同癌型的分析,而TCGA超额完成任务,已经收录包括10种罕见癌型在内的33种类型的癌症。
作为目前最大的癌症基因信息数据库,TCGA的全面不仅仅体现在众多癌型上,还体现在多组学数据,包括基因表达数据、miRNA表达数据、拷贝数变异、DNA甲基化、SNP,而相对于GEO数据库,TCGA最大的优势是丰富且规范的临床数据,以及针对每种癌型的大样本量,简直令人无法抗拒!
注意,TCGA现在的数据均收录在GDC中,而GDC同时也收录了TARGET数据库的数据,在GDC中可以通过GDC Data Portal 和 GDC Legacy Archive 这两种方式获得TCGA数据,官方解释如下:
Data in the GDC Data Portal has been harmonized using GDC Bioinformatics Pipelines whereas data in the GDC Legacy Archive is an unmodified copy of data that was previously stored in CGHub and in the TCGA Data Portal hosted by the TCGA Data Coordinating Center (DCC).
总结来说就是,GDC Data Portal 中的数据是最新经过统一标准整理的,但有些数据还未开放,而 GDC Legacy Archive 中的数据是所有未经处理的数据,更全面。
【数据下载方法】
- 1.用TCGA的官网下载工具下载
本人觉得也是最可靠的一种方法,因为你拿到的数据都是没有经过处理的。 - 2.用Biolinks包下载
- 3.用RTCGA包下载
Using GDC tool download data from TCGA
在Reposity里按照条目筛选自己需要的数据
下载前文件准备(都可在TCGA里直接下载获取):
- gdc-client(mac)或gdc-client.exe(windows)
- manifest(临床数据和表达数据都有对应的manifest文件)
- cart-json文件
需要放在同一个工作目录下!
options(stringsAsFactors = F)
library(stringr)
cancer_type="TCGA-COAD" ## 设置自己需要下载的癌症种类
if(!dir.exists("clinical"))dir.create("clinical") ## 创建clinical文件夹,用于储存下载的临床数据文件
if(!dir.exists("expdata"))dir.create("expdata") ## 创建expdata文件夹,用于储存下载的表达数据文件
dir()
下面两行命令在terminal完成
- ./gdc-client.exe download -m gdc_manifest_cl.2020-03-23.txt -d clinical
- ./gdc-client.exe download -m gdc_manifest_expdata.2020-03-23.txt -d expdata
manifest文件名改成自己下载的,windows的gdc-client后面有exe,这两句代码也可在命令提示符里面运行(cmd)
踩过坑,gdc-client.exe还是在你下载manifest文件时候一起下载,最好不要用以前的,可能会出错
可以看到,下载的文件是按样本存放的,且一个样本放在一个文件夹里分开储存,我们需要得到的是表格,需要将他们批量读入R语言并整理。
结果
- 临床数据文件有385个
- 表达数据文件有437个
读取并整理临床数据
library(XML)
result <- xmlParse("./clinical/142aea0e-7a7b-4ac4-9dbb-0f62e2379599/nationwidechildrens.org_clinical.TCGA-W5-AA2O.xml")
rootnode <- xmlRoot(result)
rootsize <- xmlSize(rootnode)
print(rootnode[1])
> $admin
>
> Nationwide Children's Hospital
> F61519E3-A7F3-4CED-8A4E-6D10596518C3
> 157.71.0
> TCGA
> COAD
> 22
> 12
> xsd_ver="1.17">2016
>
> false
>
>
>
>
#print(rootnode[2]) 我们需要的是节点2
xmldataframe <- xmlToDataFrame(rootnode[2])
head(t(xmlToDataFrame(rootnode[2])))
## 所有的临床文件的路径
xmls = dir("clinical/",pattern = "*.xml$",recursive = T)
## 定义一个函数
td = function(x){
result <- xmlParse(file.path("clinical/",x))
rootnode <- xmlRoot(result)
xmldataframe <- xmlToDataFrame(rootnode[2])
return(t(xmldataframe))
}
## 循环读取
cl = lapply(xmls,td)
cl_df <- t(do.call(cbind,cl))
cl_df[1:3,1:3]
## 转为数据框
clinical = data.frame(cl_df)
clinical[1:4,1:4]
## 保存为Rdata文件
save(clinical,file = "clinical-CORA.Rdata")
读取并整理表达矩阵
探索数据:先任选两个counts文件读取,并观察geneid的顺序是否一致。
options(stringsAsFactors = F)
x = read.table("expdata/0be16d47-97ee-4aed-a227-3435862f1c70/97503aa9-93a5-4ff6-bb19-203ea235c2bf.htseq.counts.gz")
x2 = read.table("expdata/0c1f1a8b-b655-42b6-847a-9810235836a2/e158f016-7605-45b7-8e4f-bbe313fc461c.htseq.counts.gz")
identical(x$V1,x2$V1)
> [1] TRUE
由此可知,他们的geneid顺序是一致的,可以直接cbind,不会导致顺序错乱。
批量读取所有的counts.gz文件。
count_files = dir("expdata/",pattern = "*.htseq.counts.gz$",recursive = T)
ex = function(x){
result <- read.table(file.path("expdata/",x),row.names = 1,sep = "\t")
return(result)
}
head(ex("0be16d47-97ee-4aed-a227-3435862f1c70/97503aa9-93a5-4ff6-bb19-203ea235c2bf.htseq.counts.gz"))
exp = lapply(count_files,ex)
exp <- do.call(cbind,exp)
dim(exp)
> [1] 60488 437
exp[1:4,1:4]
发现问题:这样产生出来的表达矩阵没有列名。
解决办法:找到一个文件名与样本ID一一对应的文件。cart-json文件
meta <- jsonlite::fromJSON("metadata.cart.2020-10-04.json")
colnames(meta)
ids <- meta$associated_entities;class(ids)
ids[[1]]
class(ids[[1]][,1])
可以看到,meta$associated_entities是个列表,这个列表里包含数据框,数据框的第一列内容就是tcga样本id。
注意,换了数据需要自己探索存放在哪一列。不一定是完全一样的,需要确认清楚。
ID = sapply(ids,function(x){x[,1]}) ## 文件id
file2id = data.frame(file_name = meta$file_name,
ID = ID)
文件名与TCGA样本ID的对应关系已经得到file2id,接下来是将其添加到表达矩阵中,成为行名。需要找到读取文件的顺序,一一对应修改。
head(file2id$file_name)
head(count_files)
count_files2 = stringr::str_split(count_files,"/",simplify = T)[,2]
count_files2[1] %in% file2id$file_name
count_files2的顺序就是列名的顺序,根据它来调整file2id的顺序。此处需要再次理解一下match函数。
file2id = file2id[match(count_files2,file2id$file_name),]
colnames(exp) = file2id$ID
exp[1:4,1:4]
表达矩阵整理完成,需要过滤一下那些在很多样本里表达量都为0的基因。过滤标准不唯一。
dim(exp)
exp = exp[apply(exp, 1, function(x) sum(x > 1) > 9), ]
dim(exp)
exp[1:4,1:4]
save(exp,file = "exp_counts.Rdata")
制作分组文件
根据样本ID的第14-15位,给样本分组(tumor和normal);1-10是肿瘤样本,11-20是正常样本
table(str_sub(colnames(exp),14,15))
group_list = ifelse(as.numeric(str_sub(colnames(exp),14,15)) < 10,'tumor','normal')
group_list = factor(group_list,levels = c("normal","tumor"))
table(group_list)
save(group_list,file = “CORD_group_list.Rdata")
我只下载了肿瘤样本,所以不需要分组文件
肺癌数据下载示例:
【致谢】感谢生信技能树的小洁老师的讲解!
【参考文献】
https://www.jianshu.com/p/3bd31fafb0d2
https://www.jianshu.com/u/c93ac360691a