单细胞测序|经验总结 | R语言批量读取目录下的文件然后按照行名对其进行整合成为data.frame

参考链接:https://www.jianshu.com/p/3f1f27fdd35b
发现这哥们写得和我目前的需求是一致的,于是按照它的思路看一下。
我的目录文件:
单细胞测序|经验总结 | R语言批量读取目录下的文件然后按照行名对其进行整合成为data.frame
文章图片

path <- "F://张秀秀//过程性文件//10//26//count" fileNames <- dir(path) filePath <- sapply(fileNames, function(x){paste(path,x,sep='/')}) data <- lapply(filePath, function(x){read.table(x, header=T)}) #这样批量读取得到一个list类型的数据 #后续操作不好操作 #另外只有34行,但是得到的数据的矩阵却出奇的大 #stop barcode<-read.csv("F://张秀秀//过程性文件//10//26//merge_sub.csv") barcode_need<-barcode[,c(1,2,25,23)] data<-merge(filelist_v3,barcode_need) #到时候直接用这个去命名列名即可。

Step1 :获取目录下所有的文件名
##获取目录下面的所有文件的文件名 filelist <- list.files("F://张秀秀//过程性文件//10//26//count")

filelist得到的结果是我们指定的目录下的文件名,是一个vector类型的数据。
单细胞测序|经验总结 | R语言批量读取目录下的文件然后按照行名对其进行整合成为data.frame
文章图片

#设置文件的列名 ##去掉文件名中的尾缀,提取barcode ##这么做是因为文件名称就是样本名称,之后我们需要用这个matrix来做合并后的矩阵列名 filelist_v1 <- as.matrix(gsub("cell_","", filelist)) filelist_v2 <- as.matrix(gsub("_count.txt","", filelist_v1)) #这里其实有一些自己的小想法 #想利用师兄提供的那个atac和rna的barcode的对应关系,实现这种转换。

  • filelist_v1的结果
    单细胞测序|经验总结 | R语言批量读取目录下的文件然后按照行名对其进行整合成为data.frame
    文章图片
  • filelist_v2的结果(这个matrix就是我们理想中的列名了)
    单细胞测序|经验总结 | R语言批量读取目录下的文件然后按照行名对其进行整合成为data.frame
    文章图片
Step2:构建文件路径
files <- paste("F://张秀秀//过程性文件//10//26//count//",filelist,sep="") ##files为所有的路径

【单细胞测序|经验总结 | R语言批量读取目录下的文件然后按照行名对其进行整合成为data.frame】得到的即是我们要读取的文件的绝对路径(当然也可以是相对路径)
单细胞测序|经验总结 | R语言批量读取目录下的文件然后按照行名对其进行整合成为data.frame
文章图片

Step3:准备行名
这个时候遇到一个小问题:对data.frame进行行的筛选的时候,出现了行名的丢失。也即通过这种方式进行数据的提取。
test <- read.delim(file=files[1],header=F,sep="",row.names = 1) ##小测试 tail(test) test[grep("__",row.names(test)),] #就是这样提取数据的时候把行列名的信息丢失了

现在在想办法解决这个问题。
后来想想,不用那么麻烦,因为我只需要行名。直接把行名保存为向量,提取前面几个字符作为行名即可。
rownames<-row.names(test) length(rownames) label<-rownames[1:5607738]

Step4:利用循环,批量读取文件中的数据
for (i in 1:(length(files))) { new_data<-as.matrix(read.delim(file=files[i],header=F,sep="",row.names = 1)) temp <- as.matrix(new_data[match(label,rownames(new_data)),1]) targetgene01 <- cbind(targetgene01,temp) ##合并,然后替换 } #我总觉得这块有点琐碎,用match这种高级用法对我这种小菜鸟太有难度了

Step5:对数据框进行整理,写入文件
rownames(targetgene01) <- targetgene01[,1]#第一列需要设置成行名 targetgene01 <- targetgene01[,-1]##第一列可以删掉 colnames(targetgene01)<-filelist_v2##设置准备好的列名 #targetgene01[which(is.na(targetgene01) == T)] <- 0##没有match到的是NA,替换成0 write.csv(targetgene01,"data.csv",quote = F,col.names =T,row.names = T)

得到的数据文件基本上和我们预期的一致,但是还有以下需要优化的地方。
(1)列名转换为RNA-barcode,可以更方便的与给予RNA标签的细胞类型进行一一对应。
(2)是否有必要转换为0-1矩阵(因为转换为0-1矩阵之后,就是一个二项分布的数据,不知道后期在处理方法的选择上是否会有一些不同)。
总结:如果实践结果良好,考虑把所有的代码粘在后面

    推荐阅读