殺殺
前兩天一個(gè)同學(xué)問(wèn)了一個(gè)批量讀數(shù)據(jù)(文件)的問(wèn)題
感覺(jué)現(xiàn)在分析測(cè)序數(shù)據(jù)的話,在R中一次性讀取多個(gè)文件的功能還是挺需要用到的
決定總結(jié)一下下

總不能寫n行read.csv…balabala…去讀取,那太麻煩了
于是決定使用批量讀數(shù)據(jù)
首先我們要獲取這個(gè)文件夾里所有的文件名字以便讀取
##獲取ins_size_bacth2文件夾下面的所有文件的文件名
filelist <- list.files("ins_size_bacth2")
##去掉文件名中 . 后面的文件格式尾綴
##這么做是因?yàn)槲募Q就是樣本名稱,之后我們需要用這個(gè)list來(lái)做合并后的矩陣列名
filelist_sampleid <- as.matrix(gsub(".ins_size","", filelist))
接下來(lái)我們需要構(gòu)建讀文件的路徑
files <- paste("./ins_size_bacth2/",filelist,sep="") ##files為所有的路徑
ps: 在做這種批量操作時(shí)還是有必要先花時(shí)間測(cè)試一個(gè)樣本是否能夠成功,然后再去做批量的循環(huán),這樣也能方便自己找bug
因此我們先試著讀取一個(gè)文件
test <- read.delim(file=files[1],header=F,sep="",row.names = 1) ##小測(cè)試
這里因?yàn)槔又械奈募袷奖容^特殊,所以使用的讀取函數(shù)是read.delim,如果是.csv或.txt等格式,也可以替換成read.csv, read.table等函數(shù)。
好了測(cè)試通過(guò),接下來(lái)開始批量讀文件
label <- matrix(c(0:8000),ncol = 1) ##建立需要的行名
targetgene01 <- label
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) ##合并,然后替換
}
rownames(targetgene01) <- targetgene01[,1] #第一列需要設(shè)置成行名
targetgene01 <- targetgene01[,-1] ##第一列可以刪掉
colnames(targetgene01)<-filelist2 ##設(shè)置準(zhǔn)備好的列名
targetgene01[which(is.na(targetgene01) == T)] <- 0 ##沒(méi)有match到的是NA,替換成0
需要注意的是,合并文件的時(shí)候,需要注意你是要取所有文件中行名的交集還是并集,或者最后你是否有一個(gè)統(tǒng)一的行名來(lái)規(guī)整所有文件。(當(dāng)然如果你確定每個(gè)文件的行名都是相同的,就可以直接cbind),我遇到過(guò)需要取交集的情況,可以寫一個(gè)循環(huán)對(duì)每個(gè)文件的行名做交集,用最終的交集文件去match出所有你要的行然后合并。
但是這個(gè)例子中,有的文件的行名是1-4000,有的是5000-8000,存在非常大的差異,而需求是最后整合成一個(gè)行名為0-8000的矩陣,因此我先建立一個(gè)0-8000的列作為行名,把每個(gè)文件和這列進(jìn)行一個(gè)match操作,然后未match到的填充為0。
其實(shí)沒(méi)有很難的部分,主要是需要讀取文件夾中的所有文件名,然后循環(huán)讀取就行了。