终于忍不住对SeuratDisk动手了

· 2 min read · Discussion

终于忍不住对SeuratDisk动手了

终于忍不住对SeuratDisk动手了

虽然在跟着Theis Lab学单细胞: 格式转换,你需要知道底层逻辑(下)里我们讨论过许多转换Seurat object和anndata的方法,但里面提到的好几个包都不更新了。尤其当Seurat更新到V5版本之后,数据结构跟V3截然不同,这些包就不好用了。虽然可以为了强行适配旧方法转回V3格式,但考虑到以后的新方法肯定是向V5看齐,这终究不是长久之计。
我其实想对SeuratDisk动手很久了。它是一个“官方包”,由Seurat的团队开发,定义了一个hdf5结构的seurat格式叫h5Seurat,让Seurat obj可以用h5结构存储/读取。初衷是很好的,h5文件有很多优势,包括但不限于层次化存储、选择性加载、对稀疏矩阵的专门优化等等。还有一点就是这个格式在python和R都有很好的支持,所以作为单细胞数据的载体非常合适。可惜官方github停驻在了两年前,现在再装官方的包已经不work了。
有的人可能会觉得,这个包转换格式还要走一个中间文件h5Seurat,听起来效率很低啊!其实这是很聪明的做法,它将内存上的转化变成了磁盘上的转换,从而减轻了内存负担。并且h5Seurat和h5ad同属hdf5格式,可以用obj_copy_to()直接在文件系统层面复制,速度很快。

# 表面上的两步
  Seurat对象 → h5Seurat文件 → h5ad文件
# 实际发生的操作
  内存数据 → HDF5格式(h5Seurat) → HDF5格式(h5ad)
          ↑                   ↑
      需要序列化             仅需重组织结构

在强大的claude的加持下,我试着实现了以下几个功能:1. 全面支持V5的Assay5对象,并保持对以往版本的支持2. 修复了h5d方法对多维数组的支持3. 对齐了anndata的最新api,主要是把categories改成了categories/codes(也就是添加一下编码的属性)4. 加了一个比较糙的直接从h5ad加载为seurat对象的函数LoadH5AD5. 关于h5seurat格式的各种修修补补,现在可以h5ad-h5seurat双向转换,并且seurat obj 也可以正常存为h5seurat格式和读取h5seurat格式。
废话不多说了,安装请用以下代码:

remotes::install_github("mianaz/seuratdisk-V5")

基础使用方法:

library(SeuratDisk)

# Save Seurat object to h5Seurat format
SaveH5Seurat(seurat_obj, filename = "data.h5Seurat")

# Load h5Seurat file
seurat_obj <- LoadH5Seurat("data.h5Seurat")

# Convert to h5ad for Python/scanpy
Convert("data.h5Seurat", dest = "data.h5ad")

# Load h5ad directly into Seurat (recommended for V5)
seurat_obj <- LoadH5AD("scanpy_output.h5ad")

# Convert h5ad to h5Seurat
Convert("data.h5ad", dest = "data.h5Seurat")

期待大家的试用和反馈~

Bioinformatics Commentary