参考链接:https://www.jianshu.com/p/3f1f27fdd35b
发现这哥们写得和我目前的需求是一致的,于是按照它的思路看一下。
我的目录文件:
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) #到时候直接用这个去命名列名即可。
##获取目录下面的所有文件的文件名
filelist <- list.files("F://张秀秀//过程性文件//10//26//count")
filelist得到的结果是我们指定的目录下的文件名,是一个vector类型的数据。
#设置文件的列名
##去掉文件名中的尾缀,提取barcode
##这么做是因为文件名称就是样本名称,之后我们需要用这个matrix来做合并后的矩阵列名
filelist_v1 <- as.matrix(gsub("cell_","", filelist))
filelist_v2 <- as.matrix(gsub("_count.txt","", filelist_v1))
#这里其实有一些自己的小想法
#想利用师兄提供的那个atac和rna的barcode的对应关系,实现这种转换。
files <- paste("F://张秀秀//过程性文件//10//26//count//",filelist,sep="") ##files为所有的路径
得到的即是我们要读取的文件的绝对路径(当然也可以是相对路径)
这个时候遇到一个小问题:对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]
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这种高级用法对我这种小菜鸟太有难度了
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矩阵之后,就是一个二项分布的数据,不知道后期在处理方法的选择上是否会有一些不同)。