单细胞表达矩阵文件转换

作者: 小潤澤 | 来源:发表于2020-03-18 12:59 被阅读0次

    先附上学习连接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则对行或者列元素进行目的函数操作

    相关文章

      网友评论

        本文标题:单细胞表达矩阵文件转换

        本文链接:https://www.haomeiwen.com/subject/ftdqyhtx.html