先附上學(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)它是這樣的

經(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ù)操作