Skip to content

6_Interopability between single cell objects

Olivia Waltner edited this page Apr 5, 2023 · 1 revision

It's to your advantage to use as many functions offered by monocle, seurat, archR, etc etc for your analysis. To the basic user, converting between objects is not intuitive.

monocle to seurat function

monocle3_to_seurat <-function(cds, seu_rd="umap", mon_rd="UMAP", assay_name="RNA", row.names="gene_short_name", normalize=T){
  warning("this function will create a Seurat object with only 1 reduced dimension; currently only UMAP is supported")
  counts <- exprs(cds)
  rownames(counts) <- rowData(cds)[[row.names]]
  seu<-CreateSeuratObject(counts, meta.data = data.frame(colData(cds)))
  keyname<-paste0(seu_rd, "_")
  colnames(reducedDims(cds)[[mon_rd]])<-paste0(keyname, 1:dim(reducedDims(cds)[[mon_rd]])[2])
  seu@reductions[[seu_rd]]<-Seurat::CreateDimReducObject(embeddings = reducedDims(cds)[[mon_rd]], key = keyname, assay = assay_name, )
  if(normalize){seu<-NormalizeData(seu)}
  seu
}

usage

seu<-monocle3_to_seurat(cds)

DefaultAssay(seu) <- 'RNA'
seu <-  FindVariableFeatures(seu) %>% 
        ScaleData() %>% 
        RunPCA() 

#no need to RunUMAP!!!

seurat to monocle object

seurat_to_monocle3 <-function(seu, seu_rd="umap", mon_rd="UMAP", assay_name="RNA"){
  cds<-new_cell_data_set(seu@assays[[assay_name]]@counts, 
                         cell_metadata = seu@meta.data, 
                         gene_metadata = DataFrame(
                           row.names = rownames(seu@assays[[assay_name]]@counts), 
                           id=rownames(seu@assays[[assay_name]]@counts), 
                           gene_short_name=rownames(seu@assays[[assay_name]]@counts)))
  reducedDims(cds)[[mon_rd]]<-seu@reductions[[seu_rd]]@cell.embeddings
  cds
}

usage

#exporting SCT data from seurat
cds<-seurat_to_monocle3(seu, seu_rd = "SCT_UMAP", assay_name = "SCT)

#default parameters export RNA data
cds<-seurat_to_monocle3(seu)

ArchR to Seurat

archr_to_seurat<-function (proj, matrix, binarize, archr_rd) 
{
    se <- getMatrixFromProject(proj, useMatrix = matrix, binarize = binarize)
    mat <- se@assays@data@listData[[matrix]]
    feature_df <- se@elementMetadata %>% as.data.frame()
    if (matrix == "GeneScoreMatrix" | matrix == "GeneExpressionMatrix" | 
        matrix == "MotifMatrix") {
        rn <- feature_df$name
    }
    if (matrix == "TileMatrix") {
        rn <- paste0(feature_df[, 1], "-", feature_df[, 2], "-", 
            feature_df[, 3])
    }
    if (matrix == "PeakMatrix") {
        feature_df <- se@rowRanges %>% as.data.frame()
        rn <- paste0(feature_df[, 1], "-", feature_df[, 2], "-", 
            feature_df[, 3])
    }
    rownames(mat) <- rn
    colnames(mat) <- colnames(se)
    meta <- se@colData %>% as.data.frame()
    rownames(meta) <- colnames(mat)
    seu <- CreateSeuratObject(mat, project = matrix, assay = matrix, 
        meta.data = meta)
    keyname <- paste0(archr_rd, "_")
    umap_df <- proj@embeddings@listData[[archr_rd]]@listData[["df"]] %>% 
        as.matrix()
    colnames(umap_df) <- paste0(keyname, 1:2)
    seu@reductions[[archr_rd]] <- Seurat::CreateDimReducObject(embeddings = umap_df, 
        key = keyname, assay = matrix)
    seu
}

usage

seu<-archr_to_seurat(archr, matrix = "GeneScoreMatrix", archr_rd = "LSI_UMAP", binarize = F)

Clone this wiki locally