TCGA转录组Table合成

时间 2022.5.5

  1. 下载数据与json文件

R语言下载transaction R语言下载TCGA数据_ci

然后打开TCGA新转录组.R

  1. 不同文件夹文件提取
    将次级目录的文件夹里面的文件提取到同一个文件夹下
# 一些基础操作
list.files(pattern = "\\.tsv") #当前目录显示以tsv结尾的文件
dir()
dir(all.files=TRUE)  #显示隐藏的文件
getwd()

# 验证二级文件夹里面是否有文件,无返回NA值,为TRUE,
filename=1
for (i in 1:200) { 
  a=as.character(list.files(list.files()[i])[1])
  ifelse( a%in% NA==TRUE, NA,'b')
  b=paste(getwd(),"/",list.files()[i],"/",list.files(list.files()[i])[1],sep = "")
          filename[[i]]=b
}
filename
filename <- as.data.frame(filename)
# 对200行数据进行过滤
filename2=apply(filename, 2, 
                function(x){gsub(pattern = ".*(NA).*", 
                                 replacement = "\\21",x) })
filename2 <- as.data.frame(filename2)
filename2 <- filename2[filename2$filename!=1,]
filename2 #这时候提取到试运行的10个文件的绝对路径

#复制文件到同一文件夹
getwd() #获得路径,复制在后面加入/data  
dir.create("C:/Users/xxx/xxx/data" ) #创建一个目录
file.copy(filename2,"data") 

#先读取jason文本信息,此时工作路径还没转向/data
library(rjson)
result <- fromJSON(file="metadata.cart.2022-05-04.json") #先读取
#转向data目录
setwd("C:/Users/shao/Desktop/TCGAxin/data")
  1. 提取json的信息
    提取json的信息,匹配文件名与对应的TCGA- - - - 情况
Metadata=data.frame()
for (i in 1:200) {
  a <- result[[i]][["file_name"]]
  b <- result[[i]][["associated_entities"]][[1]][["case_id"]]
  c <- result[[i]][["associated_entities"]][[1]][["entity_submitter_id"]]
  Metadata[i,1] =a
  Metadata[i,2] =b
  Metadata[i,3] =c
}
names(Metadata)
names(Metadata)[1] <- "file_name"
names(Metadata)[2] <- "case_id"
names(Metadata)[3] <- "entity_submitter_id"
names(Metadata)
# 查看重复情况 可以预推断重复情况
# PS:# 有的病例没有对照/只有对照情况
table(duplicated(Metadata$case_id))
write.csv(Metadata,"metadataID1.csv")
  1. 批量改文件名
    都是在EXCEL生成相应的代码
    4.1 linux改 Git bash here 修改路径的文件名
mv file_name.tsv TCGA- - - .tsv

4.2 或者根据生成的metadataID1.csv,修改R里面的data

TCGA_CN_5360_01A_01R_1436_07 <- 6303629f-y

4.3 读取的时候就修改

# 按新名字读取数据
metadata <- read.csv("metadataID1.csv")
# metadata=metadata[1:10,] #假设前十个一一对应
# 提取新文件名
filesname2 <- metadata$entity_submitter_id;filesname2
filesname2[1]

# 读取数据
lf <-list.files(pattern = ".tsv$") #以report.tsv 结尾的
files <- gsub("\\.tsv", "", lf)   #切掉后缀.tsv,获得这些名称,为循环准备
files 
# 第一个循环为绝对路径下面的数据文件
# 第二个文件为改名的,
for (i in seq_along(files))
  for (x in seq_along(filesname2)) 
  assign(filesname2[i], read.table(lf[i], sep = '\t', header = TRUE))
  1. 循环读取.tsv
lf <-list.files(pattern = ".tsv$") #以report.tsv 结尾的
files <- gsub("\\.tsv", "", lf)   #切掉后缀.tsv,获得这些名称,为循环准备
files
for (i in seq_along(files))
  assign(files[i], read.table(lf[i], sep = '\t', header = TRUE))
  1. 提取要的部分
TCGA_CN_5360_01A_01R_1436_07 = TCGA_CN_5360_01A_01R_1436_07[-c(1:4), c("gene_id","fpkm_unstranded")]
names(TCGA_CN_5360_01A_01R_1436_07)[2] <- "TCGA_CN_5360_01A_01R_1436_07"

借助ECXEL提取
新生成代码,导出复制到新Untitled执行

#【生成新tax】
a=data.frame()
for (i in seq_along(files)) {
  a[i,1]=gsub('W',files[i],"W$tax <- paste(W$name,'=',W$taxID)")
}  
a  # 这一种为写好代码,然后核心替换的方法,下面的b为拼接法
write.csv(a,'w1.csv')

##【保留两个变量的代码】
b=data.frame()
files <- c("qy","e","ew")
for (i in seq_along(files)){
  b[i,1] <- paste0(files[i], '<-', files[i],
                  "[-c(1:4),c('gene_id','fpkm_unstranded')]")
}
b
write.csv(b,'w2.csv')

#改名字
c <- list()
for (i in seq_along(files)){
  c[[i]] <- cbind(assign(paste0('q',i), 
                         paste0('names(',files[i], ')[2] <- ','"', files[i])))
}
c
c2 <- unlist(c)
c2 <- as.data.frame(c2)
c2
c2[,1] <- sub(pattern = "_report$", replacement = "\\1", c2[,1]) 
c2
c2[,1] <- paste0(c2[,1],'"')
c2
write.csv(c2,'w3.csv')
  1. 多个数据合并
multimerge<-function(dat=list(),...){
  if(length(dat)<2)return(as.data.frame(dat))
  mergedat<-dat[[1]]
  dat[[1]]<-NULL
  for(i in dat){
    mergedat<-merge(all=TRUE,mergedat,i,...)
  }
  return(mergedat)
}

dataALL <- multimerge(list(TCGA_CN_5360_01A_01R_1436_07,
                           TCGA_CN_A497_01A_11R_A24H_07,
                           TCGA_CV_5430_01A_02R_1686_07,
                           TCGA_CV_6962_01A_11R_1915_07,
                           TCGA_CV_7177_01A_11R_2016_07,
                           TCGA_CV_7248_01A_11R_2016_07,
                           TCGA_CV_7410_01A_21R_2081_07,
                           TCGA_D6_6517_01A_11R_1873_07,
                           TCGA_F7_A50I_01A_11R_A28V_07,
                           TCGA_UF_A7JH_01A_21R_A34R_07))

write.csv(dataALL,"dataALL.csv")
  1. 基因注解过程

下载基因信息文件具体下载位置 下载 Homo_sapiens.GRCh38.106.gtf.gz

8.1 读取文件GTF文件

#BiocManager::install("rtracklayer")
library("rtracklayer")
gtf_data = import('Homo_sapiens.GRCh38.106.gtf') 
gtf_data = as.data.frame(gtf_data)
names(gtf_data)
a=head(gtf_data,100)
write.csv(a,"GTF预览.csv")

8.2 处理未注解的基因矩阵文件

保留.前面的数字
ENSG基因后面有带 点. 为版本号

suppressMessages(library(tidyverse))
table(duplicated(dataALL$gene_id))  # 唯一ID
dataqie=dataALL
dataqie <- dataqie   %>% 
  separate(gene_id,  sep = "\\.",    #切割点要加\\
           into = c("gene_id2", "deleteVar")) %>%  
  select(-deleteVar)
dataqie[1:5,]
table(duplicated(dataqie$gene_id2))
查看重复的情况
a=dataqie[duplicated(dataqie[ ,'gene_id2']), ]
a
name <- t(a[,'gene_id2'])
dd <- as.vector(name)
dd
b=dataqie[which(dataqie$gene_id2%in% dd),]
b[, c(1:7)]

# 可以计算下重复的有没有表达
# 没有直接去掉
apply(b[,2:11],1,sum) #不处理也可以,后续的基因过滤也会去掉

8.3 处理与提取注解文件

table(duplicated(gtf_data$gene_id)) #是重复的
table(gtf_data$gene_biotype)
#查看重复是不是有唯一的gene biotype
b=table(gtf_data$gene_id,gtf_data$gene_biotype)
b[b>0] <- 1
b2 <- as.data.frame(b)

b2[b2$Freq>1,] #检测有无大于1的,相当于有重复
#<0 行> (或0-长度的row.names) 代表gene_id与gene_biotype完全一一对应
table(b2$Freq)
#保留Freq=1的
table(duplicated(b2$Var1))
gtf=b2[b2$Freq==1,]
dim(gtf)
names(gtf)[1] <- "gene_id"
names(gtf)[2] <- "gene_biotype"
gtf <- gtf[,-3]
str(gtf)
gtf$gene_id <- as.character(gtf$gene_id)
str(dataqie$gene_id2)
# 提取注解文件
# 先查看gene_id和gene_name是不是一一对应
gtf_data$idandName <- paste(gtf_data$gene_id,"_",gtf_data$gene_name)
table(duplicated(gtf_data$idandName))
nrow(gtf) #与上面唯一值对应,证明可以直接合并

#
#检查ID重复情况
table(duplicated(gtf_data$gene_name))
#删除重复的行
gtf_data2 <- gtf_data[!duplicated(gtf_data$gene_name), ]
#在检查下
table(duplicated(gtf_data2$gene_name))


# 合并
gtf3 <- dplyr::left_join(gtf,gtf_data2,by=c('gene_id'='gene_id'))
is.na(gtf3$gene_name)
names(gtf3)
# 挑选要的变量
gtffinal <- gtf3[ ,c('gene_id','gene_biotype.x',"gene_name")]
write.csv(gtffinal,"gtf最终注解文件")
#write.table(lncRNA.gtf,file = "lncRNA.gtf",sep = "\t",col.names = T)
# 这时候基因表达矩阵文件为 dataqie - dataqie$gene_id2
# 注解文件为gtffinal -

# 基因注解,也就是合并文件
GeneMatrix <- dplyr::left_join(dataqie,gtffinal,by=c('gene_id2'='gene_id'))