rm(list = ls())
#metadata文件为了转换样本名称
#gdc_download文件可以得到表达谱以及和metadata文件样本名称取交集
#读取metadata文件
library(rjson)
json <- jsonlite::fromJSON("metadata.cart.2023-02-19.json")
#取json文件的file_name和json[[3]][[1]]的第一列
#自定义一个函数a
a <- function(x){
x[,1]
}
sample_id <- sapply(json$associated_entities,a)
file_sample <- data.frame(sample_id,file_name=json$file_name)
#结束对metadata文件的处理
#对gdc_download文件初步处理
count_file <- list.files(path = "gdc_download_20230219_014900.173648",pattern = "*.tsv$"
,recursive = T)
count_file_name <- strsplit(count_file,split = "/")
b <- function(y){
y[2]
}
count_file_name <- sapply(count_file_name,b)
#结束对gdc_download的初步处理
#建立数据框其nrow不能随意设置
matrix <- data.frame(matrix(nrow = 60660,ncol = 0))
#data1有60660行,再看下一个,也为60660行,因此我们要根据行来合并matrix和data的话,matrix必需设置成为60660行
path <- paste0("gdc_download_20230219_014900.173648//",count_file[2])
data <- read.delim(path,row.names = 1,header = F)
colnames(data) <- data[2,]
data <- data[-(1:6),]
data <- data[6]
colnames(data) <- file_sample$sample_id[which(file_sample$file_name==count_file_name[2])]
matrix <- cbind(matrix,data)
#最后建立一个循环即可
for (i in 1:151) {
path <- paste0("gdc_download_20230219_014900.173648//",count_file[i])
data <- read.delim(path,header=F,row.names = 1)
colnames(data) <- data[2,]
data <- data[-(1:6),]
data <- data[6]
colnames(data) <- file_sample$sample_id[which(file_sample$file_name==count_file_name[i])]
matrix <- cbind(data,matrix)
}
save(matrix,file="TCGA-LAML.rdata")
问题1:为什么在建立matrix时nrow=60660,而不是60666或者其他。
因为读取的data数据处理之后统一形式为有60660行(去除了1:6,因为不需要这6行),并且nrow必须和data的行数相同,因为cbind函数要求如此。
问题2:count_file和count_file_name以及file_sample作用分别是什么?
count_file:作用1是指定下载的gdc_download文件夹名称相对应,从而为path指定路径;作用2是为了能够得到对应的count_file_name,从而和file_sample样本名称相对应。
count_file_name:作用如上。
file_sample:对应count_file_name和样本名称
问题3:path <- paste0("gdc_download_20230219_014900.173648//",count_file[i])为什么要加上两个"//"一级count_file[i]又是什么意思?
一个/对应一级文件,我们要的数据是对应的二级文件,所以要加上两个//,count_file[i]是为了指定目录,建立循环。
如有其他问题欢迎在评论区留言。
salute!