单细胞转录组数据分析入门-2-各种格式的单细胞数据读取
单细胞转录组测序的格式可能有多种,包括单样本,多样本,10X 的标准输出文件,h5,h5ad,txt/csv/tsv
网上的教程鱼龙混杂,这使我在初次接触时晕头转向
10X 标准输出
这是目前比较主流的一种数据格式,对于一个样本,其包含:
- `barcodes.tsv.gz`:记录 cell id
- `features.tsv.gz`:记录 gene id
- `matrix.mtx.gz`:计数 counts 矩阵
三个文件,且命名必须与上面**完全相同**
直接使用 Seurat 的 `Read10X()` 函数读取即可
如何读取多个样本
通常,测序不会只测一个样本,那么如何读取多个样本呢?
以 [GSE151177](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE151177) 的读取为例:
下载的数据为压缩包 `GSE151177_RAW.tar`,解压到 `GSE151177_RAW` 文件夹中,此时所有样本的三个文件都在这个文件夹下
可以看到,前缀相同的是同一个样本
根据 Seurat 包的 `Read10X()` 函数要求,我们需要整理一下文件,为每个样本单独建立一个文件夹,然后将样本对应的 3 个文件重命名一下
在 R 语言中,可以写一个函数来完成这些操作:
于是我们就获得了以下文件夹:
每个文件夹中的文件名都是一样的:
在 Seurat V4 中,我们可以循环读取多个样本,然后 merge:
但是 Seurat V5 修改了 Seurat 数据对象的结构,merge 操作并不会将样本的表达量矩阵合并
`Read10X()` 函数可以接受多个路径,因此在 Seurat V5 中,我们可以直接传入这些子文件夹:
txt/csv/tsv 数据
使用 data.table 的 `fread()` 函数读取
以 [GSE150703](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE150703) 为例
h5ad
H5AD 是一种基于 HDF5 (Hierarchical Data Format) 的高效文件格式,专为存储和分析单细胞转录组数据设计。通常 `h5ad` 文件由 Python 的单细胞分析工具 **Scanpy** 生成,但如果我们想在 R 语言中进行处理和绘图,也不是不可以。
首先需要安装这些包:
先将 `h5ad` 文件转化为 `h5seurat` 对象
加载 `h5seurat` 对象,此时不要添加 metadata,因为通常会出错
提取 metadata 并添加
h5
我目前没有遇到,看到其他教程中是使用 `Read10X_h5()` 函数即可
其他技巧
如何修改单细胞样本的名字?
我们提取之前的 GSE151177 数据中的 10 个样本(银屑病样本,试剂盒版本 V2.0,共 10 个样本)来示例:
由此获得了一个 Seurat 对象 seurat_object,seurat_object 对象中生成的元数据字段 `orig.ident` (通常存储在 `meta.data` 中)通常用于跟踪每个细胞样本来自哪个实验条件、患者、时间点或其他实验分组。这对于下游分析非常有用,尤其是当需要区分或比较不同样本时。可以用 `seurat_object$orig.ident` 来访问。
如果你是按照前文进行读取,你会发现 `orig.ident` 在 Seurat 对象中被存储为从 1 开始的**因子类型(factor)**而不是我们期望的样本名。在后续的作图分析中,如果样本信息只是数值,还要对应回原本的样本名去查看,这样并不直观。因此我们需要将 Seurat 对象中的 `orig.ident` 替换为真实的样本名字。
为什么替换会出错?
这里会出现一些顺序的问题,例如当我们的样本数量超过 9 个的时候:
可以发现合并样本的顺序是`"1" "10" "2"...`,在 R 中,因子的默认排序方式是按照**字典序**(也叫作**字母顺序**)进行排列的,而不是按照数值的大小进行排序。因为 R 默认将因子的水平(levels)视作字符,而在字典序中,"10" 会被认为比 "2" 小,因为比较的是字符串的每个字符的顺序:
- "1" 和 "10" 的首字符都是 "1",所以相同。
- 但在 "10" 中,第二个字符是 "0",而在 "2" 中是 "2",按照字母表顺序,"0" 比 "2" 更靠前。
如何知道这些因子对应的到底是哪些样本呢?可以通过查看细胞数量来判断:
所以我们可以知道,在读取时,`Read10X()` 其实是按照我们的 `psoriasis_v2_dirs` 中的文件夹顺序来读取的,但是他并没有按照 `psoriasis_v2_dirs` 中的文件夹名去命名我们的样本,而是按顺序给了一个因子,只不过在合并样本的时候,由于因子的默认排序方式是按照字典序进行排列的,因此合并的顺序发生了变化。
知道对应关系后我们就可以替换样本名了,使用 [Seurat 的 `RenameIdents()` 函数](https://satijalab.org/seurat/articles/essential_commands.html#standard-seurat-workflow):
更简单的方法
上面的思路确实可以解决问题,但还是太麻烦了,有没有更简单又强势的方法推荐一下呢?
有的兄弟,有的。其实在数据读入的时候就可以直接命名样本
通过查看 [`Read10X()` 函数的源代码](https://github.com/satijalab/seurat/blob/1549dcb3075eaeac01c925c4b4bb73c73450fc50/R/preprocessing.R#L980),我们可以发现其实这个函数有一个查看路径向量 `data.dir` 是否有命名的操作:
所以我们可以直接在一开始使用样本名来命名文件夹向量:
Loading...



