前言
在[[11-10x数据导入为seurat对象]] 我们介绍了10x 数据导入seurat。但有时候,获得的数据并非是标准的10x 格式,比如raw 矩阵,该如何解决呢?或者,我们希望以sce 对象处理,毕竟单细胞R 中对象处理,并非seurat 一家独大。来探索一下吧。
1-对10x数据
标准的10x 输出:
> 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。
这时候自然是不好以稀疏矩阵读取的。
这时候一般有两种思路:
- 以数据框形式读入,去除对应内容后,再将余下内容转为矩阵;
- 直接读入矩阵,再删除余下的内容,再将矩阵转为数值型;
比如我就喜欢第一种:
# 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 创建对应流程的对象。
a <- matrix(1:16, ncol = 4)
a <- Matrix::Matrix(a, sparse = T)
colnames(a) <- paste0("a",1:4)
rownames(a) <- paste0("b",1:4)
> 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:
pbmc.sce <- as.SingleCellExperiment(seu.obj)
sce 转为seurat:
seu_paths <- Seurat::as.Seurat(
sim_paths,
counts = "counts",
data = "logcounts",
assay = NULL,
project = "SingleCellExperiment")
有一点需要注意的是,sce 对象可以额外存储关于行的信息,对应rowData:
> 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 对象中,有存放该内容的槽。
我的解决方法是:
seu_paths@misc["geneData"] <- rowData(sim_paths)
将其保存在槽misc 内,也就是记录seurat 其他信息的这个槽中。
其他的可以参考:3.15 不同R包数据的相互转换 - 单细胞交响乐[1]
4-导出sce或seurat
其实最直接的,保存Rds 或者Rdata 就好了。
saveRDS(sce, file = "./TmpOut/melanoma_sce.Rds")
关于sce,还见过一种crb
格式保存:Export a data set in SCE format • cerebroApp[2]
当然seurat,是可以通过seuratdisk 保存为h5seurat的:
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]
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,再将其转换:
SaveH5Seurat(seu_paths, filename = "./paths.h5Seurat")
Convert("./paths.h5Seurat", dest = "h5ad")
6-其他格式
最近还遇到一个奇怪的后缀:facs_Diaphragm_seurat_tiss.Robj
其读取后,会是奇怪的样子:
参考:构建seurat对象之初就应该是把基因名字转换好 - 知乎[7]
这是因为,seurat 也是日新月异,它是老版本的seurat 对象,需要更新一下:
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