library(scater)
library(scran)
library(tidyverse)
library(patchwork)
Re-run scoreMarkers
on the clustered data.
sce <- readRDS("R_objects/Caron_clustered.500.rds")
markers <- scoreMarkers(sce,
groups = sce$label,
block = sce$SampleName)
One of the main tasks we often want to perform is annotating our cells as known types of cells ocurring in our sampled tissue. This requires prior knowledge of cell transcriptomic states and therefore becomes easier if there are well-curated resources available. However, for less well-studied tissues these may not be available and so cell type annotation may rely on “manual annotation” using a small set of genes with known cell-specific expression (e.g. from microscopy data, qPCR on cell-sorted samples, etc.).
In this section we will do a very simple manual labelling of our clusters, based on known genes expressed in different blood cell types. However, there are more systematic methods for cell type annotation, in particular when prior information is available for those cells:
SingleR
package uses previously labelled bulk or single-cell datasets to
annotate a new dataset.AUCcell
package classifies cells into types based on user-provided lists of
“signature” genes for each type. These lists can be generated from
literature, or also be based on prior RNA-seq datasets.Any of these approaches is suitable, and they can often be done in conjunction. To learn more about these approaches, read the chapter on cell type annotation in the OSCA book.
A lot is known about immune cell markers, in particular as many surface markers have been identified as useful for immunophenotyping.
To help us in our annotation, we start by retrieving the top-ranked
genes from each cluster into a list. We do this by looping through the
list using the lapply()
function and in each case picking
the genes with rank < 10 for Cohen’s D statistic:
top_markers_all <- lapply(markers, function(x){
x %>%
as.data.frame() %>%
filter(rank.logFC.cohen < 10) %>%
rownames()
})
top_markers_all
## $`1`
## [1] "STMN1" "LAPTM5" "DPYD" "RPS27"
## [5] "RCSD1" "ZFP36L2" "ENSG00000229839" "TMSB10"
## [9] "PTMA" "FHIT" "MME" "RPL34"
## [13] "RPS3A" "SSBP2" "MEF2C" "CD74"
## [17] "EBF1" "SOX4" "HLA-E" "AIF1"
## [21] "HLA-DRA" "HLA-DRB1" "HLA-DPA1" "HLA-DPB1"
## [25] "CD24" "ENSG00000287092" "AUTS2" "CDK6"
## [29] "KMT2E" "RPS6" "APBB1IP" "LINC01374"
## [33] "DNTT" "RPS3" "GAPDH" "ARHGDIB"
## [37] "SOCS2" "RPL21" "FOXO1" "FOXN3"
## [41] "RPS2" "RPS15A" "PRKCB" "TERF2"
## [45] "RPL13" "SNHG29" "RPL23A" "MSI2"
## [49] "RPL17" "RPS19" "FTL" "RPL13A"
## [53] "PLCB1" "ERG" "XBP1" "CD99"
## [57] "TMSB4X"
##
## $`2`
## [1] "STMN1" "HMGN2" "RCSD1" "YWHAQ" "TMSB10" "PTMA" "TRA2B"
## [8] "H2AZ1" "RPS3A" "HMGB2" "SSBP2" "CD74" "EBF1" "TUBB"
## [15] "HLA-DRA" "BACH2" "CD24" "AKAP12" "AUTS2" "MCM7" "STRBP"
## [22] "SET" "VIM" "CFL1" "RPS3" "GAPDH" "TUBA1B" "NAP1L1"
## [29] "HMGB1" "IGHM" "PCLAF" "KPNB1" "ACTG1" "TYMS" "UHRF1"
## [36] "HMGN1" "IGLL1" "TMSB4X"
##
## $`3`
## [1] "RCSD1" "ARHGAP15" "FOXP1" "CBLB" "ZBTB20"
## [6] "MME" "PDS5A" "LEF1" "GAB1" "SSBP2"
## [11] "MEF2C" "CD74" "EBF1" "STK10" "CASC15"
## [16] "CD2AP" "AKAP12" "AUTS2" "CALN1" "KMT2E"
## [21] "LINC-PINT" "PSD3" "PAG1" "UBR5" "ST3GAL1"
## [26] "DOCK8" "CEMIP2" "HBB" "MALAT1" "FCHSD2"
## [31] "GAB2" "MAML2" "PAN3" "FOXO1" "ARHGEF7"
## [36] "INO80" "RAB11A" "ARIH1" "MSI2" "CYTH1"
## [41] "RNF125" "TCF4" "GNG7" "INSR" "ZNF350-AS1"
## [46] "LARGE1" "MT-ND2" "MT-CO1" "MT-CO3" "MT-ND3"
## [51] "MT-CYB"
##
## $`4`
## [1] "CD52" "RPS27" "FCRL1" "RALGPS2" "ANGPTL1" "TMSB10"
## [7] "AFF3" "ARHGAP15" "BANK1" "RPL34" "RPS3A" "CD74"
## [13] "HLA-DRA" "HLA-DRB1" "HLA-DQB1" "HLA-DPA1" "HLA-DPB1" "RPS18"
## [19] "BACH2" "ADK" "MS4A1" "MALAT1" "FCHSD2" "RPL41"
## [25] "BTG1" "RPL21" "RPS29" "IGHD" "IGHM" "RPS2"
## [31] "PRKCB" "RPL13" "RPL26" "RPL18A" "CD79A" "FTL"
## [37] "CD37" "RPS5" "TMSB4X" "RPL39"
##
## $`5`
## [1] "RPS27" "PTPRC" "TMSB10" "ARHGAP15" "ANKRD44" "RPL32"
## [7] "FOXP1" "LEF1" "RPL34" "RPS3A" "FYB1" "CAMK4"
## [13] "RPS14" "LTB" "RPS18" "BACH2" "LINC-PINT" "RPL7"
## [19] "RPS6" "IFITM1" "RPLP2" "MALAT1" "MAML2" "CD3E"
## [25] "CD3D" "RPL41" "BTG1" "RPL21" "KLF12" "TRAC"
## [31] "RPS29" "PRKCH" "BCL11B" "B2M" "RPS2" "IL32"
## [37] "RPL13" "RPL26" "SKAP1" "RPS15" "RPS28" "RPS5"
## [43] "TMSB4X" "RPL10"
##
## $`6`
## [1] "CD52" "S100A4" "CD247" "PTPRC" "DUSP2" "RPL31"
## [7] "ARHGAP15" "CNOT6L" "RPL34" "RPS3A" "GZMA" "RPS14"
## [13] "HLA-A" "HLA-B" "FYN" "TNFAIP3" "KMT2E" "LINC-PINT"
## [19] "TRBC1" "SRGN" "IFITM1" "CD3E" "CD3D" "CD69"
## [25] "KLRD1" "PRKCH" "B2M" "RPS2" "IL32" "CCL5"
## [31] "SKAP1" "PITPNC1" "RPS28" "MYO1F" "HCST" "NKG7"
## [37] "CST7" "ITGB2" "TMSB4X" "RPL10"
##
## $`7`
## [1] "MACO1" "TRIM58" "SEC62" "RAPGEF2" "RHAG" "MAN1A1"
## [7] "ARL4A" "BPGM" "SLC25A37" "BNIP3L" "CA1" "IFIT1B"
## [13] "HBB" "HBD" "MALAT1" "HMBS" "HECTD4" "HERC1"
## [19] "DENND4A" "HBM" "HBA2" "HBA1" "AHSP" "TERF2IP"
## [25] "SPECC1" "SLC4A1" "SLC25A39" "BLVRB" "ALAS2"
##
## $`8`
## [1] "YBX1" "UROD" "NFIA" "NUCKS1" "LBR" "GYPC"
## [7] "SMC4" "HMGB2" "DEK" "TUBB" "ANK1" "CA1"
## [13] "CA2" "SMC2" "HBB" "HBD" "FTH1" "TUBA1B"
## [19] "HMGB1" "TFDP1" "SLC25A21" "NUSAP1" "PRC1" "HBA2"
## [25] "HBA1" "AHSP" "TOP2A" "PRDX2" "UBA52" "BLVRB"
## [31] "FTL" "ATP5F1E" "ALAS2"
##
## $`9`
## [1] "SEC62" "SNCA" "RPS12" "SLC25A37" "BNIP3L" "NCOA4"
## [7] "HBB" "HBD" "IFI27" "HBA2" "HBA1" "AHSP"
## [13] "UBB" "OAZ1" "UBA52" "ATP5F1E" "ALAS2"
##
## $`10`
## [1] "S100A11" "S100A9" "S100A6" "S100A4"
## [5] "MNDA" "FCER1G" "TMSB10" "LRRFIP1"
## [9] "CSTA" "RPS3A" "ARHGAP26" "LST1"
## [13] "AIF1" "ACTB" "SNX10" "LYN"
## [17] "RPL7" "VIM" "SRGN" "GAPDH"
## [21] "LYZ" "ENSG00000257764" "RPS2" "COTL1"
## [25] "CYBA" "RPS28" "TYROBP" "FTL"
## [29] "CST3" "LGALS1" "TMSB4X"
##
## $`11`
## [1] "STMN1" "RPS27" "PRKCE" "TMSB10" "AFF3" "RPL31" "ZEB2"
## [8] "PTMA" "MME" "CD38" "ATP8A1" "RPL34" "RPS3A" "PDE4D"
## [15] "CD74" "CYFIP2" "EBF1" "SOX4" "HLA-DRA" "BACH2" "PAX5"
## [22] "SYK" "RPS24" "MALAT1" "BCL7A" "RUBCNL" "PCDH9" "TCL1A"
## [29] "IGHM" "B2M" "ARIH1" "ACSM3" "PRKCB" "CD79B" "RPS28"
## [36] "NIBAN3" "CD37" "RPL13A" "IGLL5" "VPREB3" "RPL10"
##
## $`12`
## [1] "YBX1" "BCL11A" "RPL31" "BARD1"
## [5] "ITM2C" "RBM47" "JCHAIN" "RUFY3"
## [9] "PLAC8" "FHIP1A" "CD74" "HLA-DRA"
## [13] "RUNX2" "SNX9" "LYN" "COX6C"
## [17] "ENSG00000225885" "GNAQ" "TXN" "IRF7"
## [21] "FCHSD2" "RPS25" "CD4" "C12orf75"
## [25] "SLC15A4" "FLT3" "ALOX5AP" "RNASE6"
## [29] "IRF8" "P4HB" "MYL12B" "TCF4"
## [33] "PTPRS" "RPS28" "LILRA4" "APP"
## [37] "CSF2RA" "PLP2"
If we took some time to examine this list (which would benefit from knowing about the underlying biology of the immune system), we can start to see some genes known to differentiate different types of cells:
Let’s visualise these markers’ expression in our clusters:
known_genes <- c(
"HBA1", # erythrocytes
"CST3", # monocytes
"CD3E", # T cells
"NKG7", # NK T cells
"CD79A", # B cells
"MS4A1" # CD20 B cells
)
# violin plot
plotExpression(sce, x = "label", features = known_genes)
# scaled heatmap of expression
plotGroupedHeatmap(sce,
features = known_genes,
group = "label",
block = "SampleGroup",
scale = TRUE, center = TRUE,
zlim = c(-3, 3))
Based on the expression patterns for these cells, we classify these clusters as follows:
Cluster | Labelled Cell Type | Evidence |
---|---|---|
1 | B cells | CD79A |
2 | B cells | CD79A |
3 | B cells | CD79A |
4 | B cells | CD79A |
5 | CD20+ B cells | CD79A + MS4A1 |
6 | T cells | CD3D |
7 | NK T cells | CD3D + NKG7 |
8 | Erythrocytes | HBA1 |
9 | Erythrocytes | HBA1 |
10 | Erythrocytes | HBA1 |
11 | Monocytes | CST3 |
12 | B cells | CD79A |
Now that we have a more meaningful annotation for our clusters, let’s
add this to our SingleCellExperiment
object. We will also
add the original cluster ID in parenthesis to remind ourselves that this
annotation was done based on the clusters.
The cell labels are stored in the SingleCellExperiment
object as a factor (a type of object in R to store categorical
data), and so we can change the labels using the levels()
function, like so:
levels(colLabels(sce)) <- c("B (c1)", "B (c2)",
"B (c3)", "B (c4)",
"CD20+ B (c5)",
"T (c6)", "NK T (c7)",
"Erythrocytes (c8)", "Erythrocytes (c9)",
"Erythrocytes c(10)",
"Monocytes (c11)", "B (c12)")
Now, when we label our UMAP, we can see the new labels, which are more intutitive to interpret:
plotReducedDim(sce, dimred = "UMAP_corrected",
colour_by = "label", text_by = "label")
Looking at the expression of HBA1 and HBA2:
plotExpression(sce, x = "label", features = c("HBA1", "HBA2")) +
scale_x_discrete(guide = guide_axis(angle = 45))
You may notice that there is a lot of background expression across several cell clusters. HBA1 and HBA2 are common components of the “soup” or ambient RNA in scRNA-seq experiments involving blood cells. Hemoglobin chains, such as HBA1 and HBA2, are very highly expressed in red blood cells and burst red blood cells will contribute their RNA to the medium from which the cells are loaded into the 10X Chromium machine. Some of this medium, or “soup”, containing ambient RNA is captured with each cell. There are methods available to correct for soup in your analysis such as SoupX.
Our simple manual annotation wasn’t very conclusive about cluster 12. While it expresses the CD79A B-cell marker, it also appears to be quite separate from other B-cell clusters on our UMAP.
plotReducedDim(sce, dimred = "UMAP_corrected",
colour_by = "CD79A", text_by = "label")
This is also the case for cluster 5, however we could see that it likely represents CD20+ B-cells, which explains its separate clustering. However, we didn’t have any specific gene in our small list that distinguishes cluster 12 from the other B-cell clusters.
We could look at our list of top markers and identify any that are unique to this cluster:
setdiff(top_markers_all[[12]], unlist(top_markers_all[1:11]))
## [1] "BCL11A" "BARD1" "ITM2C" "RBM47"
## [5] "JCHAIN" "RUFY3" "PLAC8" "FHIP1A"
## [9] "RUNX2" "SNX9" "COX6C" "ENSG00000225885"
## [13] "GNAQ" "TXN" "IRF7" "RPS25"
## [17] "CD4" "C12orf75" "SLC15A4" "FLT3"
## [21] "ALOX5AP" "RNASE6" "IRF8" "P4HB"
## [25] "MYL12B" "PTPRS" "LILRA4" "APP"
## [29] "CSF2RA" "PLP2"
And use this list to further investigate the specific properties of this cluster. For example, we can see that CD38 (another “cluster of differentiation” gene) is expressed highly in this cluster:
plotExpression(sce, x = "label",
features = "CD38") +
scale_x_discrete(guide = guide_axis(angle = 45))
One thing to note is that this cluster only seems to contain cells from PBMMC samples:
table(sce$SampleGroup, sce$label)
##
## B (c1) B (c2) B (c3) B (c4) CD20+ B (c5) T (c6) NK T (c7)
## ETV6-RUNX1 1188 284 49 71 218 38 56
## PBMMC 106 132 9 138 296 103 62
##
## Erythrocytes (c8) Erythrocytes (c9) Erythrocytes c(10)
## ETV6-RUNX1 26 65 5
## PBMMC 90 77 209
##
## Monocytes (c11) B (c12)
## ETV6-RUNX1 0 0
## PBMMC 263 15
Therefore, it suggests there are absent from our cancer blood samples.
The difficulty in annotating cluster 12 exemplifies the limitation of manual cell annotation, which can become quite laborious and limited in its ability to classify cells.
Also, we should keep in mind that perhaps our clustering wasn’t ideal, there may have been technical issues during normalisation and dataset integration, which we should investigate (e.g. by producing UMAP and clustering from different normalisation methods).
sessionInfo()
devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.3.3 (2024-02-29)
## os Ubuntu 22.04.4 LTS
## system x86_64, linux-gnu
## ui X11
## language (EN)
## collate en_US.UTF-8
## ctype en_US.UTF-8
## tz Etc/UTC
## date 2024-04-15
## pandoc 3.1.12.3 @ /opt/miniforge3/envs/R/bin/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date (UTC) lib source
## abind 1.4-5 2016-07-21 [2] CRAN (R 4.3.0)
## beachmat 2.18.0 2023-10-24 [2] Bioconductor
## beeswarm 0.4.0 2021-06-01 [2] CRAN (R 4.3.0)
## Biobase * 2.62.0 2023-10-24 [2] Bioconductor
## BiocGenerics * 0.48.1 2023-11-01 [2] Bioconductor
## BiocNeighbors 1.20.0 2023-10-24 [2] Bioconductor
## BiocParallel 1.36.0 2023-10-24 [2] Bioconductor
## BiocSingular 1.18.0 2023-10-24 [2] Bioconductor
## bitops 1.0-7 2021-04-24 [2] CRAN (R 4.3.0)
## bluster 1.12.0 2023-10-24 [2] Bioconductor
## bslib 0.6.1 2023-11-28 [2] CRAN (R 4.3.2)
## cachem 1.0.8 2023-05-01 [2] CRAN (R 4.3.0)
## cli 3.6.2 2023-12-11 [2] CRAN (R 4.3.2)
## cluster 2.1.6 2023-12-01 [2] CRAN (R 4.3.2)
## codetools 0.2-19 2023-02-01 [2] CRAN (R 4.3.0)
## colorspace 2.1-0 2023-01-23 [2] CRAN (R 4.3.0)
## cowplot 1.1.3 2024-01-22 [2] CRAN (R 4.3.2)
## crayon 1.5.2 2022-09-29 [2] CRAN (R 4.3.0)
## DelayedArray 0.28.0 2023-10-24 [2] Bioconductor
## DelayedMatrixStats 1.24.0 2023-10-24 [2] Bioconductor
## devtools 2.4.5 2022-10-11 [2] CRAN (R 4.3.0)
## digest 0.6.35 2024-03-11 [2] CRAN (R 4.3.3)
## dplyr * 1.1.4 2023-11-17 [2] CRAN (R 4.3.2)
## dqrng 0.3.2 2023-11-29 [2] CRAN (R 4.3.2)
## edgeR 4.0.2 2023-11-19 [2] Bioconductor 3.18 (R 4.3.2)
## ellipsis 0.3.2 2021-04-29 [2] CRAN (R 4.3.0)
## evaluate 0.23 2023-11-01 [2] CRAN (R 4.3.1)
## fansi 1.0.6 2023-12-08 [2] CRAN (R 4.3.2)
## farver 2.1.1 2022-07-06 [2] CRAN (R 4.3.0)
## fastmap 1.1.1 2023-02-24 [2] CRAN (R 4.3.0)
## forcats * 1.0.0 2023-01-29 [2] CRAN (R 4.3.0)
## fs 1.6.3 2023-07-20 [2] CRAN (R 4.3.1)
## generics 0.1.3 2022-07-05 [2] CRAN (R 4.3.0)
## GenomeInfoDb * 1.38.1 2023-11-08 [2] Bioconductor
## GenomeInfoDbData 1.2.11 2024-03-19 [2] Bioconductor
## GenomicRanges * 1.54.1 2023-10-29 [2] Bioconductor
## ggbeeswarm 0.7.2 2023-04-29 [2] CRAN (R 4.3.0)
## ggplot2 * 3.5.0 2024-02-23 [2] CRAN (R 4.3.2)
## ggrepel 0.9.5 2024-01-10 [2] CRAN (R 4.3.2)
## glue 1.7.0 2024-01-09 [2] CRAN (R 4.3.2)
## gridExtra 2.3 2017-09-09 [2] CRAN (R 4.3.0)
## gtable 0.3.4 2023-08-21 [2] CRAN (R 4.3.1)
## highr 0.10 2022-12-22 [2] CRAN (R 4.3.0)
## hms 1.1.3 2023-03-21 [2] CRAN (R 4.3.0)
## htmltools 0.5.7 2023-11-03 [2] CRAN (R 4.3.2)
## htmlwidgets 1.6.4 2023-12-06 [2] CRAN (R 4.3.2)
## httpuv 1.6.14 2024-01-26 [2] CRAN (R 4.3.2)
## igraph 2.0.2 2024-02-17 [2] CRAN (R 4.3.2)
## IRanges * 2.36.0 2023-10-24 [2] Bioconductor
## irlba 2.3.5.1 2022-10-03 [2] CRAN (R 4.3.3)
## jquerylib 0.1.4 2021-04-26 [2] CRAN (R 4.3.0)
## jsonlite 1.8.8 2023-12-04 [2] CRAN (R 4.3.2)
## knitr 1.45 2023-10-30 [2] CRAN (R 4.3.2)
## labeling 0.4.3 2023-08-29 [2] CRAN (R 4.3.1)
## later 1.3.2 2023-12-06 [2] CRAN (R 4.3.2)
## lattice 0.22-5 2023-10-24 [2] CRAN (R 4.3.1)
## lifecycle 1.0.4 2023-11-07 [2] CRAN (R 4.3.2)
## limma 3.58.1 2023-10-31 [2] Bioconductor
## locfit 1.5-9.9 2024-03-01 [2] CRAN (R 4.3.3)
## lubridate * 1.9.3 2023-09-27 [2] CRAN (R 4.3.1)
## magrittr 2.0.3 2022-03-30 [2] CRAN (R 4.3.0)
## Matrix 1.6-5 2024-01-11 [2] CRAN (R 4.3.2)
## MatrixGenerics * 1.14.0 2023-10-24 [2] Bioconductor
## matrixStats * 1.2.0 2023-12-11 [2] CRAN (R 4.3.2)
## memoise 2.0.1 2021-11-26 [2] CRAN (R 4.3.0)
## metapod 1.10.0 2023-10-24 [2] Bioconductor
## mime 0.12 2021-09-28 [2] CRAN (R 4.3.0)
## miniUI 0.1.1.1 2018-05-18 [2] CRAN (R 4.3.0)
## munsell 0.5.0 2018-06-12 [2] CRAN (R 4.3.0)
## patchwork * 1.2.0 2024-01-08 [2] CRAN (R 4.3.2)
## pheatmap 1.0.12 2019-01-04 [2] CRAN (R 4.3.0)
## pillar 1.9.0 2023-03-22 [2] CRAN (R 4.3.0)
## pkgbuild 1.4.4 2024-03-17 [2] CRAN (R 4.3.3)
## pkgconfig 2.0.3 2019-09-22 [2] CRAN (R 4.3.0)
## pkgload 1.3.4 2024-01-16 [2] CRAN (R 4.3.2)
## profvis 0.3.8 2023-05-02 [2] CRAN (R 4.3.1)
## promises 1.2.1 2023-08-10 [2] CRAN (R 4.3.1)
## purrr * 1.0.2 2023-08-10 [2] CRAN (R 4.3.1)
## R6 2.5.1 2021-08-19 [2] CRAN (R 4.3.0)
## RColorBrewer 1.1-3 2022-04-03 [2] CRAN (R 4.3.0)
## Rcpp 1.0.12 2024-01-09 [2] CRAN (R 4.3.2)
## RCurl 1.98-1.14 2024-01-09 [2] CRAN (R 4.3.2)
## readr * 2.1.5 2024-01-10 [2] CRAN (R 4.3.2)
## remotes 2.5.0 2024-03-17 [2] CRAN (R 4.3.3)
## rlang 1.1.3 2024-01-10 [2] CRAN (R 4.3.2)
## rmarkdown 2.26 2024-03-05 [2] CRAN (R 4.3.3)
## rstudioapi 0.15.0 2023-07-07 [2] CRAN (R 4.3.0)
## rsvd 1.0.5 2021-04-16 [2] CRAN (R 4.3.0)
## S4Arrays 1.2.0 2023-10-24 [2] Bioconductor
## S4Vectors * 0.40.2 2023-11-23 [2] Bioconductor 3.18 (R 4.3.2)
## sass 0.4.9 2024-03-15 [2] CRAN (R 4.3.3)
## ScaledMatrix 1.10.0 2023-10-24 [2] Bioconductor
## scales 1.3.0 2023-11-28 [2] CRAN (R 4.3.2)
## scater * 1.30.1 2023-11-16 [2] Bioconductor
## scran * 1.30.0 2023-10-24 [2] Bioconductor
## scuttle * 1.12.0 2023-10-24 [2] Bioconductor
## sessioninfo 1.2.2 2021-12-06 [2] CRAN (R 4.3.0)
## shiny 1.8.0 2023-11-17 [2] CRAN (R 4.3.2)
## SingleCellExperiment * 1.24.0 2023-10-24 [2] Bioconductor
## SparseArray 1.2.2 2023-11-07 [2] Bioconductor
## sparseMatrixStats 1.14.0 2023-10-24 [2] Bioconductor
## statmod 1.5.0 2023-01-06 [2] CRAN (R 4.3.0)
## stringi 1.8.3 2023-12-11 [2] CRAN (R 4.3.2)
## stringr * 1.5.1 2023-11-14 [2] CRAN (R 4.3.2)
## SummarizedExperiment * 1.32.0 2023-10-24 [2] Bioconductor
## tibble * 3.2.1 2023-03-20 [2] CRAN (R 4.3.0)
## tidyr * 1.3.1 2024-01-24 [2] CRAN (R 4.3.2)
## tidyselect 1.2.0 2022-10-10 [2] CRAN (R 4.3.0)
## tidyverse * 2.0.0 2023-02-22 [2] CRAN (R 4.3.0)
## timechange 0.3.0 2024-01-18 [2] CRAN (R 4.3.2)
## tzdb 0.4.0 2023-05-12 [2] CRAN (R 4.3.0)
## urlchecker 1.0.1 2021-11-30 [2] CRAN (R 4.3.0)
## usethis 2.2.3 2024-02-19 [2] CRAN (R 4.3.2)
## utf8 1.2.4 2023-10-22 [2] CRAN (R 4.3.1)
## vctrs 0.6.5 2023-12-01 [2] CRAN (R 4.3.2)
## vipor 0.4.7 2023-12-18 [2] CRAN (R 4.3.2)
## viridis 0.6.5 2024-01-29 [2] CRAN (R 4.3.2)
## viridisLite 0.4.2 2023-05-02 [2] CRAN (R 4.3.0)
## withr 3.0.0 2024-01-16 [2] CRAN (R 4.3.2)
## xfun 0.42 2024-02-08 [2] CRAN (R 4.3.2)
## xtable 1.8-4 2019-04-21 [2] CRAN (R 4.3.0)
## XVector 0.42.0 2023-10-24 [2] Bioconductor
## yaml 2.3.8 2023-12-11 [2] CRAN (R 4.3.2)
## zlibbioc 1.48.0 2023-10-24 [2] Bioconductor
##
## [1] /Users/sawle01/R/x86_64-conda-linux-gnu-library/4.3
## [2] /opt/miniforge3/envs/R/lib/R/library
##
## ──────────────────────────────────────────────────────────────────────────────