count: Count Available Isolates

countR Documentation

Count Available Isolates

Description

These functions can be used to count resistant/susceptible microbial isolates. All functions support quasiquotation with pipes, can be used in summarise() from the dplyr package and also support grouped variables, see Examples.

count_resistant() should be used to count resistant isolates, count_susceptible() should be used to count susceptible isolates.

Usage

count_resistant(
  ...,
  only_all_tested = FALSE,
  guideline = getOption("AMR_guideline", "EUCAST")
)

count_susceptible(
  ...,
  only_all_tested = FALSE,
  guideline = getOption("AMR_guideline", "EUCAST")
)

count_S(..., only_all_tested = FALSE)

count_SI(..., only_all_tested = FALSE)

count_I(..., only_all_tested = FALSE)

count_IR(..., only_all_tested = FALSE)

count_R(..., only_all_tested = FALSE)

count_all(..., only_all_tested = FALSE)

n_sir(..., only_all_tested = FALSE)

count_df(
  data,
  translate_ab = "name",
  language = get_AMR_locale(),
  combine_SI,
  guideline = getOption("AMR_guideline", "EUCAST")
)

Arguments

...

One or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with as.sir() if needed.

only_all_tested

(for combination therapies, i.e. using more than one variable for ...): a logical to indicate that isolates must be tested for all antimicrobials, see section Combination Therapy below. Use sir_combine() to create a new variable for a combination therapy.

guideline

A guideline name, "EUCAST" or "CLSI" (or any version thereof, e.g. "CLSI 2025"), to determine whether the 'I' category is considered susceptible (EUCAST) or resistant (CLSI). The default is the package option AMR_guideline, or "EUCAST" if it is not set. For functions that return results per category, i.e., count_df(), proportion_df(), sir_df(), ggplot_sir(), geom_sir(), and labels_sir_count(), this can also be NULL or FALSE to keep S, I, and R separate. See section Interpretation of SIR below.

data

A data.frame containing columns with class sir (see as.sir()).

translate_ab

A column name of the antimicrobials data set to translate the antibiotic abbreviations to, using ab_property().

language

Language of the returned text - the default is the current system language (see get_AMR_locale()) and can also be set with the package option AMR_locale. Use language = NULL or language = "" to prevent translation.

combine_SI

(deprecated in favour of guideline) A logical. If set, it takes precedence over guideline: TRUE merges S, SDD, and I into "SI" vs. "R", and FALSE keeps S, I, and R separate.

Details

These functions are meant to count isolates. Use the resistance()/susceptibility() functions to calculate microbial resistance/susceptibility.

The function n_sir() is an alias of count_all(). They can be used to count all available isolates, i.e. where the input antimicrobial has an available result (S, I or R). For multiple antimicrobials, these are isolates with a result for any of the antimicrobials, or with only_all_tested = TRUE, for all of the antimicrobials (see Combination Therapy below). Their use is equal to dplyr's n_distinct(). For one antimicrobial, their function is equal to count_susceptible(...) + count_resistant(...).

The function count_df() takes any variable from data that has an sir class (created with as.sir()) and counts the number of S's, I's and R's. It also supports grouped variables. The function sir_df() works exactly like count_df(), but adds the percentage of S, I and R.

Value

An integer

Interpretation of SIR

In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories S, I, and R (https://www.eucast.org/bacteria/clinical-breakpoints-and-interpretation/definition-of-s-i-and-r/).

In aggregated analyses, such as proportions, counts, antibiograms, and plots, the 'I' category must be considered either susceptible or resistant. In epidemiological AMR data analysis, this follows the guideline: EUCAST considers 'I' susceptible, while CLSI considers 'I' resistant. The dose-dependent susceptibility of CLSI ('SDD') is always considered susceptible, as it equals what EUCAST defines as 'I'. All functions with a guideline argument for this purpose use these categories:

guideline Susceptible Resistant
"EUCAST" S, SDD, I, WT R, NWT, NS
"CLSI" S, SDD, WT I, R, NWT, NS

The values 'WT' (wild type) and 'NWT' (non-wild type) result from epidemiological cut-off values (ECOFFs) instead of clinical breakpoints. Since they are no clinical categories, 'WT' is always considered susceptible and 'NWT' always resistant, regardless of the guideline. The value 'NS' (non-susceptible) is always considered resistant, and 'NI' (non-interpretable) is always considered a missing result.

The guideline argument can be:

  • Left unset, to use the package option AMR_guideline, or "EUCAST" if this option is not set. In the latter case, a message is shown once per session (but not in R Markdown or Quarto documents); set the option to silence it.

  • "EUCAST", or any EUCAST version such as "EUCAST 2025", to consider 'I' susceptible, e.g., to return "SI" vs. "R" in proportion_df().

  • "CLSI", or any CLSI version such as "CLSI 2025", to consider 'I' resistant, e.g., to return "S" vs. "IR" in proportion_df().

  • NULL or FALSE, to keep S, I, and R separate. This is only possible in functions that return results per category: count_df(), proportion_df(), sir_df(), ggplot_sir(), geom_sir(), labels_sir_count(), and bug_drug_combinations(). Functions that return a single proportion or count, such as susceptibility(), count_resistant(), antibiogram(), wisca(), and format() on the result of bug_drug_combinations(), require 'I' to be considered either susceptible or resistant, and return an error.

Use susceptibility() and resistance() (or count_susceptible() and count_resistant()) to follow the guideline, or e.g. proportion_SI() and proportion_R() to be explicit regardless of the guideline.

The combine_SI argument of the functions that return results per category, antibiogram(), and wisca() is deprecated in favour of guideline. If set, it is followed literally and takes precedence over guideline.

Combination Therapy

Results are ordered from susceptible to resistant: S (and WT), SDD, I, R (and NWT, NS). With method = "most_susceptible" (in sir_combine()), the most susceptible result of the antimicrobials is returned, and with method = "most_resistant", the most resistant result. The value "NI" (non-interpretable) is considered a missing result.

A missing result can only be ignored if it cannot change the conclusion: a susceptible result for "most_susceptible", and a non-susceptible result for "most_resistant". Under EUCAST, the 'I' category is considered susceptible (susceptible, increased exposure), and under CLSI, it is not. With only_all_tested = TRUE, any missing result leads to NA.

This is an example for two antimicrobials, Drug A and Drug B, under EUCAST (the order of the antimicrobials does not matter):

-------------------------------------------------------------------------
                      Result of method =            Result of method =
                     "most_susceptible"              "most_resistant"
                   -----------------------  -----------------------------
                    only_all_tested =        only_all_tested =
 Drug A    Drug B     FALSE      TRUE          FALSE         TRUE
--------  --------  ---------  ---------    -----------  -------------
    S        S          S          S             S             S
    S        I          S          S             I             I
    S        R          S          S             R             R
    I        R          I          I             R             R
    R        R          R          R             R             R
    S      <NA>         S        <NA>          <NA>          <NA>
    I      <NA>         I        <NA>          <NA>          <NA>
    R      <NA>       <NA>       <NA>            R           <NA>
  <NA>     <NA>       <NA>       <NA>          <NA>          <NA>
-------------------------------------------------------------------------

Under CLSI, the combination of I with a missing result is ⁠<NA>⁠ for "most_susceptible" and I for "most_resistant".

The count_*() and proportion_*() functions apply these rules when more than one variable is used. With only_all_tested = FALSE (default), the functions for susceptibility, such as susceptibility() and count_susceptible(), count an isolate as susceptible if any of the antimicrobials is susceptible ("most_susceptible"), and the functions for resistance, such as resistance() and count_resistant(), count an isolate as resistant if any of the antimicrobials is resistant ("most_resistant"). An isolate is considered tested if it has such a result, or if it was tested for all antimicrobials. Therefore, for combinations with only_all_tested = FALSE:

    count_S()    +   count_I()    +   count_R()    >= count_all()
  proportion_S() + proportion_I() + proportion_R() >= 1

With only_all_tested = TRUE, all these functions count the result of the combination therapy ("most_susceptible") of isolates tested for all antimicrobials, so that:

    count_S()    +   count_I()    +   count_R()    = count_all()
  proportion_S() + proportion_I() + proportion_R() = 1

In antibiogram() and wisca(), the result of the combination therapy ("most_susceptible") is used, the 'I' category is considered susceptible or not following the guideline argument ('SDD' is always considered susceptible), and the result is then reduced to S or R.

See Also

proportion_* to calculate microbial resistance and susceptibility.

Examples

# example_isolates is a data set available in the AMR package.
# run ?example_isolates for more info.

# base R ------------------------------------------------------------
count_resistant(example_isolates$AMX) # counts "R"
count_susceptible(example_isolates$AMX) # counts "S" and "I"
count_all(example_isolates$AMX) # counts "S", "I" and "R"

# be more specific
count_S(example_isolates$AMX)
count_SI(example_isolates$AMX)
count_I(example_isolates$AMX)
count_IR(example_isolates$AMX)
count_R(example_isolates$AMX)

# Count all available isolates
count_all(example_isolates$AMX)
n_sir(example_isolates$AMX)

# n_sir() is an alias of count_all().
# Since it counts all available isolates, you can
# calculate back to count e.g. susceptible isolates.
# These results are the same:
count_susceptible(example_isolates$AMX)
susceptibility(example_isolates$AMX) * n_sir(example_isolates$AMX)

# dplyr -------------------------------------------------------------

if (require("dplyr")) {
  example_isolates %>%
    group_by(ward) %>%
    summarise(
      R = count_R(CIP),
      I = count_I(CIP),
      S = count_S(CIP),
      n1 = count_all(CIP), # the actual total; sum of all three
      n2 = n_sir(CIP), # same - analogous to n_distinct
      total = n()
    ) # NOT the number of tested isolates!

  # Number of available isolates for a whole antibiotic class
  # (i.e., in this data set columns GEN, TOB, AMK, KAN)
  example_isolates %>%
    group_by(ward) %>%
    summarise(across(aminoglycosides(), n_sir))

  # Count co-resistance between amoxicillin/clav acid and gentamicin,
  # so we can see that combination therapy does a lot more than mono therapy.
  # Please mind that `susceptibility()` calculates percentages right away instead.
  example_isolates %>% count_susceptible(AMC) # 1433
  example_isolates %>% count_all(AMC) # 1879

  example_isolates %>% count_susceptible(GEN) # 1399
  example_isolates %>% count_all(GEN) # 1855

  example_isolates %>% count_susceptible(AMC, GEN) # 1764
  example_isolates %>% count_all(AMC, GEN) # 1936

  # Get number of S+I vs. R immediately of selected columns
  example_isolates %>%
    select(AMX, CIP) %>%
    count_df(translate = FALSE)

  # It also supports grouping variables
  example_isolates %>%
    select(ward, AMX, CIP) %>%
    group_by(ward) %>%
    count_df(translate = FALSE)
}


AMR documentation built on Oct. 16, 2026, 5:10 p.m.