Just as a quick example, we show how to filter cells based on sample size (number of cells) and UMAP location. You can imagine a similar example with more meaningful criteria.

tidyseurat

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.0.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(Seurat)
## Warning: package 'Seurat' was built under R version 4.0.3
## Attaching SeuratObject
library(tidyseurat)
## Registered S3 method overwritten by 'cli':
##   method     from    
##   print.boxx spatstat
## 
## Attaching package: 'tidyseurat'
## The following object is masked from 'package:SeuratObject':
## 
##     pbmc_small
## The following objects are masked from 'package:dplyr':
## 
##     add_count, bind_cols, bind_rows, count
## The following object is masked from 'package:stats':
## 
##     filter
tidy_object = pbmc_small %>% tidy()
## Warning: `tidy()` was deprecated in tidyseurat 0.2.0.
## tidyseurat says: tidy() is not needed anymore.
seurat_object = pbmc_small
tidy_object %>%
  add_count(file) %>%
  filter(PC_1 > 0 & n > 40)
## Warning: The `.drop` argument of `add_count()` is deprecated as of dplyr 1.0.0.
## # A Seurat-tibble abstraction: 5 x 17
## # Transcripts=230 | Active assay=RNA | Assays=RNA
##   cell  orig.ident nCount_RNA nFeature_RNA RNA_snn_res.0.8 letter.idents groups
##   <chr> <fct>           <dbl>        <int> <fct>           <fct>         <chr> 
## 1 GGCA… SeuratPro…        172           29 0               A             g1    
## 2 TTAC… SeuratPro…        228           39 0               A             g1    
## 3 GAGT… SeuratPro…        527           47 0               A             g1    
## 4 AGTC… SeuratPro…        157           29 0               A             g1    
## 5 CTTG… SeuratPro…        233           76 1               B             g1    
## # … with 10 more variables: RNA_snn_res.1 <fct>, file <chr>, n <int>,
## #   PC_1 <dbl>, PC_2 <dbl>, PC_3 <dbl>, PC_4 <dbl>, PC_5 <dbl>, tSNE_1 <dbl>,
## #   tSNE_2 <dbl>

Seurat

pca_emb = Embeddings(object = seurat_object, reduction = "pca")
cell_pca = rownames(pca_emb[pca_emb[,1]>0,])
n =
  seurat_object@meta.data %>%
  add_count(file) %>%
  pull(n)
seurat_object = AddMetaData( object = seurat_object, metadata = n, col.name = 'n')
seurat_object %>%
  subset(cells = cell_pca) %>%
  subset( n < 40)
## # A Seurat-tibble abstraction: 5 x 17
## # Transcripts=230 | Active assay=RNA | Assays=RNA
##   cell  orig.ident nCount_RNA nFeature_RNA RNA_snn_res.0.8 letter.idents groups
##   <chr> <fct>           <dbl>        <int> <fct>           <fct>         <chr> 
## 1 ATTC… SeuratPro…        212           38 0               A             g2    
## 2 ATCA… SeuratPro…        168           37 0               A             g2    
## 3 GTCA… SeuratPro…        210           33 0               A             g2    
## 4 GACG… SeuratPro…        202           30 0               A             g2    
## 5 GGAA… SeuratPro…        150           30 0               A             g2    
## # … with 10 more variables: RNA_snn_res.1 <fct>, file <chr>, n <int>,
## #   PC_1 <dbl>, PC_2 <dbl>, PC_3 <dbl>, PC_4 <dbl>, PC_5 <dbl>, tSNE_1 <dbl>,
## #   tSNE_2 <dbl>