Author: Mariano J. Alvarez
Date: 2026-04-30

# scRNASeq HNSC data using Bioconductor’s ExperimentHub

Mariano J. Alvarez

#### 30 April 2026

# Contents

# 1 Accessing human HNSC scRNASeq data using Bioconductor’s ExperimentHub

Transcripts per million (TPM) single cell RNA-Seq data for 5,902 cells from 18 patients–oral cavity head and neck squamous cell carcinoma (HNSC)– are available from GEO GSE103322. These data are also available as a SingleCellExpression from ExperimentHub.

In the example below, we show how this dataset can be dwnloaded from ExperimentHub.

    library(ExperimentHub)

    ## Loading required package: BiocGenerics

    ## Loading required package: generics

    ##
    ## Attaching package: 'generics'

    ## The following objects are masked from 'package:base':
    ##
    ##     as.difftime, as.factor, as.ordered, intersect, is.element, setdiff,
    ##     setequal, union

    ##
    ## Attaching package: 'BiocGenerics'

    ## The following objects are masked from 'package:stats':
    ##
    ##     IQR, mad, sd, var, xtabs

    ## The following objects are masked from 'package:base':
    ##
    ##     Filter, Find, Map, Position, Reduce, anyDuplicated, aperm, append,
    ##     as.data.frame, basename, cbind, colnames, dirname, do.call,
    ##     duplicated, eval, evalq, get, grep, grepl, is.unsorted, lapply,
    ##     mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int,
    ##     rank, rbind, rownames, sapply, saveRDS, table, tapply, unique,
    ##     unsplit, which.max, which.min

    ## Loading required package: AnnotationHub

    ## Loading required package: BiocFileCache

    ## Loading required package: dbplyr

    library(SingleCellExperiment)

    ## Loading required package: SummarizedExperiment

    ## Loading required package: MatrixGenerics

    ## Loading required package: matrixStats

    ##
    ## Attaching package: 'MatrixGenerics'

    ## The following objects are masked from 'package:matrixStats':
    ##
    ##     colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
    ##     colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
    ##     colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
    ##     colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
    ##     colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
    ##     colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
    ##     colWeightedMeans, colWeightedMedians, colWeightedSds,
    ##     colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
    ##     rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
    ##     rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
    ##     rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
    ##     rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
    ##     rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
    ##     rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
    ##     rowWeightedSds, rowWeightedVars

    ## Loading required package: GenomicRanges

    ## Loading required package: stats4

    ## Loading required package: S4Vectors

    ##
    ## Attaching package: 'S4Vectors'

    ## The following object is masked from 'package:utils':
    ##
    ##     findMatches

    ## The following objects are masked from 'package:base':
    ##
    ##     I, expand.grid, unname

    ## Loading required package: IRanges

    ## Loading required package: Seqinfo

    ## Loading required package: Biobase

    ## Welcome to Bioconductor
    ##
    ##     Vignettes contain introductory material; view with
    ##     'browseVignettes()'. To cite Bioconductor, see
    ##     'citation("Biobase")', and for packages 'citation("pkgname")'.

    ##
    ## Attaching package: 'Biobase'

    ## The following object is masked from 'package:MatrixGenerics':
    ##
    ##     rowMedians

    ## The following objects are masked from 'package:matrixStats':
    ##
    ##     anyMissing, rowMedians

    ## The following object is masked from 'package:ExperimentHub':
    ##
    ##     cache

    ## The following object is masked from 'package:AnnotationHub':
    ##
    ##     cache

    eh = ExperimentHub()
    dset <- query(eh , "GSE103322")
    dset

    ## ExperimentHub with 1 record
    ## # snapshotDate(): 2026-04-23
    ## # names(): EH5419
    ## # package(): GSE103322
    ## # $dataprovider: GEO
    ## # $species: Homo sapiens
    ## # $rdataclass: SingleCellExperiment
    ## # $rdatadateadded: 2021-03-04
    ## # $title: Single cell RNA-seq data for human head and neck squamous cell car...
    ## # $description: scRNA-Sequencing data and metadata for 5902 cells  from 18 p...
    ## # $taxonomyid: 9606
    ## # $genome: hg19
    ## # $sourcetype: tar.gz
    ## # $sourceurl: http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE103322
    ## # $sourcesize: NA
    ## # $tags: c("CancerData", "DNASeqData", "ExpressionData", "Genome",
    ## #   "GEO", "Homo_sapiens_Data", "RNASeqData", "SingleCellData")
    ## # retrieve record with 'object[["EH5419"]]'

One can then extract the data for this using

    sce <- dset[[1]]

    ## Setting options('download.file.method.GEOquery'='auto')

    ## Setting options('GEOquery.inmemory.gpl'=FALSE)

    ## see ?GSE103322 and browseVignettes('GSE103322') for documentation

    ## loading from cache

## 1.1 Exploring the metadata

The metadata is available from the SingleCellExpression object with

    head(SummarizedExperiment::colData(sce))

    ## DataFrame with 6 rows and 5 columns
    ##                        processed.by.Maxima.enzyme  Lymph.node
    ##                                       <character> <character>
    ## HN28_P15_D06_S330_comb                          1           1
    ## HN28_P6_G05_S173_comb                           1           0
    ## HN26_P14_D11_S239_comb                          1           1
    ## HN26_P14_H05_S281_comb                          1           1
    ## HN26_P25_H09_S189_comb                          1           1
    ## HN26_P14_H06_S282_comb                          1           1
    ##                        classified..as.cancer.cell
    ##                                       <character>
    ## HN28_P15_D06_S330_comb                          0
    ## HN28_P6_G05_S173_comb                           0
    ## HN26_P14_D11_S239_comb                          1
    ## HN26_P14_H05_S281_comb                          0
    ## HN26_P25_H09_S189_comb                          1
    ## HN26_P14_H06_S282_comb                          1
    ##                        classified.as.non.cancer.cells non.cancer.cell.type
    ##                                           <character>          <character>
    ## HN28_P15_D06_S330_comb                              1           Fibroblast
    ## HN28_P6_G05_S173_comb                               1           Fibroblast
    ## HN26_P14_D11_S239_comb                              0                    0
    ## HN26_P14_H05_S281_comb                              1           Fibroblast
    ## HN26_P25_H09_S189_comb                              0                    0
    ## HN26_P14_H06_S282_comb                              0                    0

For example, to obtain the number of cells classified as non-tumor types

    table(SummarizedExperiment::colData(sce)$non.cancer.cell.type)

    ##
    ## -Fibroblast           0      B cell   Dendritic Endothelial  Fibroblast
    ##          18        2539         138          51         260        1422
    ##  Macrophage        Mast      T cell     myocyte
    ##          98         120        1237          19

## 1.2 Extracting the data

The data can be extracted from the SingleCellExpression object with

    dset <- SummarizedExperiment::assays(sce)$TPM
    dim(dset)

    ## [1] 21341  5902

    dset[1:4, 1:3]

    ##        HN28_P15_D06_S330_comb HN28_P6_G05_S173_comb HN26_P14_D11_S239_comb
    ## 401546                 0.0000                0.0000                0.42761
    ## 6205                   6.0037                7.3006                7.28850
    ## 63916                  0.0000                0.0000                0.00000
    ## 90993                  0.0000                0.0000                0.00000

# 2 sessionInfo()

    sessionInfo()

    ## R version 4.6.0 RC (2026-04-17 r89917)
    ## Platform: x86_64-pc-linux-gnu
    ## Running under: Ubuntu 24.04.4 LTS
    ##
    ## Matrix products: default
    ## BLAS:   /home/biocbuild/bbs-3.24-bioc/R/lib/libRblas.so
    ## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0
    ##
    ## locale:
    ##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
    ##  [3] LC_TIME=en_GB              LC_COLLATE=C
    ##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
    ##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
    ##  [9] LC_ADDRESS=C               LC_TELEPHONE=C
    ## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
    ##
    ## time zone: America/New_York
    ## tzcode source: system (glibc)
    ##
    ## attached base packages:
    ## [1] stats4    stats     graphics  grDevices utils     datasets  methods
    ## [8] base
    ##
    ## other attached packages:
    ##  [1] GSE103322_1.19.0            GEOquery_2.81.0
    ##  [3] SingleCellExperiment_1.35.0 SummarizedExperiment_1.43.0
    ##  [5] Biobase_2.73.1              GenomicRanges_1.65.0
    ##  [7] Seqinfo_1.3.0               IRanges_2.47.0
    ##  [9] S4Vectors_0.51.1            MatrixGenerics_1.25.0
    ## [11] matrixStats_1.5.0           ExperimentHub_3.3.0
    ## [13] AnnotationHub_4.3.0         BiocFileCache_3.3.0
    ## [15] dbplyr_2.5.2                BiocGenerics_0.59.0
    ## [17] generics_0.1.4              BiocStyle_2.41.0
    ##
    ## loaded via a namespace (and not attached):
    ##  [1] KEGGREST_1.53.0      xfun_0.57            bslib_0.10.0
    ##  [4] httr2_1.2.2          lattice_0.22-9       tzdb_0.5.0
    ##  [7] vctrs_0.7.3          tools_4.6.0          curl_7.1.0
    ## [10] tibble_3.3.1         AnnotationDbi_1.75.0 RSQLite_2.4.6
    ## [13] blob_1.3.0           pkgconfig_2.0.3      Matrix_1.7-5
    ## [16] data.table_1.18.2.1  rentrez_1.2.4        lifecycle_1.0.5
    ## [19] compiler_4.6.0       Biostrings_2.81.0    statmod_1.5.1
    ## [22] htmltools_0.5.9      sass_0.4.10          yaml_2.3.12
    ## [25] tidyr_1.3.2          pillar_1.11.1        crayon_1.5.3
    ## [28] jquerylib_0.1.4      limma_3.69.0         DelayedArray_0.39.0
    ## [31] cachem_1.1.0         abind_1.4-8          tidyselect_1.2.1
    ## [34] digest_0.6.39        purrr_1.2.2          dplyr_1.2.1
    ## [37] bookdown_0.46        BiocVersion_3.24.0   fastmap_1.2.0
    ## [40] grid_4.6.0           SparseArray_1.13.0   cli_3.6.6
    ## [43] magrittr_2.0.5       S4Arrays_1.13.0      XML_3.99-0.23
    ## [46] readr_2.2.0          withr_3.0.2          filelock_1.0.3
    ## [49] rappdirs_0.3.4       bit64_4.8.0          rmarkdown_2.31
    ## [52] XVector_0.53.0       httr_1.4.8           bit_4.6.0
    ## [55] otel_0.2.0           hms_1.1.4            png_0.1-9
    ## [58] memoise_2.0.1        evaluate_1.0.5       knitr_1.51
    ## [61] rlang_1.2.0          glue_1.8.1           DBI_1.3.0
    ## [64] xml2_1.5.2           BiocManager_1.30.27  jsonlite_2.0.0
    ## [67] R6_2.6.1