R最速文件读写 | 用R的dgCMatrix包来构建稀疏矩阵 | sparse matrix by dgCMatrix

 

累了,写了一个多合一的读取函数,非常适合单细胞数据。

# quickly read large txt file to data.frame, matrix, or dgCMatrix
fast.read.txt <- function(fileName, sep=",", format="dataframe") {
  tmp.raw <- data.table::fread(fileName, sep=sep)
  # get rowname
  tmp.raw <- as.data.frame(tmp.raw)
  tmp.raw <- tmp.raw[!duplicated(tmp.raw[,1]),]
  rownames(tmp.raw) <- tmp.raw[,1]
  tmp.raw[,1] <- NULL
  # output format
  if (format=="dataframe") {
    return(tmp.raw)
    } else if (format=="matrix") {
      return(as.matrix(tmp.raw))
    } else if (format=="dgCMatrix") {
      library(Matrix)
      return(as(as.matrix(tmp.raw), "dgCMatrix"))
    } else {
      stop("please input correct format!!!")
    }
}

  

 

文本文件有其天然的优势,随时可以查阅,缺点就是占用太多存储空间。

我的单细胞数据大部分都会转为稀疏sparse矩阵来存储为Rdata,但是跨平台的话也会保留CSV的格式。

但是R内置的read.csv读写都奇慢无比,最近发现了data.table神器,fread和fwrite都直接秒杀了其他任何函数,不知道是什么做到的,以后默认就用这个好了。

E15_count <- data.table::fread("GSE149524_RAW/E15.5.csv")

 

library(Matrix)
raw_count <- data.table::fread("rna_adata_raw_x.csv")
raw_count <- as.data.frame(raw_count)
# raw_count <- raw_count[!duplicated(raw_count$V1),]
rownames(raw_count) <- raw_count$V1
raw_count$V1 <- NULL
# raw_count[1:5,1:5]
raw_count <- as(as.matrix(raw_count), "dgCMatrix")
meta.info <- data.table::fread("rna.meta.info.csv")

  

The fastest way to Read and Writes file in R

唯一的缺点就是无法设置rowname,这是正常的,通常还要remove duplicate,然后data.table需要转化为dataframe或者matrix,可以自己包装成一个函数。 

 


 

 

sparse matrix是用来存储大型稀疏矩阵用得,单细胞表达数据基本都用这个格式来存储,因为单细胞很大部分都是0,用普通文本矩阵存储太占空间。

使用也是相当简单:

library("Matrix")
readsCount <- read.csv("data/count.csv", header = T, row.names = 1)
readsCountSM <- as(as.matrix(readsCount), "dgCMatrix")
# str(M1)

  

 想转回去,as.matrix() 就可以了。

经测试, dgCMatrix格式的Rdata仅有CSV文本的十分之一大小,极大的节省了存储空间,建议转化成功后,删除所有CSV文本。

 

参考:

Coercion of matrix to sparse matrix (dgCMatrix) and maintaining dimnames.

 

posted @ 2018-03-28 17:16  Life·Intelligence  阅读(11544)  评论(0编辑  收藏  举报
TOP