先附上学习连接https://mp.weixin.qq.com/s/NaZ5kz3ew2O01cFEnK8sXg
这个问题之前也遇到过,在此搬个小板凳来学习学习
数据下载
由于工作站暂时连接不上,所以打算利用Windows来下载,但是传统方法下载的gz结尾的csv文件貌似有损坏
我是利用powershell来下载的
首先在cmd输入
start powershell
然后回车,进入powershell的界面
在这个页面先输入
$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')
注意,括号内第一个输入的是你要下载的文件的http地址,第二个是你在本机要保存的地址加文件名
我所采用的文件为GSE117988,已公开数据集
转换格式
我们知道,通常利用CellRange输出的有三个文件
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)
我们发现它是这样的
经过对比,我们看到:
1.其实barcodes.tsv记录的就是我们读入的大表(data)的列名
2.gene.tsv其实就是两列基因名对应拼接起来的,第一列为Ensemble id,第二列是基因名称
所以对于barcodes.tsv
write.table(colnames(data),file = 'barcodes.tsv',quote = F,
col.names = F,row.names = F)
对于gene.tsv来说,我们不妨将大表(data)的两列行名拼接在一起,然后将第一列进行id转换(不再赘述)
write.table(data.frame(rownames(data),rownames(data)),file = 'genes.tsv',
quote = F,sep = '\t',
col.names = F,row.names = F)
那么对于matrix.mtv,根据它的特点,它是记录非0值的,并且包含头信息,其中
第一列表示的是行号,第二列表示的是列号,第三列表示的是表达量,那么综合起来就是大表中(data)第几行第几列的表达量为多少
那么先写头信息
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 )
这段代码运行很慢,需要一段时间
最终结果
do.call用法
这里在安利一个do.call的用法
do.call本质上是一个执行函数,第一个填函数,第二个填该函数的输入数据和参数
dat<- data.frame('letter' = letters[1:10], 'number' = 1:10, 'value' = c('+','-'))
do.call(paste, c(dat, sep = ""))
而它的输入为某数据结构(list,data.frame)的子元素,若是list,那么就对该list的子元素进行目的函数操作,若是data.frame则对行或者列元素进行目的函数操作