在我前面写过的如何批量下载TCGA里的数据(gdc-client方法)文章里,只涉及了如何批量下载TCGA数据,但是对于下载下来的那些文件没有整理。为什么呢?因为我懒。。。凡是用gdc-client下载过文件的小伙伴们一定注意到,你下载的几百个count文件,或者是FPKM文件,都是一个文件在一个文件夹里,而且还是压缩文件,就会很头疼,那么如何把这几百个文件整合到一个文件里呢?
下载完的数据长什么样?
批量下载后的数据,你会看到一长溜的,并且每一个文件夹里是个压缩的文件(这里我下载了546个文件):
怎么把这些文件夹里的压缩文件都提取到一个文件夹里?并且整合到同一个txt文件里?
这里参考了手把手学会TCGA数据分析这篇文章的代码,当然你要根据自己的实际情况更改代码,不要无脑的全盘copy。
#在你这些存储的几百个文件的文件夹里,新建一个文件夹
> dir.create('00000000000000000merge')
#计算当前路径里文件夹的数目,这里理论上应该是我546个文件夹+新建的1个
> i <- list.dirs()
#打印所有文件夹的名称
> i
然而这里有个问题,打印出来的文件夹多出一个,这是你的当前文件夹,这里的编号也涉及到后面的代码需要修改(这一步你也需要注意,因为我参考的那篇文章里没有出现这种情况,所以这就是我说的,为什么要具体情况具体分析):
[1] "." "./00000000000000000merge"
[3] "./003a33f3-3658-4e60-967c-dc97b83c105c" "./0097e580-5a77-4cc2-b43e-99df1eb9fad0"
[5] "./0133b9e4-884c-45f8-8bd0-e796d7058012" "./031eaab8-67fc-484c-ac4c-2678758ced23"
[7] "./03f33c10-915f-4523-8871-1482aaff3549" "./04303348-e957-474f-9667-0f36ee8cbbf6"
[9] "./04527ea0-e6b1-4bbc-8b30-983bb193779a" "./0494838d-60cc-4bb8-8edd-f53f11238e51"
[11] "./069ded62-6c9d-462c-8ae7-dde7437e5d7d" "./06a08433-a734-4fb6-b300-e4bb50209bca"
[13] "./06f89bc6-2e97-4bfa-989c-4934e7f28f05" "./07458e60-4784-4ba5-963c-a9acb12444e0"
..........
所以现在是546+1+1个文件夹。下面的代码你需要注意修改了:
# 把下载的所有文件夹copy到你新建的那个里面,这里注意顺序,上面那个"."文件夹编号是1,我新建的是2,其他下载的都是编号3以后的,所以这里应该是:
> m = i[3:548]
> for(n in m){
x.path=paste(n,list.files(n),sep='/')
file.copy(x.path,'./00000000000000000merge',recursive = T)}
复制后,进入你新建的文件夹里:
> setwd("/media/yanfang/FYWD/TCGA_data_analysis/TCGA_HNSCC/00000000000000000merge")
#再次查看有多少个文件在里面
> i <- list.files()
> i
现在所有的压缩文件就都在你新建的文件夹里了:
然后要合并这些压缩文件:
# merge
> x_merge=NULL
> for(n in i){
x=read.delim(n,col.names = c('ID',substr(n,1,9)))
if(is.null(x_merge)){ x_merge=x } else{ x_merge=merge(x_merge,x,by='ID') }
}
> rownames(x_merge) <- x_merge$ID
有人可能会疑惑,这不是还没解压缩么?没关系,R可以直接读取压缩文件。运行后,View一下你的x_merge这个矩阵,这个矩阵就是合并了500多个压缩文件的文件:
这里注意!!!在参考的文章里,她的代码是前5行是测序信息,而我的矩阵是前2行和后3行是测序信息!所以我需要删除的是第1,2行,和最后3行:
> x_reduce =x_merge[-(1:2),]
> x_reduce_2 =x_reduce[-(60483:60485),]
#上面我们看到第一列和行名重复了,删掉
> x_reduce_3 =x_reduce_2[,-1]#删除第一列
拿到了count矩阵,觉得哪里不对头。。。发现列名很奇怪吗?样品名都很奇怪,现在让我们复习一下TCGA数据库的样品名是什么样的:
(参考:TCGA数据库中临床样品编号详解(Barcode))
TCGA下载的数据编号怎么看?
一张网上很火的图片:
TCGA:Project 项目名称
02:组织来源代码。完整的组织来源代码查询可看这里:here
0001:科研参与者
01C:样本类型,前面的数字1-9为肿瘤,10-29为正常或癌旁样本。字母代表质量,A为佳,B次之(比如福尔马林固定石蜡包埋组织),C更次之。一般用A。
01D:组织部位,同属于一个患者组织的不同部分的顺序编号,同一组织会分割为100-120mg的部分,分别使用。D为分析的分子类型。D是DNA的意思。还有其他对应关系,可看这里:here
0182:制板的顺序,值大表示制板越晚。即为去除batch effect时的batch依据。
01:测序或鉴定中心编码.
怎么把我的样品名也改成TCGA标准的命名法呢?
这里你还需要下载一个东西,在你最开始下载的页面里,你的count是点击Download下载的,这时你还需要点击它左边的“Metadata”,那里面储存了和你的count对应的各种id,各种测序信息:
#读取metadata的信息
> library(rjson)
> x = fromJSON(file='metadata.cart.2020-04-17.json')
> n = ncol(x_reduce_3)
> id=rep(0,n)
> sample_id = rep(0,n)
> for(i in 1:n){
id[i]=x[[i]]$submitter_id
sample_id[i]=x[[i]]$associated_entities[[1]]$entity_submitter_id
}
> sample_matrix = data.frame(id=id,sample_id=sample_id)
> sample_info = data.frame(id=substr(id,1,9),sample_id)
#把metadata里的TCGA标准的样品名称赋给count矩阵里的列名
> colnames(x_reduce_3)=sample_info$sample_id
> xb=rownames(x_reduce_3)
> xc <- gsub("\\.(\\.?\\d*)","",xb)
> rownames(x_reduce_3)= xc
#看一下count矩阵的行名是不是基因,列名是不是样品名
> rownames(x_reduce_3)
> colnames(x_reduce_3)
#保存矩阵
> write.csv(x_reduce_3,file="TCGA_original_counts.csv")