seurat-skill

Comprehensive Seurat v5 (R) guide for single-cell RNA-seq and multimodal analysis. Covers installation, standard workflows (Normalize/SCTransform), clustering, integration (CCA/RPCA/Harmony), differential expression (FindMarkers/FindAllMarkers), visualization (DimPlot/FeaturePlot/VlnPlot/DoHeatmap), spatial transcriptomics (Visium/Visium HD/MERFISH/Slide-seq), CITE-seq, ATAC-seq, WNN, cell cycle regression, hashing/demultiplexing, sketch analysis, BPCells on-disk, pseudobulk, and format conversion. Use this skill whenever writing, debugging, or reviewing Seurat R code, building scRNA-seq pipelines, or looking up Seurat syntax, even for simple questions.

Seurat v5 Skill

Guide for single-cell and multimodal data analysis with Seurat v5 in R. This SKILL.md contains the essential quick reference. Detailed workflows are in references/ files, read the relevant one when you need step-by-step code for a specific analysis.

Auto-Update (run on skill load)

When this skill is loaded, immediately check <skill_directory>/.last_update. If the file is missing or older than 24 hours, run this before doing anything else:

git -C <skill_directory> pull --ff-only 2>/dev/null && date +%s > <skill_directory>/.last_update

If the pull fails (offline, conflict, etc.), ignore the error and continue normally. Do not mention the update to the user unless they ask.

Reference Files

Read the relevant reference file when the user's task matches a topic:

TopicFileWhen to read
Installationreferences/install.mdInstalling Seurat, dependencies, Docker
PBMC 3K Tutorialreferences/pbmc3k-tutorial.mdStandard scRNA-seq workflow end-to-end
Getting Startedreferences/get-started.mdSeurat v5 new features, BPCells
Essential Commandsreferences/essential-commands.mdObject access, metadata, identity, layers
Visualizationreferences/visualization.mdPlotting: DimPlot, FeaturePlot, VlnPlot, DoHeatmap
Advanced Plotsreferences/plotting-advanced.mdInteractive, linked, polygon, spatial image, cluster tree plots
Differential Expressionreferences/de-vignette.mdFindMarkers, FindAllMarkers, DE tests
Integration Introreferences/integration-introduction.mdWhen and why to integrate
Integrationreferences/integration.mdCCA, RPCA, Harmony, scVI integration
Integration RPCAreferences/integration-rpca.mdReciprocal PCA integration
Integration Mappingreferences/integration-mapping.mdLabel transfer, reference mapping
Integration Largereferences/integration-large-datasets.mdScalable integration, sketch-based
SCTransformreferences/sctransform.mdSCTransform normalization workflow
SCTransform v2references/sctransform-v2.mdImproved SCTransform (v2 regularization)
SCTransform Integrationreferences/sctransform-integration.mdIntegration with SCTransform
Merge and Splitreferences/merge.mdMerging/splitting objects and layers
Cell Cyclereferences/cell-cycle.mdCell cycle scoring and regression
Multimodal (CITE-seq)references/multimodal.mdWeighted nearest neighbor, CITE-seq
Multimodal Mappingreferences/multimodal-reference-mapping.mdReference mapping multimodal data
WNNreferences/wnn.mdWeighted nearest neighbor analysis
Hashingreferences/hashing.mdCell hashing, HTODemux, demultiplexing
Mixscapereferences/mixscape.mdPerturb-seq, CRISPR screen analysis
Spatial (Visium)references/spatial.md10x Visium spatial transcriptomics
Spatial (Other)references/spatial-2.mdSlide-seq, MERFISH, STARmap
Visium HDreferences/visiumhd.mdVisium HD high-resolution spatial
ATAC-seqreferences/atacseq-integration.mdscATAC-seq and RNA+ATAC integration
Bridge Integrationreferences/integration-bridge.mdCross-modality bridge integration
Sketch Analysisreferences/sketch-analysis.mdSketch-based analysis for large data
Advanced Clusteringreferences/advanced-clustering.mdLeiden, sub-clustering, spatial stats, identity management
BPCellsreferences/bpcells.mdOn-disk matrices with BPCells
Data Loadingreferences/data-loading.mdRead10X, ReadMtx, Load10X_Spatial, ReadXenium, all Read*/Load*
Dim Reductionreferences/dim-reduction.mdPCA, tSNE, UMAP, CCA, ICA, LDA, SPCA, projection methods
Interactionreferences/interaction.mdInteractive data exploration
Conversionreferences/conversion.mdConvert between Seurat/AnnData/loom/SCE
Parallelizationreferences/parallelization.mdfuture-based parallel processing
COVID Mappingreferences/covid-sctmapping.mdSCTransform mapping example
ParseBio Sketchreferences/parsebio-sketch.mdParseBio data with sketch integration
Extensionsreferences/extensions.mdSignac, SeuratData, SeuratWrappers, Azimuth ecosystem
v4 to v5 Migrationreferences/v4-to-v5-migration.mdAPI changes, parameter renames, removed functions

Quick Reference

Standard Workflow

obj = CreateSeuratObject(counts = counts, project = "my_project", min.cells = 3, min.features = 200)
obj[["percent.mt"]] = PercentageFeatureSet(obj, pattern = "^MT-")
obj = subset(obj, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

# Option A: Log-normalize
obj = NormalizeData(obj)
obj = FindVariableFeatures(obj)
obj = ScaleData(obj)

# Option B: SCTransform (replaces the 3 steps above)
obj = SCTransform(obj)

obj = RunPCA(obj)
obj = FindNeighbors(obj, dims = 1:30)
obj = FindClusters(obj, resolution = 0.5)
obj = RunUMAP(obj, dims = 1:30)
DimPlot(obj, reduction = "umap", label = TRUE)

Differential Expression

markers = FindAllMarkers(obj, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
markers = FindMarkers(obj, ident.1 = "cluster1", ident.2 = "cluster2")
markers = FindMarkers(obj, ident.1 = "cluster1", test.use = "DESeq2", slot = "counts")

Integration

# v5 layer-based integration
obj[["RNA"]] = split(obj[["RNA"]], f = obj$batch)
obj = NormalizeData(obj)
obj = FindVariableFeatures(obj)
obj = ScaleData(obj)
obj = RunPCA(obj)
obj = IntegrateLayers(obj, method = CCAIntegration, orig.reduction = "pca",
  new.reduction = "integrated.cca")
# Also: RPCAIntegration, HarmonyIntegration, FastMNNIntegration, scVIIntegration
obj = FindNeighbors(obj, reduction = "integrated.cca", dims = 1:30)
obj = FindClusters(obj, resolution = 0.5)
obj = RunUMAP(obj, reduction = "integrated.cca", dims = 1:30)
obj[["RNA"]] = JoinLayers(obj[["RNA"]])

Subsetting

subset(obj, idents = "B")                              # by cluster identity
subset(obj, idents = c("B", "NK"), invert = TRUE)      # exclude clusters
subset(obj, subset = MS4A1 > 2.5)                      # by expression
subset(obj, subset = condition == "treated")            # by metadata
subset(obj, downsample = 100)                           # downsample per cluster

Key Visualization

DimPlot(obj, reduction = "umap", group.by = "celltype", label = TRUE)
FeaturePlot(obj, features = c("CD3D", "MS4A1", "CD8A"))
VlnPlot(obj, features = c("CD3D", "MS4A1"), group.by = "celltype")
DotPlot(obj, features = c("CD3D", "MS4A1", "CD14"), group.by = "celltype")
DoHeatmap(obj, features = top_markers) + NoLegend()
FeatureScatter(obj, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")

Object Access

Cells(obj)                    # cell barcodes
Features(obj)                 # gene names
Idents(obj)                   # active identities
obj[[]]                       # metadata data.frame
obj$nCount_RNA                # single metadata column
Embeddings(obj, "pca")        # PCA embeddings
obj[["RNA"]]$counts           # raw counts (v5 layer)
DefaultAssay(obj)             # current default assay
Layers(obj)                   # list layers
VariableFeatures(obj)         # HVGs
FetchData(obj, vars = c("UMAP_1", "UMAP_2", "CD3D"))  # mixed data access

Pseudobulk

bulk = AggregateExpression(obj, group.by = c("celltype", "sample"), return.seurat = TRUE)

Multi-Assay (CITE-seq)

obj[["ADT"]] = CreateAssayObject(counts = adt.counts)
obj = NormalizeData(obj, assay = "ADT", normalization.method = "CLR", margin = 2)
DefaultAssay(obj) = "ADT"
FeaturePlot(obj, features = "adt_CD3")

Spatial

obj = Load10X_Spatial(data.dir = "path/to/spaceranger/outs")
SpatialDimPlot(obj)
SpatialFeaturePlot(obj, features = "MS4A1")

Format Conversion

# Seurat to AnnData
library(SeuratDisk)
SaveH5Seurat(obj, filename = "obj.h5Seurat")
Convert("obj.h5Seurat", dest = "h5ad")

# Seurat to SingleCellExperiment
sce = as.SingleCellExperiment(obj)

# SingleCellExperiment to Seurat
obj = as.Seurat(sce)