r刚入门的时候,能够正确读取单个文件就觉得小有成就,随着时间的积累,单一文件地读取已经不能满足需求了,此时,批量地做就是解放双手地过程。
使用for循环把下载地tcga数据读入r语言并转换成数据框
使用三个for循环来完成,这是第一个for循环。
1. 把所有数据读入在一个文件夹中
dir.create("data_in_one") #创建目标文件夹,也可右键创建 dir("rawdata/") #查看原路径的内容 for (dirname in dir("rawdata/")){ ## 1.要查看的单个文件夹的绝对路径 mydir <- paste0(getwd(),"/rawdata/",dirname) ## 2.找到对应文件夹中的文件并提取名称,pattern表示模式,可以是正则表达式 file <- list.files(mydir,pattern = "*.counts") ## 3.当前文件的绝对路径是 myfile <- paste0(mydir,"/",file) ## 4.复制这个文件到目的文件夹 file.copy(myfile,"data_in_one") }
2. 寻找tcga id并让文件名称和tcga id保持一致。
第二个for循环。文件名称和tcga id的对应关系,藏在了metadata中。
metadata <- jsonlite::fromjson("data/metadata.cart.2021-05-28.json") metadata_id <- metadata[,c("file_name","associated_entities")] ## 1.准备容器,已经存在,我们把新数据添加在第三列 metadata_id ## 2.循环操作 for (i in 1:nrow(metadata_id)){ print(i) metadata_id[i,3] <- metadata_id$associated_entities[i][[1]]$entity_submitter_id } ## 重新命名 colnames(metadata_id)[3] <- "tcga_id"
行排序,为了把文件名称和tcga_id对应起来。读入的顺序和复制到新路径的顺序不一致,这一步的目的是让其保持一致。
rownames(metadata_id) <- metadata_id[,1] metadata_id <- metadata_id[files,]
3. 输入文件名并提取文件的第二列(counts列)
#install.packages("data.table") #构建函数 myfread <- function(files){ data.table::fread(paste0("data_in_one/",files))$v2 } ## 测试文件 test <- myfread(files[1])
4.1 使用for循环来批量读入并整合到一个数据框。
## 1.创建容器 gene_id <- data.table::fread(paste0("data_in_one/",files[1]))$v1 expr_df <- data.frame(gene_id=gene_id) ## 2.按照列读入 for (i in 1:length(files)){ print(i) expr_df[,i 1] = myfread(files[i]) } ## 增加列名 colnames(expr_df) <- c("gene_id",metadata_id$tcga_id) ### 意外发现 tail(expr_df$gene_id,10) ### 去掉最后5行 (nrow(expr_df)-5) expr_df <- expr_df[1:(nrow(expr_df)-5),] save(expr_df,file = "output/brca_rnaseq_exprdf.rdata")
4.2 使用lapply function 模式
1.函数
myfread <- function(files){ data.table::fread(paste0("data_in_one/",files))$v2 } ### 2.lapply dd = lapply(files,myfread) ### 3.do.call expr_df = as.data.frame(do.call(cbind,dd)) ### 4.添加名称 colnames(expr_df) = metadata_id$tcga_id rownames(expr_df) = data.table::fread(paste0("data_in_one/",files[1]))$v1