The phenoptr::count_touching_cells function finds, counts and visualizes touching cells of multiple phenotypes in a single field.

This vignette gives an example of counting touches in multiple fields and aggregating across slides. This vignette does not create visualizations of the touching cells; the comments show how to change this.


Count touching cells in multiple fields

This example counts touches for the nine fields included in this package.

library(phenoptr)
library(tidyverse)

# Find cell seg data files
base_path <- system.file("extdata", "samples", package = "phenoptrExamples")
files <- list_cell_seg_files(base_path)

# The phenotype pairs to locate. This will find CD8 cells touching
# tumor cells, and, separately, CD8 cells touching CD68 cells.
pairs <- list(c("CD8+", "CK+"),
             c("CD8+", "CD68+"))

# Colors for all the phenotypes mentioned in pairs
colors <- list(
  'CD8+' = 'yellow',
  'CK+' = 'cyan',
  'CD68+' = 'magenta'
)

# Set this true to write images in the same directory as the data files
write_images <- FALSE

# Count touching cells
touch_counts <- purrr::map_df(files, function(path) {
  count_touching_cells(path, pairs, colors, write_images=write_images)
})

glimpse(touch_counts)
## Observations: 18
## Variables: 9
## $ slide_id    <chr> "Set12_20-6plex", "Set12_20-6plex", "Set12_20-6ple...
## $ source      <chr> "Set12_20-6plex_[14146,53503]", "Set12_20-6plex_[1...
## $ phenotype1  <chr> "CD8+", "CD8+", "CD8+", "CD8+", "CD8+", "CD8+", "C...
## $ phenotype2  <chr> "CK+", "CD68+", "CK+", "CD68+", "CK+", "CD68+", "C...
## $ total1      <int> 101, 101, 123, 123, 79, 79, 497, 497, 349, 349, 22...
## $ total2      <int> 2323, 557, 2367, 87, 3799, 344, 1731, 599, 1434, 1...
## $ p1_touch_p2 <int> 27, 22, 67, 8, 28, 19, 127, 122, 156, 28, 95, 48, ...
## $ p2_touch_p1 <int> 58, 29, 138, 6, 69, 21, 210, 133, 238, 24, 148, 48...
## $ touch_pairs <int> 63, 31, 151, 8, 73, 22, 258, 163, 289, 32, 177, 56...

Aggregate per slide

The counts are easily aggregated over Slide ID using dplyr::group_by and dplyr::summarize_at:

touch_counts %>% group_by(slide_id, phenotype1, phenotype2) %>% 
  summarize_at(vars(total1:touch_pairs), sum)
## # A tibble: 6 x 8
## # Groups:   slide_id, phenotype1 [?]
##         slide_id phenotype1 phenotype2 total1 total2 p1_touch_p2 p2_touch_p1 touch_pairs
##            <chr>      <chr>      <chr>  <int>  <int>       <int>       <int>       <int>
## 1 Set12_20-6plex       CD8+      CD68+    303    988          49          56          61
## 2 Set12_20-6plex       CD8+        CK+    303   8489         122         265         287
## 3   Set4_1-6plex       CD8+      CD68+   1074   1128         198         205         251
## 4   Set4_1-6plex       CD8+        CK+   1074   5422         378         596         724
## 5  Set8_11-6plex       CD8+      CD68+    514   1258         108         124         136
## 6  Set8_11-6plex       CD8+        CK+    514   5452         134         228         250