TCGA数据挖掘系列之二:下载数据

本人使用的是R下载表达谱数据,从官网下载的临床数据。

2022年TCGA更新后,只能使用新版本的R进行下载,而且不能使用install.packages来安装包了。

使用的R语言版本

使用这段代码配置包的安装环境
if (!require("BiocManager", quietly = TRUE))

    install.packages("BiocManager")

BiocManager::install(version = "3.14")

可以看到R都更新到4.3了,我还在用4.1,虽然也能用,但是会有提示,建议直接用4.3版本哈,别像我那么懒

配置包的安装环境

成功之后再运行

library(TCGAbiolinks)

旧版本会有更新提示,好大一堆包😓,请在输入框中填“n”,不然要给你更新到天荒地老去

更新提示请填“n”

#利用这段代码可以查看所有TCGA支持的癌症种类的缩写

TCGAbiolinks:::getGDCprojects()$project_id

###下载表达谱数据

#设置下载路径,不知道现在工作路径的,请用“getwd()"查看路径

setwd('/Volumes/TCGA')

#指定下载肺腺癌的数据

cancer_type = 'TCGA-BRCA'   #最好一次只下载一个类型,如果一次要下多个癌种,可以用cancer_type = c('TCGA-LUSC','TCGA-BRCA','TCGA-LUAD')

##下载RNA-seq表达谱数据

#设定任务

query <- GDCquery(project = cancer_type,

                data.category = "Transcriptome Profiling",

                data.type = "Gene Expression Quantification",

                workflow.type = "STAR - Counts",   #现在只有这一种了,文件里面有FPKM

                experimental.strategy = 'RNA-Seq')

#下载数据

GDCdownload(query, method = "api", files.per.chunk = 20)  #下载经常会中断,所以喜欢分解成20-50个的小包,每次指定路径一样,下次重启任务可以识别到已下载的包,不会重复下载

#整理数据并存储为R对象

# expr = GDCprepare(query=query)  #总是提示错误,最多就到70%,然后就死了,我也就不走这条路了

result = query[[1]][[1]]  #用view看一看,id/file-id与文件夹名对应,cases是TCGA编号

write.csv(result,file = paste0(cancer_type,'_query_result.csv'))   #保存到本地


###读取已经下载好的TCGA-LUAD数据

library(rjson)

setwd('/Volumes/Starry/NTAN1/TCGA')

#读取metadata文件,格式是json,文件中包含文件名与样本名的对应关系,用于后续与基因名的整合。

metadata <- jsonlite::fromJSON("metadata.cart.2023-09-27 (1).json")

#提取metadata中associated_entities列中的第一个元素为sample id

sample_id <- sapply(metadata$associated_entities,function(x){x[,1]}) 

#提取file_name

file_name <- metadata$file_id

#创建一个包含样本名和文件名对应关系的数据框

sample_file <- data.frame(sample_id,file_name) 

write.csv(sample_file,'sample_id与file_name对应表.csv')

#可以查看前六行

head(sample_file)

#批量读取gdc_download文件夹下的所有gene_counts.tsv格式结尾的基因表达文件

count_file <- list.files("/Volumes/Starry/NTAN1/TCGA/GDCdata/TCGA-BRCA",pattern="*star_gene_counts.tsv",

                        recursive = TRUE)

#使用strsplit函数分割文件名,分割为文件夹名和tsv结尾的文件名

file_name <- strsplit(count_file,split="/")

#提取出file_name的第6个元素,即tsv文件

file_name <- sapply(file_name,function(x){x[4]}) #注意判断第几个/后是文件名

#创建一个60660行,0列的矩阵,并处理成数据框

data <- data.frame(matrix(nrow=60660,ncol=0))

#通过for循环一次递归读入文件。

for (i in 1:length(file_name)){                        #从第一个文件读到最后一个文件

  path = paste0("/Volumes/Starry/NTAN1/TCGA/GDCdata/TCGA-BRCA//",count_file[i]) #读取文件的路径

  dat<- read.delim(path,fill = TRUE,header = FALSE,row.names = 1) #读取路径下的文件,设置第一列为行名。

  colnames(dat)<-dat[2,]        #设置第2行为列名

  dat <-dat[-c(1:6),]            #去掉前6行

  dat <- dat[3]                #取出表达量对应的这一列,这里选择的是counts类型的基因表达量

  colnames(dat) <- sample_file$sample_id[which(sample_file$file_name==file_name[i])]

  #将结果data中列名设置为sample_id

  data <- cbind(dat,data)    #将得到的data与创建好的dat合并

}

table(is.na(colnames(data))) #查看列名是否转换完整,如果有NA,就是metadata下载没对

write.csv(data,'乳腺癌1231例TCGA表达谱原始表格.csv',row.names = TRUE) #文件很大,没事儿不要轻易用excel打开

# setwd('/Users/luoliping/Documents/NTAN1')

# data = read.csv('肺癌939例TCGA原始表格.csv',header = T)

#得到的数据中基因名没有转换,所以要转换基因名,将ensemble ID 转换为gene symbol

#先读取路径下的第一个文件,获取gene symbol

rawdt<- as.matrix(read.delim(path,fill = TRUE,header = FALSE,row.names = 1))

#去掉前6行,并提取第一列为基因名

gene_name <- rawdt[-c(1:6),1]

#合并gene_name与data

rawdt1 = cbind(gene_name,data)

write.csv(rawdt1,'乳腺癌1231例TCGA表达谱原始表格含genename.csv',row.names = TRUE)

#以genename去除重复值,aggregate函数先按照基因名分类,重复的基因名选择保留表达量最大的。

rawdt2 <- aggregate(.~gene_name, data=rawdt1, max)  #速度很慢,要等一会儿

write.csv(rawdt2,'乳腺癌1231例TCGA表达谱原始表格含genename-去重.csv',row.names = TRUE)

#将gene_name列设为行名

rownames(rawdt2) <- rawdt2[,1] 

#去除第一列

rawdt3 <- rawdt2[,-1]

write.csv(rawdt3,'乳腺癌1231例TCGA表达谱原始表格不含genename-去重.csv',row.names = TRUE)

#----------------------------------分为normal和tumor矩阵------------------------------

sample <- colnames(rawdt2)

normal <- c()

tumor <- c()

for (i in 1:length(sample)){

  if((substring(colnames(rawdt2)[i],14,15)>=10)){    #14、15位置大于等于10的为normal样本

    normal <- append(normal,sample[i])

  } else {

    tumor <- append(tumor,sample[i])

  }

}

tumor_matrix <- rawdt2[,tumor]

normal_matrix <- rawdt2[,normal]

normal_matrix = cbind(rawdt2$gene_name,normal_matrix)

#写入文件

write.csv(tumor_matrix,'breast_tumor_1119_genename.csv',row.names = TRUE)

write.csv(normal_matrix,'breast_normal_114_genename.csv',row.names = TRUE)

#----------------------------------筛选配对样本-----------------------------------

# 导入必要的包

library(dplyr)

library(stringr)

# setwd('/Users/luoliping/Downloads/NTAN1/TCGA')

# exp = read.csv('肺癌1788例TCGA表达谱原始表格含genename-去重.csv',header =T)

# exp = exp[,-1] #去掉gene_name列

exp = rawdt2  #导入数据

#第14-15位为样本类型标记,<10为肿瘤,>10为正常组织

table(stringr::str_sub(colnames(exp),14,15) < 10)  #查看一下大概分组情况

#分组样本

exp_nor = exp[,str_sub(colnames(exp),14,15) > 10]  #筛选正常样本

exp_tum = exp[,str_sub(colnames(exp),14,15) <= 10]  #筛选肿瘤样本

#提取患者前12位编号,方便配对,两种样本前12位编号一致

patient_tum = str_sub(colnames(exp_tum),1,12)    #肿瘤的

patient_nor = str_sub(colnames(exp_nor),1,12)  #正常的

patient_mix = intersect(patient_tum, patient_nor)  #取两个的交集

#截取exp_tum数据框中每个列名的前12个字符,并判断截取结果是否存在于patient向量

k_tum = str_sub(colnames(exp_tum),1,12) %in% patient_mix  #肿瘤的

table(k_tum)

k_nor = str_sub(colnames(exp_nor),1,12) %in% patient_mix  #正常的

table(k_nor)

#只取能匹配上的

exp_tum = exp_tum[,k_tum] 

exp_nor = exp_nor[,k_nor]

#合并肿瘤和正常样本

exp2 = cbind(exp_tum,exp_nor)

# 随便挑一个id号,判断两列数据是否一致,如果不一致就要检查哪里错了

if(all(rawdt2$`TCGA-34-5232-01A-21R-1820-07` == exp2$`TCGA-34-5232-01A-21R-1820-07`)) {

  print("两列数据一致")

} else {

  print("两列数据不一致")

}

#按照列名的字母顺序进行排序,方便查看配对样本

sorted_exp2 <- exp2[, order(names(exp2))] 

# 提取列名的前12位,忽略特殊符号

col_names <- gsub("[^a-zA-Z0-9]", "", substr(names(sorted_exp2), 1, 12))

# 统计重复的列名个数

table(col_names)  #如果有次数为1的则不正确,>2说明采样不止一次,后面可以人工筛选去除

table(table(col_names))

sorted_exp = cbind(exp$gene_name,sorted_exp2) #加上gene_name列

write.csv(sorted_exp,'TCGA_breast_113例配对样本.csv')

#----------------------------------提取临床信息-----------------------------------

#提取临床信息

setwd('/Volumes/Starry/NTAN1/TCGA')

#从metadata数据中提取出case_id,用来匹配

library("rjson")

json <- jsonlite::fromJSON("metadata.cart.2023-09-27 (1).json")

View(json)

entity_submitter_id <- sapply(json$associated_entities,function(x){x[,1]})

case_id <- sapply(json$associated_entities,function(x){x[,3]})

sample_case <- t(rbind(entity_submitter_id,case_id))  #case_id可以匹配

#从clinical数据中提取出临床信息

library(data.table)

library(dplyr)

clinical = fread('/Users/luoliping/Downloads/clinical.cart.2023-09-27/clinical.tsv')

colnames(clinical)

dim(clinical)

# 删除值为 "--" 超过50%的列

clinical1 <- clinical %>% select_if(~ mean(. != "'--", na.rm = TRUE) > 0.5)

# 与metadata匹配

clinical_matrix <- merge(sample_case,clinical1,by="case_id",all.x=T)

table(clinical_matrix$project_id)  #查看一下是否有NA

# 删除重复行

clinical_matrix1 <- distinct(clinical_matrix, entity_submitter_id, .keep_all = TRUE)  #按entity_submitter_id

# clinical_matrix1 <- as.data.frame(clinical_matrix[duplicated(clinical_matrix$case_id),])  #按case_id

write.csv(clinical_matrix1,'clinical_matrix_0927.csv',row.names = TRUE)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容