Seurat 是 R 语言中最常用的单细胞分析框架,而 Anndata (.h5ad) 则是 Python 生态下 Scanpy 体系的核心数据格式。跨语言、多模态联合分析场景下,如何快速、安全地在二者之间互相转换,是很多科研人员面临的常见问题。
本文总结了在 R 语言环境下,如何利用 reticulate 和 anndata 包,快速实现:
- 从 Anndata (
.h5ad) 读取并转换为 Seurat 对象 - 将 Seurat 对象写出为
.h5ad格式,便于 Python 环境读取
该方法无需中间文件转换,避免信息丢失,适用于空间转录组、单细胞多组学等多种数据类型。
✅ 1. 读取 .h5ad 文件并转换为 Seurat 对象
以下代码示例演示了如何直接在 R 中读取 .h5ad 文件,并转换为标准 Seurat 对象,同时保留常用降维信息(如 UMAP 坐标、空间坐标):
pacman::p_load(Seurat, reticulate, anndata, dplyr)
use_condaenv("<your conda env name which deploy Scanpy>", required = TRUE)
{
adata.obj <- read_h5ad("<your anndata file>.h5ad")
stRNA.obj <- CreateSeuratObject(counts = t(as.matrix(adata.obj$X)), meta.data = adata.obj$obs)
### 添加空间与降维信息
{
X_umap <- adata.obj$obsm$X_umap
dimnames(X_umap) <- list(Cells(stRNA.obj), c("umap_1", "umap_2"))
stRNA.obj[["umap"]] <- CreateDimReducObject(embeddings = X_umap, key = "UMAP_")
spatial <- adata.obj$obsm$spatial
dimnames(spatial) <- list(Cells(stRNA.obj), c("spatial_1", "spatial_2"))
stRNA.obj[["spatial"]] <- CreateDimReducObject(embeddings = spatial, key = "spatial_")
}
}
### 保存 Seurat 对象
stRNA.obj %>% qs::qsave("<your seurat file>.qs")
✅ 2. 将 Seurat 对象写出为 .h5ad 文件
依赖 scCustomize::as.anndata() 函数,可将 Seurat 对象直接写出为 .h5ad 格式,便于在 Python 端继续分析:
pacman::p_load(Seurat, reticulate, anndata, dplyr)
use_condaenv("<your conda env name which deploy Scanpy>", required = TRUE)
readRDS("<your seurat file>.Rds") %>%
scCustomize::as.anndata(x = ., assay = "RNA",
file_path = ".",
file_name = "<your anndata file>.h5ad",
main_layer = "counts",
other_layers = NULL
)
✅ 3. 总结
该方法通过 reticulate 无缝桥接 Python 与 R 语言,结合 anndata 和 scCustomize 工具,实现了:
- 单细胞数据在 R/Python 生态间的高效、双向互读
- 保留空间信息、降维结果,避免数据丢失
- 支持多模态、空间组学、单细胞多组学等复杂数据结构