take “ACC” for example

(一)

先建立Rproj,然后在工作目录下建立import文件夹以及import/ACC文件夹

从TCGA上需要下载四个文件:gdc-client.exe (TCGA官方下载工具)、表达矩阵临床信息注释文件

1.1 gdc-client

gdc-client.exe下载网址:https://gdc.cancer.gov/access-data/gdc-data-transfer-tool
gdc-client.exe下载好保存到Rproj的工作目录下(只是为了方便,理论上说,保存路径只要能知道在哪就行)
image.png

1.2 临床信息

临床信息&表达矩阵网址:https://portal.gdc.cancer.gov/repository
(看我红箭头指向的框起来的地方,下面的勾选信息就在这里选)
image.png
临床信息:需要勾选四个地方
Cases:Program勾TCGA; Project勾TCGA-ACC
Files:Data Category 勾 clinical;Data Format 勾 bcr xml
这四个勾完之后,点上图用蓝色箭头指向的Manifest,就可以得到临床信息的下载清单
(这时候只是下载了需要下载文件的清单,并没有下载文件)
文件名为 gdc_manifest_cl.txt
image.png image.png

1.3 表达矩阵

表达矩阵:也需要勾选四个地方
Cases同上
Files:Data Category 勾 transcriptome profiling; Workflow Type 勾 HTSeq-Counts
这四个勾完之后,点上图用蓝色箭头指向的Manifest,就可以得到表达矩阵的下载清单
(这时候只是下载了需要下载文件的清单,并没有下载文件)
文件名为 gdc_manifest_exp.txt
image.png

1.4 注释文件

点击右侧的购物车,选“Add all files to the Cart”,然后右上角进入购物车,下载metadata.json文件
文件名是 metadata.json
image.png
image.png
为了后面不改代码,都下在import/ACC里
image.png

(二)

2.1 根据清单下载临床信息和表达矩阵

(由于我是电脑路径整理狂,所以在Rproj下建了很多文件,个人习惯)
下面的代码块除了 disease <- “ACC” ,其他全在建文件夹
理论上说,下面所有的代码只需要改一下 disease <- “ACC” 冒号里的癌症种类,其他的可以无脑运行(前提是上面的文件下载对了)

  1. dir <- c("import", "outport", "Rscript", "Rdata", "figures")
  2. for (i in 1:length(dir)){
  3. if(!dir.exists(dir[i])) dir.create(dir[i])
  4. }
  5. disease <- "ACC" # 只改这里
  6. if(!dir.exists(paste0("import/", disease)))
  7. dir.create(paste0("import/", disease))
  8. if(!dir.exists(paste0("import/", disease, "/clinical")))
  9. dir.create(paste0("import/", disease, "/clinical"))
  10. if(!dir.exists(paste0("import/", disease, "/expdata")))
  11. dir.create(paste0("import/", disease, "/expdata"))

下两行代码在terminal完成 可能会报错 要么就是gdc-client.exe 需要换个新版本的,要么就找个网好的地方多下几次
如果做的是其他癌症,那么ACC的地方需要改!!!
下面这两行如果报错,就把/变成\,一个linux 一个windowns而已

  1. ./gdc-client.exe download -m ./import/ACC/gdc_manifest_cl.txt -d ./import/ACC/clinical/
  2. ./gdc-client.exe download -m ./import/ACC/gdc_manifest_expdata.txt -d ./import/ACC/expdata/

terminal位置:红箭头指向的地方(善用tab补齐)
image.png
由于我的路径太长了,建个变量,顺便检查一下下载文件是否完整

  1. dir_cl <- paste0("import/", disease, "/clinical/")
  2. dir_exp <- paste0("import/", disease, "/expdata/")
  3. length(dir(dir_cl))
  4. length(dir(dir_exp))

2.2 临床信息整理

用到了for循环,for循环其实还挺常用的
最后得到的clinical就是ACC所有病人的所有临床信息了

  1. library(XML) #读取xml的r包
  2. xmls <- dir(dir_cl, pattern = "*.xml$", recursive = T) #匹配以xml结尾的clinical中的所有文件
  3. cl <- list()
  4. for(i in 1:length(xmls)){
  5. result <- xmlParse(paste0(dir_cl,xmls[[i]])) #补充读取xml的路径
  6. rootnode <- xmlRoot(result) #查看结点数目 可用print(rootnode[1])查看每个节点的信息
  7. cl[[i]] <- xmlToDataFrame(rootnode[2]) #将xml读取的东西变成数据框
  8. }
  9. clinical <- do.call(rbind, cl) # 将所有clinical 的list集合为一个数据框
  10. dim(clinical)
  11. if(!dir.exists(paste0("Rdata/", disease)))
  12. dir.create(paste0("Rdata/", disease))
  13. save(clinical, file = paste0("Rdata/", disease, "/clinical.Rdata"))

2.3 表达矩阵整理

  1. counts <- dir(dir_exp, pattern = "*.htseq.counts.gz$", recursive = T) #匹配以xml结尾的clinical中的所有文件
  2. expdata <- list()
  3. for(i in 1:length(counts)){
  4. expdata[[i]] <- read.table(paste0(dir_exp,counts[[i]]),row.names = 1,sep = "\t")
  5. }
  6. expdata <- do.call(cbind,expdata)
  7. dim(expdata)

表达矩阵每一行是一个基因,每一列是一位病人
这时候点开expdata会发现,没有列名,就需要下载的第四个文件,注释信息上场
下面有个match函数,特别常用;stringr这个包也有很多好用的函数

  1. meta <- jsonlite::fromJSON(paste0("import/", disease, "/metadata.json"))
  2. colnames(meta)
  3. ids <- meta$associated_entities
  4. ID <- sapply(ids,function(x){x[,1]})
  5. file2id <- data.frame(file_name = meta$file_name,
  6. ID = ID)
  7. counts <- stringr::str_split(counts,"/",simplify = T)[,2]
  8. table(counts %in% file2id$file_name)
  9. table(counts == file2id$file_name) # 两者数目对应 但是顺序不一致
  10. file2id <- file2id[match(counts, file2id$file_name),]
  11. colnames(expdata) <- file2id$ID

这时候又发现 expdata的行名是Ensembl ID,先转换成 gene symbol
TCGA 有自己的转换方式,下载一个gtf文件
网址:https://gdc.cancer.gov/about-data/gdc-data-processing/gdc-reference-files
image.png
然后无脑运行下面的id转换(懒得解释了,有R语言基础应该可以看懂)

  1. library(rtracklayer)
  2. gtf <- import("import/gencode.v22.annotation.gtf")
  3. class(gtf)
  4. gtf <- as.data.frame(gtf)
  5. colnames(gtf)
  6. table(gtf$type)
  7. #step2:先筛选出gene对应的行
  8. gtf_gene <- gtf[gtf$type=="gene",]
  9. an <- gtf_gene[,c("gene_name","gene_id","gene_type")]
  10. expdata <- expdata[rownames(expdata) %in% an$gene_id,]
  11. an <- an[match(rownames(expdata),an$gene_id),]
  12. identical(an$gene_id,rownames(expdata))
  13. k <- !duplicated(an$gene_name);table(k)
  14. an <- an[k,]
  15. expdata <- expdata[k,]
  16. rownames(expdata) <- an$gene_name

病人分组信息整理,TCGA 病人ID的命名规则:14~15位是分组信息,小于10是tumor,大于等于10是normal
不太巧,ACC的79位全是癌症病人(我看这个数据集少才用它的,妹想到…)

  1. table(stringr::str_sub(colnames(expdata),14 ,15))
  2. Group <- ifelse(stringr::str_sub(colnames(expdata),14 ,15)<10, "tumor", "normal")

到这里expdata大概就整理完了,有一个问题就是,在expdata里有很多表达量几乎为0的基因,这些基因本身没什么意义,但是由于表达量过低,有可能在后续分析的时候,结果反而显著,因此最好筛选一下
筛选的标准因人而异吧,我是用counts数在50%的病人里>10筛选的,如果觉得太严格,可以放宽一些

  1. number <- 0.5*ncol(expdata)
  2. expdata <- expdata[apply(expdata, 1, function(x) sum(x > 10) >number), ]
  3. save(expdata, Group, file = paste0("Rdata/", disease, "/expdata.Rdata"))

初步的下载工作就完成了~
整理好累…

(三)

代码打包

one more time: 注意官网下载文件放的位置!

  1. dir <- c("import", "outport", "Rscript", "Rdata", "figures")
  2. for (i in 1:length(dir)){
  3. if(!dir.exists(dir[i])) dir.create(dir[i])
  4. }
  5. get_disease_info = function(diseasename){
  6. disease <- diseasename
  7. if(!dir.exists(paste0("import/", disease)))
  8. dir.create(paste0("import/", disease))
  9. if(!dir.exists(paste0("import/", disease, "/clinical")))
  10. dir.create(paste0("import/", disease, "/clinical"))
  11. if(!dir.exists(paste0("import/", disease, "/expdata")))
  12. dir.create(paste0("import/", disease, "/expdata"))
  13. # 下载临床信息和表达矩阵
  14. system(paste0("./gdc-client.exe download -m ./import/",disease,"/gdc_manifest_cl.txt -d ./import/",disease,"/clinical/"))
  15. system(paste0("./gdc-client.exe download -m ./import/",disease,"/gdc_manifest_exp.txt -d ./import/",disease,"/expdata/"))
  16. dir_cl <- paste0("import/", disease, "/clinical/")
  17. dir_exp <- paste0("import/", disease, "/expdata/")
  18. ## 临床信息整理
  19. library(XML)
  20. xmls <- dir(dir_cl, pattern = "*.xml$", recursive = T)
  21. cl <- list()
  22. for(i in 1:length(xmls)){
  23. result <- xmlParse(paste0(dir_cl,xmls[[i]]))
  24. rootnode <- xmlRoot(result)
  25. cl[[i]] <- xmlToDataFrame(rootnode[2])
  26. }
  27. clinical <- do.call(rbind, cl)
  28. if(!dir.exists(paste0("Rdata/", disease)))
  29. dir.create(paste0("Rdata/", disease))
  30. save(clinical, file = paste0("Rdata/", disease, "/clinical.Rdata"))
  31. ## 表达矩阵整理
  32. counts <- dir(dir_exp, pattern = "*.htseq.counts.gz$", recursive = T)
  33. expdata <- list()
  34. for(i in 1:length(counts)){
  35. expdata[[i]] <- read.table(paste0(dir_exp,counts[[i]]),row.names = 1,sep = "\t")
  36. }
  37. expdata <- do.call(cbind,expdata)
  38. # 添加列名
  39. meta <- jsonlite::fromJSON(paste0("import/", disease, "/metadata.json"))
  40. ids <- meta$associated_entities
  41. ID <- sapply(ids,function(x){x[,1]})
  42. file2id <- data.frame(file_name = meta$file_name,
  43. ID = ID)
  44. counts <- stringr::str_split(counts,"/",simplify = T)[,2]
  45. file2id <- file2id[match(counts, file2id$file_name),]
  46. colnames(expdata) <- file2id$ID
  47. # 将行名换成gene symbol
  48. # TCGA有自己的id转换方法
  49. library(rtracklayer)
  50. gtf <- import("import/gencode.v22.annotation.gtf")
  51. gtf <- as.data.frame(gtf)
  52. gtf_gene <- gtf[gtf$type=="gene",]
  53. an <- gtf_gene[,c("gene_name","gene_id","gene_type")]
  54. expdata <- expdata[rownames(expdata) %in% an$gene_id,]
  55. an <- an[match(rownames(expdata),an$gene_id),]
  56. k <- !duplicated(an$gene_name);table(k)
  57. an <- an[k,]
  58. expdata <- expdata[k,]
  59. rownames(expdata) <- an$gene_name
  60. Group <- ifelse(stringr::str_sub(colnames(expdata),14 ,15)<10, "tumor", "normal")
  61. # 过滤低表达基因(玄学)
  62. number <- 0.5*ncol(expdata)
  63. expdata <- expdata[apply(expdata, 1, function(x) sum(x > 10) >number), ]
  64. save(expdata, Group, file = paste0("Rdata/", disease, "/expdata.Rdata"))
  65. }
  66. get_disease_info('ACC')