R語(yǔ)言批量讀文件

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

現(xiàn)在在我的文件夾里有一堆數(shù)據(jù)文件(大于5個(gè)),每個(gè)文件打開以后都有相似的行名。需求是將所有文件都讀進(jìn)來(lái),成為很多個(gè)矩陣,然后根據(jù)相同的行名把它們合并起來(lái)以便后續(xù)的使用。
文件夾里的文件以及其中一個(gè)文件的樣子

總不能寫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)讀取就行了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容