前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bioinfo10-单细胞sce与seurat对象的导入、保存与互转

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

作者头像
北野茶缸子
发布2022-05-19 11:28:03
5.2K0
发布2022-05-19 11:28:03
举报

前言

在[[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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1-对10x数据
  • 2-对于表达矩阵
  • 3-seurat与sce格式互换
  • 4-导出sce或seurat
  • 5-导出python输入或其他格式
  • 6-其他格式
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档