bioinfo10-单细胞sce与seurat对象的导入、保存与互转

2022-05-19 11:28:03 浏览数 (1)

前言

在[[11-10x数据导入为seurat对象]] 我们介绍了10x 数据导入seurat。但有时候,获得的数据并非是标准的10x 格式,比如raw 矩阵,该如何解决呢?或者,我们希望以sce 对象处理,毕竟单细胞R 中对象处理,并非seurat 一家独大。来探索一下吧。

1-对10x数据

标准的10x 输出:

代码语言:javascript复制
> dir("./data/ctrl_raw_feature_bc_matrix/")
[1] "barcodes.tsv.gz" "features.tsv.gz" "matrix.mtx.gz"

对于seurat:Read10X 和 CreateSeuratObject 组合即可读取。

对于sce:DropletUtils 包的read10xCounts() 函数。

2-对于表达矩阵

比如,有的提供的单纯是tsv 或csv 的原始counts 矩阵。其实如果你仔细探索,10x 格式,不过是将counts 矩阵基础之上,拆成了三个文件。

如果是单纯的表达矩阵,有两个方案:

  • fread 包,这个在[[128-R茶话会21-R读取及处理大数据]] 已经介绍了;不过需要注意的是,其会读入data.table 格式;
  • scuttle::readSparseCounts,可以将表达矩阵(比如tsv)以稀疏矩阵格式读入;

如果直接是稀疏矩阵,可以通过Matrix::readMM 读取。

但问题是,有时候提供的矩阵中会缝合了其他的信息,比如cellmeta data。

这时候自然是不好以稀疏矩阵读取的。

这时候一般有两种思路:

  • 以数据框形式读入,去除对应内容后,再将余下内容转为矩阵;
  • 直接读入矩阵,再删除余下的内容,再将矩阵转为数值型;

比如我就喜欢第一种:

代码语言:javascript复制
# get counts
sce <- fread("./Input/melanoma.txt.gz")
counts <- as.matrix(sce[4:nrow(sce) , 2:ncol(sce)])
rownames(counts) <- sce[4:nrow(sce) , 1]

毕竟fread 读取大文件的速度不是盖的,而无法通过稀疏矩阵读取的矩阵,自然速度不会快到哪去。

总结一下,两个判断:

  • 如果是纯纯的counts 矩阵,尽可能的以稀疏矩阵格式读取;
    • 如果是mtx 格式,Matrix::readMM;
    • 如果是文本格式,scuttle::readSparseCounts;
  • 如果包含其他metadata的矩阵,fread 读取,移除对应信息后,再转为matrix;

接下来,无论是稀疏矩阵,还是counts 矩阵,都可以被CreateSeuratObject 或是SingleCellExperiment 创建对应流程的对象。

代码语言:javascript复制
a <- matrix(1:16, ncol = 4)
a <- Matrix::Matrix(a, sparse = T)
colnames(a) <- paste0("a",1:4)
rownames(a) <- paste0("b",1:4)
代码语言:javascript复制
> SingleCellExperiment(assays = list(counts = a))
class: SingleCellExperiment 
dim: 4 4 
metadata(0):
assays(1): counts
rownames(4): b1 b2 b3 b4
rowData names(0):
colnames(4): a1 a2 a3 a4
colData names(0):
reducedDimNames(0):
altExpNames(0):
> Seurat::CreateSeuratObject(a)
An object of class Seurat 
4 features across 4 samples within 1 assay 
Active assay: RNA (4 features, 0 variable features)

3-seurat与sce格式互换

需要注意的是,这里均使用Seurat包中的函数。(sce 好没牌面啊~)

seurat 转sce:

代码语言:javascript复制
pbmc.sce <- as.SingleCellExperiment(seu.obj)

sce 转为seurat:

代码语言:javascript复制
seu_paths <- Seurat::as.Seurat(
  sim_paths,
  counts = "counts",
  data = "logcounts",
  assay = NULL,
  project = "SingleCellExperiment")

有一点需要注意的是,sce 对象可以额外存储关于行的信息,对应rowData:

代码语言:javascript复制
> sce
class: SingleCellExperiment 
dim: 23676 4645 
metadata(0):
assays(2): counts logcounts
rownames(23676): C9orf152 RPS11 ... CTSC AQP7
rowData names(0):
colnames(4645): Cy72_CD45_H02_S758_comb Cy72_CD45_D09_S717_comb ...
  CY94_CD45NEG_CD90POS_2_F04_S64_comb
  CY94_CD45NEG_CD90POS_2_D08_S44_comb
colData names(5): cell sample malignancy celltype sizeFactor
reducedDimNames(0):
altExpNames(0):

这个colData,对应了seurat 中的metadata 数据框,对应细胞的信息。

而rowData也就是关于基因的信息。这里我并没有发现seurat 对象中,有存放该内容的槽。

我的解决方法是:

代码语言:javascript复制
seu_paths@misc["geneData"] <- rowData(sim_paths)

将其保存在槽misc 内,也就是记录seurat 其他信息的这个槽中。

其他的可以参考:3.15 不同R包数据的相互转换 - 单细胞交响乐[1]

4-导出sce或seurat

其实最直接的,保存Rds 或者Rdata 就好了。

代码语言:javascript复制
saveRDS(sce, file = "./TmpOut/melanoma_sce.Rds")

关于sce,还见过一种crb 格式保存:Export a data set in SCE format • cerebroApp[2]

当然seurat,是可以通过seuratdisk 保存为h5seurat的:

代码语言:javascript复制
SaveH5Seurat(seu_paths, filename = "./paths.h5Seurat")

可以参考:Saving and Loading Data from an h5Seurat File • SeuratDisk[3]

不过我还是喜欢直接保存成Rds 了。

5-导出python输入或其他格式

python 中的单细胞分析软件,如scanpy,其可以读取h5ad 格式。

我们也可以将seurat 或sce 中处理的对象转换为h5ad,供python 中分析。

比如sce:Conversion Between scRNA-seq Objects • zellkonverter[4]

代码语言:javascript复制
writeH5AD(sce, "./sce.h5ad", X_name = NULL, skip_assays = FALSE)

不过zellkonverter 这个包,默认会创建一个conda 环境,并保留全部依赖,用于配置器环境。但是,在我的电脑上,它并没有找到我的conda,而是重头下了一个conda,且网速非常慢。很不友好。

另外也发现一个包:Export a SingleCellExperiment R object as Python annData object — exportSCEtoAnnData • singleCellTK[5]

但似乎也需要解决很多python 上的依赖。你们可以试试。

对于sce 对象来说,我目前是转为seurat后,再转为h5 了。

而对于seurat:Conversions: h5Seurat and AnnData • SeuratDisk[6]

则要先保存为h5seurat,再将其转换:

代码语言:javascript复制
SaveH5Seurat(seu_paths, filename = "./paths.h5Seurat")
Convert("./paths.h5Seurat", dest = "h5ad")

6-其他格式

最近还遇到一个奇怪的后缀:facs_Diaphragm_seurat_tiss.Robj

其读取后,会是奇怪的样子:

参考:构建seurat对象之初就应该是把基因名字转换好 - 知乎[7]

这是因为,seurat 也是日新月异,它是老版本的seurat 对象,需要更新一下:

代码语言:javascript复制
tiss <- UpdateSeuratObject(tiss)

参考资料

[1]

3.15 不同R包数据的相互转换 - 单细胞交响乐: https://jieandze1314.osca.top/03/03-15#2.2-singlecellexperiment-zhuan-seurat

[2]

Export a data set in SCE format • cerebroApp: https://romanhaa.github.io/cerebroApp/articles/export_a_data_set_in_SCE_format.html#export-to-cerebro-format-1

[3]

Saving and Loading Data from an h5Seurat File • SeuratDisk: https://mojaveazure.github.io/seurat-disk/articles/h5Seurat-load.html

[4]

Conversion Between scRNA-seq Objects • zellkonverter: https://theislab.github.io/zellkonverter/index.html

[5]

Export a SingleCellExperiment R object as Python annData object — exportSCEtoAnnData • singleCellTK: https://camplab.net/sctk/v2.2.0/reference/exportSCEtoAnnData.html

[6]

Conversions: h5Seurat and AnnData • SeuratDisk: https://mojaveazure.github.io/seurat-disk/articles/convert-anndata.html

[7]

构建seurat对象之初就应该是把基因名字转换好 - 知乎: https://zhuanlan.zhihu.com/p/385206713

0 人点赞