单细胞表达矩阵文件转换

先附上学习连接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)

我们发现它是这样的


data

经过对比,我们看到:
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则对行或者列元素进行目的函数操作

你可能感兴趣的:(单细胞表达矩阵文件转换)