單細(xì)胞表達(dá)矩陣文件轉(zhuǎn)換

先附上學(xué)習(xí)連接https://mp.weixin.qq.com/s/NaZ5kz3ew2O01cFEnK8sXg
這個(gè)問題之前也遇到過,在此搬個(gè)小板凳來學(xué)習(xí)學(xué)習(xí)

數(shù)據(jù)下載

由于工作站暫時(shí)連接不上,所以打算利用Windows來下載,但是傳統(tǒng)方法下載的gz結(jié)尾的csv文件貌似有損壞

我是利用powershell來下載的
首先在cmd輸入

start powershell

然后回車,進(jìn)入powershell的界面
在這個(gè)頁面先輸入

$client = new-object System.Net.WebClient
$client.DownloadFile('https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE117988&format=file&file=GSE117988%5Fraw%2EexpMatrix%5FPBMC%2Ecsv%2Egz','E:/data.csv')

注意,括號內(nèi)第一個(gè)輸入的是你要下載的文件的http地址,第二個(gè)是你在本機(jī)要保存的地址加文件名

我所采用的文件為GSE117988,已公開數(shù)據(jù)集

轉(zhuǎn)換格式

我們知道,通常利用CellRange輸出的有三個(gè)文件
matrix.mtx,barcodes.tsv 和 genes.tsv
其中:
1.barcodes.tsv的是類似于這樣的文件


2.matrix.mtv是這樣的,用于記錄非0值的


3.genes.tsv


好了,我們把下載下來的csv文件讀入R,(讀表方式很多,有很多更快速的,在這里就用了最簡單的)

data = read.csv("E:/R/R_files/data.csv",header = T,row.names = 1)

我們發(fā)現(xiàn)它是這樣的


data

經(jīng)過對比,我們看到:
1.其實(shí)barcodes.tsv記錄的就是我們讀入的大表(data)的列名

2.gene.tsv其實(shí)就是兩列基因名對應(yīng)拼接起來的,第一列為Ensemble id,第二列是基因名稱

所以對于barcodes.tsv

write.table(colnames(data),file = 'barcodes.tsv',quote = F,
            col.names = F,row.names = F)

對于gene.tsv來說,我們不妨將大表(data)的兩列行名拼接在一起,然后將第一列進(jìn)行id轉(zhuǎn)換(不再贅述)

write.table(data.frame(rownames(data),rownames(data)),file = 'genes.tsv',
            quote = F,sep = '\t',
            col.names = F,row.names = F)

那么對于matrix.mtv,根據(jù)它的特點(diǎn),它是記錄非0值的,并且包含頭信息,其中



第一列表示的是行號,第二列表示的是列號,第三列表示的是表達(dá)量,那么綜合起來就是大表中(data)第幾行第幾列的表達(dá)量為多少

那么先寫頭信息

file="matrix.mtx"
sink(file)
cat("%%MatrixMarket matrix coordinate integer general\n")
cat("%\n")
cat(paste(nrow(data),ncol(data),sum(ct>0),"\n")) 
sink()

再來篩選

tmp=data
tmp
tmp=do.call(rbind,lapply(1:ncol(data),function(i){
  return(data.frame(row=1:nrow(data),
                    col=i,
                    exp=data[,i]))
}) )
tmp=tmp[tmp$exp>0,]

write.table(tmp,file = 'E:/R/R_files/matrix.mtx',quote = F,
            col.names = F,row.names = F,append = T )

這段代碼運(yùn)行很慢,需要一段時(shí)間
最終結(jié)果


do.call用法

這里在安利一個(gè)do.call的用法
do.call本質(zhì)上是一個(gè)執(zhí)行函數(shù),第一個(gè)填函數(shù),第二個(gè)填該函數(shù)的輸入數(shù)據(jù)和參數(shù)

dat<- data.frame('letter' = letters[1:10], 'number' = 1:10, 'value' = c('+','-'))
do.call(paste, c(dat, sep = ""))

而它的輸入為某數(shù)據(jù)結(jié)構(gòu)(list,data.frame)的子元素,若是list,那么就對該list的子元素進(jìn)行目的函數(shù)操作,若是data.frame則對行或者列元素進(jìn)行目的函數(shù)操作

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

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

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