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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容