1
0
mirror of https://github.com/msberends/AMR.git synced 2026-05-31 12:21:40 +02:00

2 Commits

Author SHA1 Message Date
e57c022861 fix add_missing 2026-04-21 20:49:18 +02:00
c2b9af94ff fix add_missing 2026-04-21 20:48:43 +02:00
39 changed files with 1166 additions and 973 deletions

View File

@@ -1,6 +1,6 @@
Package: AMR
Version: 3.0.1.9045
Date: 2026-04-05
Date: 2026-04-21
Title: Antimicrobial Resistance Data Analysis
Description: Functions to simplify and standardise antimicrobial resistance (AMR)
data analysis and to work with microbial and antimicrobial properties by

View File

@@ -35,7 +35,7 @@
#' `options(AMR_guideline = "CLSI")`
#' @section Options (alphabetical order):
#' * `AMR_antibiogram_formatting_type` \cr A [numeric] (1-22) to use in [antibiogram()], to indicate which formatting type to use.
#' * `AMR_breakpoint_type` \cr A [character] to use in [as.sir()], to indicate which breakpoint type to use. This must be either `r vector_or(clinical_breakpoints$type)`.
#' * `AMR_breakpoint_type` \cr A [character] to use in [as.sir()], to indicate which breakpoint type to use. This must be either `r vector_or(clinical_breakpoints$type, documentation = TRUE)`.
#' * `AMR_capped_mic_handling` \cr A [character] to use in [as.sir()], to indicate how capped MIC values (`<`, `<=`, `>`, `>=`) should be interpreted. Must be one of `"none"`, `"conservative"`, `"standard"`, or `"lenient"` - the default is `"conservative"`.
#' * `AMR_cleaning_regex` \cr A [regular expression][base::regex] (case-insensitive) to use in [as.mo()] and all [`mo_*`][mo_property()] functions, to clean the user input. The default is the outcome of [mo_cleaning_regex()], which removes texts between brackets and texts such as "species" and "serovar".
#' * `AMR_custom_ab` \cr A file location to an RDS file, to use custom antimicrobial drugs with this package. This is explained in [add_custom_antimicrobials()].

View File

@@ -32,7 +32,7 @@
#' Use these functions to return a specific property of an antibiotic from the [antimicrobials] data set. All input values will be evaluated internally with [as.ab()].
#' @param x Any (vector of) text that can be coerced to a valid antibiotic drug code with [as.ab()].
#' @param tolower A [logical] to indicate whether the first [character] of every output should be transformed to a lower case [character]. This will lead to e.g. "polymyxin B" and not "polymyxin b".
#' @param property One of the column names of one of the [antimicrobials] data set: `vector_or(colnames(antimicrobials), sort = FALSE)`.
#' @param property One of the column names of one of the [antimicrobials] data set: `r vector_or(colnames(antimicrobials), documentation = TRUE, sort = FALSE)`.
#' @param 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`][AMR-options]. Use `language = NULL` or `language = ""` to prevent translation.
#' @param administration Way of administration, either `"oral"` or `"iv"`.
#' @param open Browse the URL using [utils::browseURL()].

View File

@@ -48,8 +48,8 @@
#' - `carbapenems() + "GEN"`
#' - `carbapenems() + c("", "GEN")`
#' - `carbapenems() + c("", aminoglycosides())`
#' @param mo_transform A character to transform microorganism input - must be `"name"`, `"shortname"` (default), `"gramstain"`, or one of the column names of the [microorganisms] data set: `r vector_or(colnames(microorganisms), sort = FALSE, quotes = TRUE)`. Can also be `NULL` to not transform the input or `NA` to consider all microorganisms 'unknown'.
#' @param ab_transform A character to transform antimicrobial input - must be one of the column names of the [antimicrobials] data set (defaults to `"name"`): `r vector_or(colnames(antimicrobials), sort = FALSE, quotes = TRUE)`. Can also be `NULL` to not transform the input.
#' @param mo_transform A character to transform microorganism input - must be `"name"`, `"shortname"` (default), `"gramstain"`, or one of the column names of the [microorganisms] data set: `r vector_or(colnames(microorganisms), sort = FALSE, documentation = TRUE)`. Can also be `NULL` to not transform the input or `NA` to consider all microorganisms 'unknown'.
#' @param ab_transform A character to transform antimicrobial input - must be one of the column names of the [antimicrobials] data set (defaults to `"name"`): `r vector_or(colnames(antimicrobials), sort = FALSE, documentation = TRUE)`. Can also be `NULL` to not transform the input.
#' @param syndromic_group A column name of `x`, or values calculated to split rows of `x`, e.g. by using [ifelse()] or [`case_when()`][dplyr::case_when()]. See *Examples*.
#' @param add_total_n *(deprecated in favour of `formatting_type`)* A [logical] to indicate whether `n_tested` available numbers per pathogen should be added to the table (default is `TRUE`). This will add the lowest and highest number of available isolates per antimicrobial (e.g, if for *E. coli* 200 isolates are available for ciprofloxacin and 150 for amoxicillin, the returned number will be "150-200"). This option is unavailable when `wisca = TRUE`; in that case, use [retrieve_wisca_parameters()] to get the parameters used for WISCA.
#' @param only_all_tested (for combination antibiograms): a [logical] to indicate that isolates must be tested for all antimicrobials, see *Details*.

View File

@@ -32,7 +32,7 @@
#' Use these functions to return a specific property of an antiviral drug from the [antivirals] data set. All input values will be evaluated internally with [as.av()].
#' @param x Any (vector of) text that can be coerced to a valid antiviral drug code with [as.av()].
#' @param tolower A [logical] to indicate whether the first [character] of every output should be transformed to a lower case [character].
#' @param property One of the column names of one of the [antivirals] data set: `vector_or(colnames(antivirals), sort = FALSE)`.
#' @param property One of the column names of one of the [antivirals] data set: `r vector_or(colnames(antivirals), documentation = TRUE, sort = FALSE)`.
#' @param language Language of the returned text - the default is system language (see [get_AMR_locale()]) and can also be set with the package option [`AMR_locale`][AMR-options]. Use `language = NULL` or `language = ""` to prevent translation.
#' @param administration Way of administration, either `"oral"` or `"iv"`.
#' @param open Browse the URL using [utils::browseURL()].

View File

@@ -307,7 +307,7 @@
#' - `is_SDD`\cr A [logical] value (`TRUE`/`FALSE`) to indicate whether the intermediate range between "S" and "R" should be interpreted as "SDD", instead of "I". This currently applies to `r sum(clinical_breakpoints$is_SDD)` breakpoints.
#' @details
#' ### Different Types of Breakpoints
#' Supported types of breakpoints are `r vector_and(clinical_breakpoints$type, quote = FALSE)`. ECOFF (Epidemiological cut-off) values are used in antimicrobial susceptibility testing to differentiate between wild-type and non-wild-type strains of bacteria or fungi.
#' Supported types of breakpoints are `r vector_and(clinical_breakpoints$type, quotes = FALSE)`. ECOFF (Epidemiological cut-off) values are used in antimicrobial susceptibility testing to differentiate between wild-type and non-wild-type strains of bacteria or fungi.
#'
#' The default is `"human"`, which can also be set with the package option [`AMR_breakpoint_type`][AMR-options]. Use [`as.sir(..., breakpoint_type = ...)`][as.sir()] to interpret raw data using a specific breakpoint type, e.g. `as.sir(..., breakpoint_type = "ECOFF")` to use ECOFFs.
#'

View File

@@ -65,12 +65,12 @@ format_eucast_version_nr <- function(version, markdown = TRUE) {
#' @param rules A [character] vector that specifies which rules should be applied. Must be one or more of `"breakpoints"`, `"expected_phenotypes"`, `"expert"`, `"other"`, `"custom"`, `"all"`, and defaults to `c("breakpoints", "expected_phenotypes")`. The default value can be set to another value using the package option [`AMR_interpretive_rules`][AMR-options]: `options(AMR_interpretive_rules = "all")`. If using `"custom"`, be sure to fill in argument `custom_rules` too. Custom rules can be created with [custom_eucast_rules()].
#' @param verbose A [logical] to turn Verbose mode on and off (default is off). In Verbose mode, the function does not apply rules to the data, but instead returns a data set in logbook form with extensive info about which rows and columns would be effected and in which way. Using Verbose mode takes a lot more time.
#' @param version_breakpoints The version number to use for the EUCAST Clinical Breakpoints guideline. Can be `r vector_or(names(EUCAST_VERSION_BREAKPOINTS), documentation = TRUE, reverse = TRUE)`.
#' @param version_expected_phenotypes The version number to use for the EUCAST Expected Phenotypes. Can be `r vector_or(names(EUCAST_VERSION_EXPECTED_PHENOTYPES), reverse = TRUE)`.
#' @param version_expertrules The version number to use for the EUCAST Expert Rules and Intrinsic Resistance guideline. Can be `r vector_or(names(EUCAST_VERSION_EXPERT_RULES), reverse = TRUE)`.
#' @param version_expected_phenotypes The version number to use for the EUCAST Expected Phenotypes. Can be `r vector_or(names(EUCAST_VERSION_EXPECTED_PHENOTYPES), documentation = TRUE, reverse = TRUE)`.
#' @param version_expertrules The version number to use for the EUCAST Expert Rules and Intrinsic Resistance guideline. Can be `r vector_or(names(EUCAST_VERSION_EXPERT_RULES), documentation = TRUE, reverse = TRUE)`.
#' @param ampc_cephalosporin_resistance (only applies when `rules` contains `"expert"` or `"all"`) a [character] value that should be applied to cefotaxime, ceftriaxone and ceftazidime for AmpC de-repressed cephalosporin-resistant mutants - the default is `NA`. Currently only works when `version_expertrules` is `3.2` and higher; these versions of '*EUCAST Expert Rules on Enterobacterales*' state that results of cefotaxime, ceftriaxone and ceftazidime should be reported with a note, or results should be suppressed (emptied) for these three drugs. A value of `NA` (the default) for this argument will remove results for these three drugs, while e.g. a value of `"R"` will make the results for these drugs resistant. Use `NULL` or `FALSE` to not alter results for these three drugs of AmpC de-repressed cephalosporin-resistant mutants. Using `TRUE` is equal to using `"R"`. \cr For *EUCAST Expert Rules* v3.2, this rule applies to: `r vector_and(gsub("[^a-zA-Z ]+", "", unlist(strsplit(EUCAST_RULES_DF[which(EUCAST_RULES_DF$reference.version %in% c(3.2, 3.3) & EUCAST_RULES_DF$reference.rule %like% "ampc"), "this_value"][1], "|", fixed = TRUE))), quotes = "*")`.
#' @param ... Column names of antimicrobials. To automatically detect antimicrobial column names, do not provide any named arguments; [guess_ab_col()] will then be used for detection. To manually specify a column, provide its name (case-insensitive) as an argument, e.g. `AMX = "amoxicillin"`. To skip a specific antimicrobial, set it to `NULL`, e.g. `TIC = NULL` to exclude ticarcillin. If a manually defined column does not exist in the data, it will be skipped with a warning.
#' @param ab Any (vector of) text that can be coerced to a valid antimicrobial drug code with [as.ab()].
#' @param administration Route of administration, either `r vector_or(dosage$administration)`.
#' @param administration Route of administration, either `r vector_or(dosage$administration, documentation = TRUE)`.
#' @param only_sir_columns A [logical] to indicate whether only antimicrobial columns must be included that were transformed to class [sir][as.sir()] on beforehand. Defaults to `FALSE` if no columns of `x` have a class [sir][as.sir()].
#' @param custom_rules Custom rules to apply, created with [custom_eucast_rules()].
#' @param overwrite A [logical] indicating whether to overwrite existing SIR values (default: `FALSE`). When `FALSE`, only non-SIR values are modified (i.e., any value that is not already S, I or R). To ensure compliance with EUCAST guidelines, **this should remain** `FALSE`, as EUCAST notes often state that an organism "should be tested for susceptibility to individual agents or be reported resistant".
@@ -619,7 +619,7 @@ interpretive_rules <- function(x,
# >>> Apply Official EUCAST rules <<< ---------------------------------------------------
eucast_notification_shown <- FALSE
if (!is.null(list(...)$eucast_rules_df)) {
# this allows: eucast_rules(x, eucast_rules_df = AMR:::EUCAST_RULES_DF %>% filter(is.na(have_these_values)))
# this allows: eucast_rules(x, eucast_rules_df = AMR:::EUCAST_RULES_DF |> filter(is.na(have_these_values)))
eucast_rules_df_total <- list(...)$eucast_rules_df
} else {
# otherwise internal data file, created in data-raw/_pre_commit_checks.R
@@ -1075,13 +1075,13 @@ interpretive_rules <- function(x,
warn_lacking_sir_class <- warn_lacking_sir_class[order(colnames(x.bak))]
warn_lacking_sir_class <- warn_lacking_sir_class[!is.na(warn_lacking_sir_class)]
warning_(
"in {.help [{.fun eucast_rules}](AMR::eucast_rules)}: not all columns with antimicrobial results are of class {.cls sir}. Transform them on beforehand, e.g.:\n",
" - ", highlight_code(paste0(x_deparsed, " %>% as.sir(", ifelse(length(warn_lacking_sir_class) == 1,
"in {.help [{.fun eucast_rules}](AMR::eucast_rules)}: not all columns with antimicrobial results are of class {.cls sir}. Transform them on beforehand, e.g.:\n\n",
"\u00a0\u00a0", AMR_env$bullet_icon, " ", highlight_code(paste0(x_deparsed, " |> as.sir(", ifelse(length(warn_lacking_sir_class) == 1,
warn_lacking_sir_class,
paste0(warn_lacking_sir_class[1], ":", warn_lacking_sir_class[length(warn_lacking_sir_class)])
), ")")), "\n",
" - ", highlight_code(paste0(x_deparsed, " %>% mutate_if(is_sir_eligible, as.sir)")), "\n",
" - ", highlight_code(paste0(x_deparsed, " %>% mutate(across(where(is_sir_eligible), as.sir))"))
), ")")), "\n\n",
"\u00a0\u00a0", AMR_env$bullet_icon, " ", highlight_code(paste0(x_deparsed, " |> mutate_if(is_sir_eligible, as.sir)")), "\n\n",
"\u00a0\u00a0", AMR_env$bullet_icon, " ", highlight_code(paste0(x_deparsed, " |> mutate(across(where(is_sir_eligible), as.sir))"))
)
}
@@ -1165,18 +1165,31 @@ edit_sir <- function(x,
track_changes$sir_warn <- cols[!vapply(FUN.VALUE = logical(1), x[, cols, drop = FALSE], is.sir)]
}
isNA <- is.na(new_edits[rows, cols])
isSIR <- !isNA & (new_edits[rows, cols] == "S" | new_edits[rows, cols] == "I" | new_edits[rows, cols] == "R" | new_edits[rows, cols] == "SDD" | new_edits[rows, cols] == "NI" | new_edits[rows, cols] == "WT" | new_edits[rows, cols] == "NWT" | new_edits[rows, cols] == "NS")
isSIR <- !isNA &
(new_edits[rows, cols] == "S" |
new_edits[rows, cols] == "I" |
new_edits[rows, cols] == "R" |
new_edits[rows, cols] == "SDD" |
new_edits[rows, cols] == "NI" |
new_edits[rows, cols] == "WT" |
new_edits[rows, cols] == "NWT" |
new_edits[rows, cols] == "NS")
non_SIR <- !isSIR
if (isFALSE(overwrite) && any(isSIR) && message_not_thrown_before("edit_sir.warning_overwrite")) {
warning_("Some values had SIR values and were not overwritten, since {.code overwrite = FALSE}.")
warning_("in {.help [{.fun eucast_rules}](AMR::eucast_rules)}: some columns had SIR values which were not overwritten, since {.code overwrite = FALSE}.")
}
# determine which cells to modify based on overwrite and add_if_missing
apply_mask <- if (isTRUE(overwrite)) {
if (isFALSE(add_if_missing)) !isNA else rep(TRUE, length(isNA))
if (isTRUE(overwrite)) {
if (isTRUE(add_if_missing)) {
apply_mask <- rep(TRUE, length(isSIR))
} else {
apply_mask <- isSIR
}
} else {
if (isFALSE(add_if_missing)) isSIR else non_SIR
# overwrite = FALSE, add_if_missing = TRUE: fill missing and placeholder cells only
apply_mask <- !isSIR
}
warning_("test", call = T) # aaaaaaa
tryCatch(
# insert into original table
new_edits[rows, cols][apply_mask] <- to,

4
R/mo.R
View File

@@ -792,7 +792,7 @@ print.mo <- function(x, print.shortnames = FALSE, ...) {
names(x) <- x_names
if (!all(x %in% c(AMR_env$MO_lookup$mo, NA))) {
warning_(
"Some MO codes are from a previous AMR package version. ",
"Some MO codes are from another AMR package version. ",
"Please update the MO codes with {.help [{.fun as.mo}](AMR::as.mo)}.",
call = FALSE
)
@@ -826,7 +826,7 @@ as.data.frame.mo <- function(x, ...) {
add_MO_lookup_to_AMR_env()
if (!all(x %in% c(AMR_env$MO_lookup$mo, NA))) {
warning_(
"The data contains old MO codes (from a previous AMR package version). ",
"The data contains old MO codes (from another AMR package version). ",
"Please update your MO codes with {.help [{.fun as.mo}](AMR::as.mo)}."
)
}

View File

@@ -31,7 +31,7 @@
#'
#' Use these functions to return a specific property of a microorganism based on the latest accepted taxonomy. All input values will be evaluated internally with [as.mo()], which makes it possible to use microbial abbreviations, codes and names as input. See *Examples*.
#' @param x Any [character] (vector) that can be coerced to a valid microorganism code with [as.mo()]. Can be left blank for auto-guessing the column containing microorganism codes if used in a data set, see *Examples*.
#' @param property One of the column names of the [microorganisms] data set: `r vector_or(colnames(microorganisms), sort = FALSE, quotes = TRUE)`, or must be `"shortname"`.
#' @param property One of the column names of the [microorganisms] data set: `r vector_or(colnames(microorganisms), sort = FALSE, documentation = TRUE)`, or must be `"shortname"`.
#' @inheritParams as.mo
#' @param ... Other arguments passed on to [as.mo()], such as 'minimum_matching_score', 'ignore_pattern', and 'remove_from_input'.
#' @param ab Any (vector of) text that can be coerced to a valid antibiotic drug code with [as.ab()].

View File

@@ -66,12 +66,12 @@
#'
#' # new ggplot2 plotting method using this package:
#' if (require("dplyr") && require("ggplot2")) {
#' ggplot_pca(pca_result)
#' ggplot_pca(pca_result)
#' }
#' if (require("dplyr") && require("ggplot2")) {
#' ggplot_pca(pca_result) +
#' scale_colour_viridis_d() +
#' labs(title = "Title here")
#' ggplot_pca(pca_result) +
#' scale_colour_viridis_d() +
#' labs(title = "Title here")
#' }
#' }
pca <- function(x,

View File

@@ -200,7 +200,7 @@
#' theme_minimal() +
#' geom_boxplot(fill = NA, colour = "grey30") +
#' geom_jitter(width = 0.25)
#' labs(title = "scale_y_mic()/scale_colour_sir() automatically applied")
#' labs(title = "scale_y_mic()/scale_colour_sir() automatically applied")
#'
#' mic_sir_plot
#' }

View File

@@ -65,7 +65,7 @@ VALID_SIR_LEVELS <- c("S", "SDD", "I", "R", "NI", "WT", "NWT", "NS")
#' @param substitute_missing_r_breakpoint A [logical] to indicate that a missing clinical breakpoints for R (resistant) must be substituted with R - the default is `FALSE`. Some (especially CLSI) breakpoints only have a breakpoint for S, meaning that the outcome can only be `"S"` or `NA`. Setting this to `TRUE` will convert the `NA`s in these cases to `"R"`. Can also be set with the package option [`AMR_substitute_missing_r_breakpoint`][AMR-options].
#' @param include_screening A [logical] to indicate that clinical breakpoints for screening are allowed - the default is `FALSE`. Can also be set with the package option [`AMR_include_screening`][AMR-options].
#' @param include_PKPD A [logical] to indicate that PK/PD clinical breakpoints must be applied as a last resort - the default is `TRUE`. Can also be set with the package option [`AMR_include_PKPD`][AMR-options].
#' @param breakpoint_type The type of breakpoints to use, either `r vector_or(clinical_breakpoints$type)`. ECOFF stands for Epidemiological Cut-Off values. The default is `"human"`, which can also be set with the package option [`AMR_breakpoint_type`][AMR-options]. If `host` is set to values of veterinary species, this will automatically be set to `"animal"`.
#' @param breakpoint_type The type of breakpoints to use, either `r vector_or(clinical_breakpoints$type, documentation = TRUE)`. ECOFF stands for Epidemiological Cut-Off values. The default is `"human"`, which can also be set with the package option [`AMR_breakpoint_type`][AMR-options]. If `host` is set to values of veterinary species, this will automatically be set to `"animal"`.
#' @param host A vector (or column name) with [character]s to indicate the host. Only useful for veterinary breakpoints, as it requires `breakpoint_type = "animal"`. The values can be any text resembling the animal species, even in any of the `r length(LANGUAGES_SUPPORTED)` supported languages of this package. For foreign languages, be sure to set the language with [set_AMR_locale()] (though it will be automatically guessed based on the system language).
#' @param language Language to convert values set in `host` when using animal breakpoints. Use one of these supported language names or [ISO 639-1 codes](https://en.wikipedia.org/wiki/ISO_639-1): `r vector_or(paste0(sapply(LANGUAGES_SUPPORTED_NAMES, function(x) x[[1]]), " (" , LANGUAGES_SUPPORTED, ")"), quotes = FALSE, sort = FALSE)`.
#' @param verbose A [logical] to indicate that all notes should be printed during interpretation of MIC values or disk diffusion values.

View File

@@ -21,7 +21,6 @@
#' @export
#' @examples
#' if (require("tidymodels")) {
#'
#' # The below approach formed the basis for this paper: DOI 10.3389/fmicb.2025.1582703
#' # Presence of ESBL genes was predicted based on raw MIC values.
#'
@@ -40,13 +39,10 @@
#'
#' # Create and prep a recipe with MIC log2 transformation
#' mic_recipe <- recipe(esbl ~ ., data = training_data) %>%
#'
#' # Optionally remove non-predictive variables
#' remove_role(genus, old_role = "predictor") %>%
#'
#' # Apply the log2 transformation to all MIC predictors
#' step_mic_log2(all_mic_predictors()) %>%
#'
#' # And apply the preparation steps
#' prep()
#'
@@ -67,13 +63,15 @@
#' bind_cols(out_testing)
#'
#' # Evaluate predictions using standard classification metrics
#' our_metrics <- metric_set(accuracy,
#' recall,
#' precision,
#' sensitivity,
#' specificity,
#' ppv,
#' npv)
#' our_metrics <- metric_set(
#' accuracy,
#' recall,
#' precision,
#' sensitivity,
#' specificity,
#' ppv,
#' npv
#' )
#' metrics <- our_metrics(predictions, truth = esbl, estimate = .pred_class)
#'
#' # Show performance

View File

@@ -32,7 +32,7 @@
#' This function filters a data set to include only the top *n* microorganisms based on a specified property, such as taxonomic family or genus. For example, it can filter a data set to the top 3 species, or to any species in the top 5 genera, or to the top 3 species in each of the top 5 genera.
#' @param x A data frame containing microbial data.
#' @param n An integer specifying the maximum number of unique values of the `property` to include in the output.
#' @param property A character string indicating the microorganism property to use for filtering. Must be one of the column names of the [microorganisms] data set: `r vector_or(colnames(microorganisms), sort = FALSE, quotes = TRUE)`. If `NULL`, the raw values from `col_mo` will be used without transformation. When using `"species"` (default) or `"subpecies"`, the genus will be added to make sure each (sub)species still belongs to the right genus.
#' @param property A character string indicating the microorganism property to use for filtering. Must be one of the column names of the [microorganisms] data set: `r vector_or(colnames(microorganisms), sort = FALSE, documentation = TRUE)`. If `NULL`, the raw values from `col_mo` will be used without transformation. When using `"species"` (default) or `"subpecies"`, the genus will be added to make sure each (sub)species still belongs to the right genus.
#' @param n_for_each An optional integer specifying the maximum number of rows to retain for each value of the selected property. If `NULL`, all rows within the top *n* groups will be included.
#' @param col_mo A character string indicating the column in `x` that contains microorganism names or codes. Defaults to the first column of class [`mo`]. Values will be coerced using [as.mo()].
#' @param ... Additional arguments passed on to [mo_property()] when `property` is not `NULL`.

View File

@@ -15,8 +15,10 @@ library(readr)
library(tidyr)
# WHONET version of 16th Feb 2024
whonet_breakpoints <- read_tsv("WHONET/Resources/Breakpoints.txt", na = c("", "NA", "-"),
show_col_types = FALSE, guess_max = Inf) %>%
whonet_breakpoints <- read_tsv("WHONET/Resources/Breakpoints.txt",
na = c("", "NA", "-"),
show_col_types = FALSE, guess_max = Inf
) %>%
filter(GUIDELINES %in% c("CLSI", "EUCAST"))
dim(whonet_breakpoints)
@@ -59,9 +61,11 @@ whonet_breakpoints |>
```{r}
whonet_breakpoints |>
filter(HOST == "Cats", YEAR == 2023) |>
mutate(MO = AMR::mo_shortname(ORGANISM_CODE),
AB = AMR::ab_name(WHONET_ABX_CODE),
SITE_OF_INFECTION = substr(SITE_OF_INFECTION, 1, 25)) |>
mutate(
MO = AMR::mo_shortname(ORGANISM_CODE),
AB = AMR::ab_name(WHONET_ABX_CODE),
SITE_OF_INFECTION = substr(SITE_OF_INFECTION, 1, 25)
) |>
arrange(MO, AB) |>
select(MO, AB, SITE_OF_INFECTION) |>
as.data.frame()

View File

@@ -406,7 +406,7 @@ pre_commit_lst$AB_GLYCOPEPTIDES <- antimicrobials %>%
pre_commit_lst$AB_FUSIDANES <- antimicrobials %>%
filter(name %like% "fusi") %>%
pull(ab)
pre_commit_lst$AB_IONOPHORES<- antimicrobials %>%
pre_commit_lst$AB_IONOPHORES <- antimicrobials %>%
filter(name %like% "alamethicin|beauvericin|calcimycin|chloroquine|clioquinol|diiodohydroxyquinoline|dithiocarbamates|enniatin|epigallocatechin|gramicidin|hinokitiol|ionomycin|laidlomycin|lasalocid|maduramicin|monensin|narasin|nigericin|nonactin|nystatin|pyrazole|pyrithione|quercetin|salinomycin|semduramicin|valinomycin|zincophorin") %>%
pull(ab)
pre_commit_lst$AB_ISOXAZOLYLPENICILLINS <- antimicrobials %>%
@@ -478,7 +478,8 @@ pre_commit_lst$AB_BETALACTAMS <- sort(c(
pre_commit_lst$AB_PENICILLINS,
pre_commit_lst$AB_CEPHALOSPORINS,
pre_commit_lst$AB_CARBAPENEMS,
pre_commit_lst$AB_MONOBACTAMS))
pre_commit_lst$AB_MONOBACTAMS
))
pre_commit_lst$AB_BETALACTAMASE_INHIBITORS <- antimicrobials %>%
filter(atc_group2 %like% "Beta-lactamase inhibitors" | name %like% "bactam") %>%
pull(ab)
@@ -495,8 +496,9 @@ for (grp in pre_commit_lst$DEFINED_AB_GROUPS[pre_commit_lst$DEFINED_AB_GROUPS %u
fn_name <- tolower(gsub("^AB_", "", grp))
if (!fn_name %in% ls(envir = asNamespace("AMR"))) {
stop("Group '", grp, "' has ", length(pre_commit_lst[[grp]]),
" members (", toString(ab_name(pre_commit_lst[[grp]], tolower = T)), ") but no corresponding function '", fn_name, "()' exists in the AMR namespace.",
call. = FALSE)
" members (", toString(ab_name(pre_commit_lst[[grp]], tolower = T)), ") but no corresponding function '", fn_name, "()' exists in the AMR namespace.",
call. = FALSE
)
}
}
}
@@ -534,46 +536,48 @@ for (i in seq_along(group_map)) {
}
# create priority list for ab_group()
pre_commit_lst$ABX_PRIORITY_LIST <- c("Aminopenicillins",
"Isoxazolylpenicillins",
"Ureidopenicillins",
"Oxazolidinones",
"Carbapenems",
"Cephalosporins (1st gen.)",
"Cephalosporins (2nd gen.)",
"Cephalosporins (3rd gen.)",
"Cephalosporins (4th gen.)",
"Cephalosporins (5th gen.)",
"Cephalosporins",
"Penicillins",
"Monobactams",
"Aminoglycosides",
"Lipoglycopeptides",
"Glycopeptides",
"Peptides",
"Lincosamides",
"Streptogramins",
"Macrolides",
"Nitrofurans",
"Phenicols",
"Phosphonics",
"Polymyxins",
"Fluoroquinolones",
"Quinolones",
"Rifamycins",
"Spiropyrimidinetriones",
"Trimethoprims",
"Sulfonamides",
"Tetracyclines",
"Ionophores",
"Antifungals",
"Antimycobacterials",
"Fusidanes",
"Beta-lactams",
"Beta-lactamase inhibitors",
"Pleuromutilins",
"Aminocoumarins",
"Other")
pre_commit_lst$ABX_PRIORITY_LIST <- c(
"Aminopenicillins",
"Isoxazolylpenicillins",
"Ureidopenicillins",
"Oxazolidinones",
"Carbapenems",
"Cephalosporins (1st gen.)",
"Cephalosporins (2nd gen.)",
"Cephalosporins (3rd gen.)",
"Cephalosporins (4th gen.)",
"Cephalosporins (5th gen.)",
"Cephalosporins",
"Penicillins",
"Monobactams",
"Aminoglycosides",
"Lipoglycopeptides",
"Glycopeptides",
"Peptides",
"Lincosamides",
"Streptogramins",
"Macrolides",
"Nitrofurans",
"Phenicols",
"Phosphonics",
"Polymyxins",
"Fluoroquinolones",
"Quinolones",
"Rifamycins",
"Spiropyrimidinetriones",
"Trimethoprims",
"Sulfonamides",
"Tetracyclines",
"Ionophores",
"Antifungals",
"Antimycobacterials",
"Fusidanes",
"Beta-lactams",
"Beta-lactamase inhibitors",
"Pleuromutilins",
"Aminocoumarins",
"Other"
)
if (!all(unlist(antimicrobials$group) %in% pre_commit_lst$ABX_PRIORITY_LIST)) {
stop("Missing group(s) in priority list: ", paste(setdiff(unlist(antimicrobials$group), pre_commit_lst$ABX_PRIORITY_LIST), collapse = ", "))
}
@@ -589,17 +593,17 @@ pre_commit_lst$AV_LOOKUP <- create_AB_AV_lookup(antivirals)
# Export to package as internal data ----
# usethis::use_data() must receive unquoted object names, which is not flexible at all.
# we'll use good old base::save() instead
save(list = names(pre_commit_lst),
file = "R/sysdata.rda",
envir = as.environment(pre_commit_lst),
compress = "xz",
version = 2,
ascii = FALSE)
save(
list = names(pre_commit_lst),
file = "R/sysdata.rda",
envir = as.environment(pre_commit_lst),
compress = "xz",
version = 2,
ascii = FALSE
)
usethis::ui_done("Saved to {usethis::ui_value('R/sysdata.rda')}")
# Export data sets to the repository in different formats -----------------
for (pkg in c("haven", "openxlsx2", "arrow")) {
@@ -621,7 +625,9 @@ write_md5 <- function(object) {
}
changed_md5 <- function(object) {
path <- paste0("data-raw/", deparse(substitute(object)), ".md5")
if (!file.exists(path)) return(TRUE)
if (!file.exists(path)) {
return(TRUE)
}
tryCatch(
{
conn <- file(path)
@@ -759,11 +765,14 @@ devtools::load_all(quiet = TRUE)
suppressMessages(set_AMR_locale("English"))
files_changed <- function(paths = "^(R|data)/") {
tryCatch({
changed_files <- system("git status", intern = TRUE)
changed_files <- unlist(strsplit(changed_files, " "))
any(changed_files %like% paths[paths != "R/sysdata.rda"])
}, error = function(e) TRUE)
tryCatch(
{
changed_files <- system("git status", intern = TRUE)
changed_files <- unlist(strsplit(changed_files, " "))
any(changed_files %like% paths[paths != "R/sysdata.rda"])
},
error = function(e) TRUE
)
}
# Update URLs -------------------------------------------------------------
@@ -801,8 +810,10 @@ if (files_changed()) {
# Style pkg ---------------------------------------------------------------
if (files_changed(paths = "^(R|tests)/")) {
usethis::ui_info("Styling package")
styler::style_pkg(include_roxygen_examples = FALSE,
exclude_dirs = list.dirs(full.names = FALSE, recursive = FALSE)[!list.dirs(full.names = FALSE, recursive = FALSE) %in% c("R", "tests")])
styler::style_pkg(
include_roxygen_examples = FALSE,
exclude_dirs = list.dirs(full.names = FALSE, recursive = FALSE)[!list.dirs(full.names = FALSE, recursive = FALSE) %in% c("R", "tests")]
)
}
# Document pkg ------------------------------------------------------------
@@ -813,13 +824,13 @@ if (files_changed()) {
# Update index.md and README.md -------------------------------------------
if (files_changed("README.Rmd") ||
files_changed("index.Rmd") ||
files_changed("man/microorganisms.Rd") ||
files_changed("man/antimicrobials.Rd") ||
files_changed("man/clinical_breakpoints.Rd") ||
files_changed("man/antibiogram.Rd") ||
files_changed("R/antibiogram.R") ||
files_changed("data-raw/translations.tsv")) {
files_changed("index.Rmd") ||
files_changed("man/microorganisms.Rd") ||
files_changed("man/antimicrobials.Rd") ||
files_changed("man/clinical_breakpoints.Rd") ||
files_changed("man/antibiogram.Rd") ||
files_changed("R/antibiogram.R") ||
files_changed("data-raw/translations.tsv")) {
usethis::ui_info("Rendering {usethis::ui_field('index.md')} and {usethis::ui_field('README.md')}")
suppressWarnings(rmarkdown::render("index.Rmd", quiet = TRUE))
suppressWarnings(rmarkdown::render("README.Rmd", quiet = TRUE))

View File

@@ -319,7 +319,7 @@ get_synonyms <- function(CID, clean = TRUE) {
synonyms_txt <- gsub("[^a-z]+$", "", ignore.case = TRUE, synonyms_txt)
# only length 5 to 20 and lower-case names starting with a capital letter
synonyms_txt <- synonyms_txt[nchar(synonyms_txt) %in% c(5:20) &
grepl("^[A-Z][a-z]+$", synonyms_txt, ignore.case = FALSE)]
grepl("^[A-Z][a-z]+$", synonyms_txt, ignore.case = FALSE)]
synonyms_txt <- unlist(strsplit(synonyms_txt, ";", fixed = TRUE))
}
@@ -763,10 +763,12 @@ antimicrobials[which(antimicrobials$ab %in% c("CYC", "LNZ", "THA", "TZD")), "gro
# add efflux
effl <- antimicrobials |>
filter(ab == "ACM") |>
mutate(ab = as.character("EFF"),
cid = NA_real_,
name = "Efflux",
group = "Other")
mutate(
ab = as.character("EFF"),
cid = NA_real_,
name = "Efflux",
group = "Other"
)
antimicrobials <- antimicrobials |>
mutate(ab = as.character(ab)) |>
bind_rows(effl)
@@ -777,9 +779,11 @@ antimicrobials[which(antimicrobials$ab == "EFF"), "abbreviations"][[1]] <- list(
# add clindamycin inducible screening
clin <- antimicrobials |>
filter(ab == "FOX1") |>
mutate(ab = as.character("CLI-S"),
name = "Clindamycin inducible screening",
group = "Macrolides/lincosamides")
mutate(
ab = as.character("CLI-S"),
name = "Clindamycin inducible screening",
group = "Macrolides/lincosamides"
)
antimicrobials <- antimicrobials |>
mutate(ab = as.character(ab)) |>
bind_rows(clin)
@@ -791,109 +795,123 @@ antimicrobials <- antimicrobials |>
bind_rows(
antimicrobials |>
filter(ab == "EFF") |>
mutate(ab = "BLA-S",
name = paste("Beta-lactamase", "screening test"),
cid = NA_real_,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("beta-lactamase", "betalactamase", "bl screen", "blt screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))),
mutate(
ab = "BLA-S",
name = paste("Beta-lactamase", "screening test"),
cid = NA_real_,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("beta-lactamase", "betalactamase", "bl screen", "blt screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))
),
antimicrobials |>
filter(ab == "PEN") |>
mutate(ab = "PEN-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("pen screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))),
mutate(
ab = "PEN-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("pen screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))
),
antimicrobials |>
filter(ab == "OXA") |>
mutate(ab = "OXA-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("oxa screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))),
mutate(
ab = "OXA-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("oxa screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))
),
antimicrobials |>
filter(ab == "PEF") |>
mutate(ab = "PEF-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("pef screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))),
mutate(
ab = "PEF-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("pef screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))
),
antimicrobials |>
filter(ab == "NAL") |>
mutate(ab = "NAL-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("nal screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))),
mutate(
ab = "NAL-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("nal screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))
),
antimicrobials |>
filter(ab == "NOR") |>
mutate(ab = "NOR-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("nor screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))),
mutate(
ab = "NOR-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("nor screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))
),
antimicrobials |>
filter(ab == "TCY") |>
mutate(ab = "TCY-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("tcy screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0)))
mutate(
ab = "TCY-S",
name = paste(name, "screening test"),
cid = NA,
atc = list(character(0)),
atc_group1 = NA_character_,
atc_group2 = NA_character_,
abbreviations = list(c("tcy screen")),
synonyms = list(character(0)),
oral_ddd = NA_real_,
oral_units = NA_character_,
iv_ddd = NA_real_,
iv_units = NA_character_,
loinc = list(character(0))
)
)
@@ -919,16 +937,20 @@ antimicrobials <- antimicrobials |>
antimicrobials |>
filter(ab == "FPE") |>
mutate(ab = as.character(ab)) |>
mutate(ab = "FTA",
name = "Cefepime/taniborbactam",
cid = NA_real_),
mutate(
ab = "FTA",
name = "Cefepime/taniborbactam",
cid = NA_real_
),
antimicrobials |>
filter(ab == "TBP") |>
mutate(ab = as.character(ab)) |>
mutate(ab = "TAN",
name = "Taniborbactam",
cid = 76902493,
abbreviations = list("VNRX-5133"))
mutate(
ab = "TAN",
name = "Taniborbactam",
cid = 76902493,
abbreviations = list("VNRX-5133")
)
)
antimicrobials <- antimicrobials |>
@@ -936,39 +958,51 @@ antimicrobials <- antimicrobials |>
bind_rows(
antimicrobials |>
filter(ab == "CTB") |>
mutate(ab = "CTA",
cid = NA_real_,
name = "Ceftibuten/avibactam") |>
mutate(
ab = "CTA",
cid = NA_real_,
name = "Ceftibuten/avibactam"
) |>
select(1:4),
antimicrobials |>
filter(ab == "KAC") |>
mutate(ab = "KAS",
cid = NA_real_,
name = "Kasugamycin") |>
mutate(
ab = "KAS",
cid = NA_real_,
name = "Kasugamycin"
) |>
select(1:4),
antimicrobials |>
filter(ab == "PRI") |>
mutate(ab = "OST",
cid = NA_real_,
name = "Ostreogrycin") |>
mutate(
ab = "OST",
cid = NA_real_,
name = "Ostreogrycin"
) |>
select(1:4),
antimicrobials |>
filter(ab == "PRI") |>
mutate(ab = "THS",
cid = NA_real_,
name = "Thiostrepton") |>
mutate(
ab = "THS",
cid = NA_real_,
name = "Thiostrepton"
) |>
select(1, 3),
antimicrobials |>
filter(ab == "CLA1") |>
mutate(ab = "XER",
cid = NA_real_,
name = "Xeruborbactam") |>
mutate(
ab = "XER",
cid = NA_real_,
name = "Xeruborbactam"
) |>
select(1:4),
antimicrobials |>
filter(ab == "BLM") |>
mutate(ab = "ZOR",
cid = NA_real_,
name = "Zorbamycin") |>
mutate(
ab = "ZOR",
cid = NA_real_,
name = "Zorbamycin"
) |>
select(1:4),
)
@@ -977,9 +1011,11 @@ antimicrobials <- antimicrobials |>
bind_rows(
antimicrobials |>
filter(ab == "NOV") |>
mutate(ab = "CLB",
cid = 54706138,
name = "Clorobiocin") |>
mutate(
ab = "CLB",
cid = 54706138,
name = "Clorobiocin"
) |>
select(1:4),
)
@@ -1055,8 +1091,10 @@ to_update <- 1:nrow(antimicrobials)
# or just the empty ones:
to_update <- which(sapply(antimicrobials$atc, function(x) length(x[!is.na(x)])) == 0)
updated_atc <- lapply(seq_len(length(to_update)),
function(x) NA_character_)
updated_atc <- lapply(
seq_len(length(to_update)),
function(x) NA_character_
)
# this takes around 10 minutes for the whole table (some ABx are skipped and go faster)

View File

@@ -89,28 +89,36 @@ unmatched <- whonet_organisms |> filter(is.na(mo))
# generate the mo codes and add their names
message("Getting MO codes for WHONET input...")
unmatched <- unmatched |>
mutate(mo = as.mo(gsub("(sero[a-z]*| nontypable| non[-][a-zA-Z]+|var[.]| not .*|sp[.],.*|, .*variant.*|, .*toxin.*|, microaer.*| beta-haem[.])", "", ORGANISM),
minimum_matching_score = 0.55,
keep_synonyms = TRUE,
language = "en"),
mo = case_when(ORGANISM %like% "Anaerobic" & ORGANISM %like% "negative" ~ as.mo("B_ANAER-NEG"),
ORGANISM %like% "Anaerobic" & ORGANISM %like% "positive" ~ as.mo("B_ANAER-POS"),
ORGANISM %like% "Anaerobic" ~ as.mo("B_ANAER"),
TRUE ~ mo),
mo_name = mo_name(mo,
keep_synonyms = TRUE,
language = "en"))
mutate(
mo = as.mo(gsub("(sero[a-z]*| nontypable| non[-][a-zA-Z]+|var[.]| not .*|sp[.],.*|, .*variant.*|, .*toxin.*|, microaer.*| beta-haem[.])", "", ORGANISM),
minimum_matching_score = 0.55,
keep_synonyms = TRUE,
language = "en"
),
mo = case_when(
ORGANISM %like% "Anaerobic" & ORGANISM %like% "negative" ~ as.mo("B_ANAER-NEG"),
ORGANISM %like% "Anaerobic" & ORGANISM %like% "positive" ~ as.mo("B_ANAER-POS"),
ORGANISM %like% "Anaerobic" ~ as.mo("B_ANAER"),
TRUE ~ mo
),
mo_name = mo_name(mo,
keep_synonyms = TRUE,
language = "en"
)
)
# check if coercion at least resembles the first part (genus)
unmatched <- unmatched |>
mutate(
first_part = sapply(ORGANISM, function(x) strsplit(gsub("[^a-zA-Z _-]+", "", x), " ")[[1]][1], USE.NAMES = FALSE),
keep = mo_name %like_case% first_part | ORGANISM %like% "Gram " | ORGANISM == "Other" | ORGANISM %like% "anaerobic") |>
keep = mo_name %like_case% first_part | ORGANISM %like% "Gram " | ORGANISM == "Other" | ORGANISM %like% "anaerobic"
) |>
arrange(keep)
unmatched |> View()
unmatched <- unmatched |>
filter(keep == TRUE)
organisms <- matched |> transmute(code = toupper(ORGANISM_CODE), group = SPECIES_GROUP, mo) |>
organisms <- matched |>
transmute(code = toupper(ORGANISM_CODE), group = SPECIES_GROUP, mo) |>
bind_rows(unmatched |> transmute(code = toupper(ORGANISM_CODE), group = SPECIES_GROUP, mo)) |>
mutate(name = mo_name(mo, keep_synonyms = TRUE)) |>
arrange(code)
@@ -125,12 +133,18 @@ organisms <- organisms |>
# some subspecies exist, while their upper species do not, add them as the species level:
subspp <- organisms |>
filter(mo_species(mo, keep_synonyms = TRUE) == mo_subspecies(mo, keep_synonyms = TRUE) &
mo_species(mo, keep_synonyms = TRUE) != "" &
mo_genus(mo, keep_synonyms = TRUE) != "Salmonella") |>
mutate(mo = as.mo(paste(mo_genus(mo, keep_synonyms = TRUE),
mo_species(mo, keep_synonyms = TRUE)),
keep_synonyms = TRUE),
name = mo_name(mo, keep_synonyms = TRUE))
mo_species(mo, keep_synonyms = TRUE) != "" &
mo_genus(mo, keep_synonyms = TRUE) != "Salmonella") |>
mutate(
mo = as.mo(
paste(
mo_genus(mo, keep_synonyms = TRUE),
mo_species(mo, keep_synonyms = TRUE)
),
keep_synonyms = TRUE
),
name = mo_name(mo, keep_synonyms = TRUE)
)
organisms <- organisms |>
filter(!code %in% subspp$code) |>
bind_rows(subspp) |>
@@ -138,10 +152,12 @@ organisms <- organisms |>
# add the groups
organisms <- organisms |>
bind_rows(tibble(code = organisms |> filter(!is.na(group)) |> pull(group) |> unique(),
group = NA,
mo = organisms |> filter(!is.na(group)) |> pull(group) |> unique() |> as.mo(keep_synonyms = TRUE),
name = mo_name(mo, keep_synonyms = TRUE))) |>
bind_rows(tibble(
code = organisms |> filter(!is.na(group)) |> pull(group) |> unique(),
group = NA,
mo = organisms |> filter(!is.na(group)) |> pull(group) |> unique() |> as.mo(keep_synonyms = TRUE),
name = mo_name(mo, keep_synonyms = TRUE)
)) |>
arrange(code, group) |>
select(-group) |>
distinct()
@@ -233,10 +249,14 @@ AMR::clinical_breakpoints |>
breakpoints <- whonet_breakpoints_raw |>
mutate(code = toupper(ORGANISM_CODE)) |>
left_join(bind_rows(microorganisms.codes |> filter(!code %in% c("ALL", "GEN")),
# GEN (Generic) and ALL (All) are PK/PD codes
data.frame(code = c("ALL", "GEN"),
mo = rep(as.mo("UNKNOWN"), 2))))
left_join(bind_rows(
microorganisms.codes |> filter(!code %in% c("ALL", "GEN")),
# GEN (Generic) and ALL (All) are PK/PD codes
data.frame(
code = c("ALL", "GEN"),
mo = rep(as.mo("UNKNOWN"), 2)
)
))
# these ones lack an MO name, they cannot be used:
unknown <- breakpoints |>
filter(is.na(mo)) |>
@@ -253,8 +273,10 @@ breakpoints <- breakpoints |>
breakpoints |>
filter(!WHONET_ABX_CODE %in% whonet_antibiotics_raw$WHONET_ABX_CODE) |>
count(GUIDELINES, WHONET_ABX_CODE) |>
mutate(ab = as.ab(WHONET_ABX_CODE, fast_mode = TRUE),
ab_name = ab_name(ab))
mutate(
ab = as.ab(WHONET_ABX_CODE, fast_mode = TRUE),
ab_name = ab_name(ab)
)
# 2025-04-20: these codes are currently: CFC, ROX, FIX, and N/A. All have the right replacements in `antimicrobials`, so we can safely use as.ab() later on
# the NAs are for M. tuberculosis, they are empty breakpoints
breakpoints <- breakpoints |>
@@ -301,11 +323,15 @@ breakpoints_new <- breakpoints |>
distinct(guideline, type, host, ab, mo, method, site, breakpoint_S, .keep_all = TRUE)
# fix reference table names
breakpoints_new |> filter(guideline %like% "EUCAST", is.na(ref_tbl)) |> View()
breakpoints_new |>
filter(guideline %like% "EUCAST", is.na(ref_tbl)) |>
View()
breakpoints_new <- breakpoints_new |>
mutate(ref_tbl = case_when(is.na(ref_tbl) & guideline %like% "EUCAST 202" ~ lead(ref_tbl),
is.na(ref_tbl) ~ "Unknown",
TRUE ~ ref_tbl))
mutate(ref_tbl = case_when(
is.na(ref_tbl) & guideline %like% "EUCAST 202" ~ lead(ref_tbl),
is.na(ref_tbl) ~ "Unknown",
TRUE ~ ref_tbl
))
# clean disk zones
breakpoints_new[which(breakpoints_new$method == "DISK"), "breakpoint_S"] <- as.double(as.disk(breakpoints_new[which(breakpoints_new$method == "DISK"), "breakpoint_S", drop = TRUE]))
@@ -324,8 +350,12 @@ m <- unique(as.double(as.mic(levels(as.mic(1)))))
# WHONET has no >1024 but instead uses 1025, 513, and 129, so as.mic() cannot be used to clean.
# instead, raise these one higher valid MIC factor level:
breakpoints_new |> filter(method == "MIC" & (!breakpoint_S %in% c(m, NA))) |> distinct(breakpoint_S)
breakpoints_new |> filter(method == "MIC" & (!breakpoint_R %in% c(m, NA))) |> distinct(breakpoint_R)
breakpoints_new |>
filter(method == "MIC" & (!breakpoint_S %in% c(m, NA))) |>
distinct(breakpoint_S)
breakpoints_new |>
filter(method == "MIC" & (!breakpoint_R %in% c(m, NA))) |>
distinct(breakpoint_R)
breakpoints_new[which(breakpoints_new$breakpoint_R == 129), "breakpoint_R"] <- m[which(m == 128) + 1]
breakpoints_new[which(breakpoints_new$breakpoint_R == 257), "breakpoint_R"] <- m[which(m == 256) + 1]
breakpoints_new[which(breakpoints_new$breakpoint_R == 513), "breakpoint_R"] <- m[which(m == 512) + 1]
@@ -387,7 +417,9 @@ breakpoints_new <- breakpoints_new |> filter(!wrong)
# 2025-04-20/ fixed now
# WHONET sets for EUCAST 2026 TMP breakpoints for all Klebsiella, but this is now only for non-aerogenes species
kleb_spp <- microorganisms |> filter(rank == "species", genus == "Klebsiella", !species %in% c("", "aerogenes")) |> pull(mo)
kleb_spp <- microorganisms |>
filter(rank == "species", genus == "Klebsiella", !species %in% c("", "aerogenes")) |>
pull(mo)
kleb_tmp_mic <- breakpoints_new |>
filter(guideline == "EUCAST 2026", method == "MIC", ab == "TMP", mo == as.mo("Klebsiella")) |>
uncount(length(kleb_spp)) |>
@@ -398,8 +430,10 @@ kleb_tmp_disk <- breakpoints_new |>
mutate(mo = kleb_spp)
breakpoints_new <- breakpoints_new |>
filter(!(guideline == "EUCAST 2026" & method == "MIC" & ab == "TMP" & mo == as.mo("Klebsiella"))) |>
bind_rows(kleb_tmp_mic,
kleb_tmp_disk)
bind_rows(
kleb_tmp_mic,
kleb_tmp_disk
)
# WHONET contains wrong EUCAST breakpoints for enterococci/SXT: disk should be 23/23, not 21/50, and MIC should be 1/1, not 0.032/1
# applies to all previous years, since v11 (2011)

View File

@@ -649,7 +649,9 @@ taxonomy_mycobank <- taxonomy_mycobank %>%
arrange(fullname)
taxonomy_mycobank %>% count(rank, sort = TRUE)
taxonomy_mycobank %>% filter(rank %like% "#") %>% count(rank)
taxonomy_mycobank %>%
filter(rank %like% "#") %>%
count(rank)
taxonomy_mycobank3 <- taxonomy_mycobank
@@ -2546,7 +2548,9 @@ taxonomy %>%
arrange(mo) %>%
View()
# keep the firsts
taxonomy <- taxonomy %>% arrange(mo) %>% distinct(mo, .keep_all = TRUE)
taxonomy <- taxonomy %>%
arrange(mo) %>%
distinct(mo, .keep_all = TRUE)
# are fullnames unique?
taxonomy %>%
@@ -2997,7 +3001,9 @@ taxonomy$rank[which(taxonomy$fullname %like% "unknown")] <- "(unknown rank)"
# this happened in early 2025, check that MO codes do not have repeated elements
# fixed it then like this: microorganisms$mo <- gsub("B_SCLLM_CNNM_LNSM_LNSM_LNSM_LNSM", "B_SCLLM_CNNM", microorganisms$mo)
taxonomy |> filter(mo %like% "_.*_.*_.*_") |> View()
taxonomy |>
filter(mo %like% "_.*_.*_.*_") |>
View()
fix_old_mos <- function(dataset) {
@@ -3085,7 +3091,9 @@ microorganisms <- taxonomy
# set class <mo>
class(microorganisms$mo) <- c("mo", "character")
microorganisms <- microorganisms %>% arrange(fullname) %>% df_remove_nonASCII()
microorganisms <- microorganisms %>%
arrange(fullname) %>%
df_remove_nonASCII()
usethis::use_data(
microorganisms,
overwrite = TRUE,

View File

@@ -73,58 +73,87 @@ whonet_organisms <- whonet_organisms %>%
whonet_organisms %>%
filter(!is.na(SPECIES_GROUP)) %>%
group_by(SPECIES_GROUP) %>%
summarise(complex = ORGANISM[ORGANISM %like% " (group|complex)"][1],
organisms = paste0(n(), ": ", paste(sort(unique(ORGANISM)), collapse = ", "))) %>%
summarise(
complex = ORGANISM[ORGANISM %like% " (group|complex)"][1],
organisms = paste0(n(), ": ", paste(sort(unique(ORGANISM)), collapse = ", "))
) %>%
filter(!SPECIES_GROUP %in% microorganisms.codes$code)
# create the species group data set ----
microorganisms.groups <- whonet_organisms %>%
# these will not be translated well
filter(!ORGANISM %in% c("Trueperella pyogenes-like bacteria",
"Mycobacterium suricattae",
"Mycobacterium canetti")) %>%
filter(!ORGANISM %in% c(
"Trueperella pyogenes-like bacteria",
"Mycobacterium suricattae",
"Mycobacterium canetti"
)) %>%
filter(!is.na(SPECIES_GROUP), SPECIES_GROUP != ORGANISM_CODE) %>%
transmute(mo_group = as.mo(SPECIES_GROUP),
mo = ifelse(is.na(mo),
as.character(as.mo(ORGANISM, keep_synonyms = TRUE, minimum_matching_score = 0)),
mo)) %>%
transmute(
mo_group = as.mo(SPECIES_GROUP),
mo = ifelse(is.na(mo),
as.character(as.mo(ORGANISM, keep_synonyms = TRUE, minimum_matching_score = 0)),
mo
)
) %>%
# add our own CoNS and CoPS, WHONET does not strictly follow Becker et al. (2014, 2019, 2020)
filter(mo_group != as.mo("CoNS")) %>%
bind_rows(tibble(mo_group = as.mo("CoNS"), mo = MO_CONS)) %>%
filter(mo_group != as.mo("CoPS")) %>%
bind_rows(tibble(mo_group = as.mo("CoPS"), mo = MO_COPS)) %>%
# at least all our Lancefield-grouped streptococci must be in the beta-haemolytic group:
bind_rows(tibble(mo_group = as.mo("Beta-haemolytic streptococcus"),
mo = c(MO_LANCEFIELD,
microorganisms %>% filter(fullname %like% "^Streptococcus Group") %>% pull(mo)))) %>%
bind_rows(tibble(
mo_group = as.mo("Beta-haemolytic streptococcus"),
mo = c(
MO_LANCEFIELD,
microorganisms %>% filter(fullname %like% "^Streptococcus Group") %>% pull(mo)
)
)) %>%
# and per Streptococcus group as well:
# group A - S. pyogenes
bind_rows(tibble(mo_group = as.mo("Streptococcus Group A"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_PYGN(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group A"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_PYGN(_|$)")]
)) %>%
# group B - S. agalactiae
bind_rows(tibble(mo_group = as.mo("Streptococcus Group B"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_AGLC(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group B"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_AGLC(_|$)")]
)) %>%
# group C - all subspecies within S. dysgalactiae and S. equi (such as S. equi zooepidemicus)
bind_rows(tibble(mo_group = as.mo("Streptococcus Group C"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_(DYSG|EQUI)(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group C"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_(DYSG|EQUI)(_|$)")]
)) %>%
# group F - Milleri group == S. anginosus group, which incl. S. anginosus, S. constellatus, S. intermedius
bind_rows(tibble(mo_group = as.mo("Streptococcus Group F"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_(ANGN|CNST|INTR)(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group F"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_(ANGN|CNST|INTR)(_|$)")]
)) %>%
# group G - S. dysgalactiae and S. canis (though dysgalactiae is also group C and will be matched there)
bind_rows(tibble(mo_group = as.mo("Streptococcus Group G"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_(DYSG|CANS)(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group G"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_(DYSG|CANS)(_|$)")]
)) %>%
# group H - S. sanguinis
bind_rows(tibble(mo_group = as.mo("Streptococcus Group H"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_SNGN(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group H"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_SNGN(_|$)")]
)) %>%
# group K - S. salivarius, incl. S. salivarius salivariuss and S. salivarius thermophilus
bind_rows(tibble(mo_group = as.mo("Streptococcus Group K"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_SLVR(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group K"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_SLVR(_|$)")]
)) %>%
# group L - only S. dysgalactiae
bind_rows(tibble(mo_group = as.mo("Streptococcus Group L"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_DYSG(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group L"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_DYSG(_|$)")]
)) %>%
# and for EUCAST: Strep group A, B, C, G
bind_rows(tibble(mo_group = as.mo("Streptococcus Group A, B, C, G"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_(PYGN|AGLC|DYSG|EQUI|CANS|GRPA|GRPB|GRPC|GRPG)(_|$)")])) %>%
bind_rows(tibble(
mo_group = as.mo("Streptococcus Group A, B, C, G"),
mo = microorganisms$mo[which(microorganisms$mo %like% "^B_STRPT_(PYGN|AGLC|DYSG|EQUI|CANS|GRPA|GRPB|GRPC|GRPG)(_|$)")]
)) %>%
# HACEK is:
# - Haemophilus species
# - Aggregatibacter species
@@ -143,21 +172,29 @@ microorganisms.groups <- whonet_organisms %>%
# Citrobacter freundii complex in the NCBI Taxonomy Browser:
# https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=1344959
filter(mo_group != "B_CTRBC_FRND-C") %>%
bind_rows(tibble(mo_group = as.mo("B_CTRBC_FRND-C"),
mo = paste("Citrobacter", c("freundii", "braakii", "gillenii", "murliniae", "portucalensis", "sedlakii", "werkmanii", "youngae")) %>% as.mo(keep_synonyms = TRUE))) %>%
bind_rows(tibble(
mo_group = as.mo("B_CTRBC_FRND-C"),
mo = paste("Citrobacter", c("freundii", "braakii", "gillenii", "murliniae", "portucalensis", "sedlakii", "werkmanii", "youngae")) %>% as.mo(keep_synonyms = TRUE)
)) %>%
# Klebsiella pneumoniae complex
filter(mo_group != "B_KLBSL_PNMN-C") %>%
bind_rows(tibble(mo_group = as.mo("B_KLBSL_PNMN-C"),
mo = paste("Klebsiella", c("africana", "pneumoniae", "quasipneumoniae", "quasivariicola", "variicola")) %>% as.mo(keep_synonyms = TRUE))) %>%
bind_rows(tibble(
mo_group = as.mo("B_KLBSL_PNMN-C"),
mo = paste("Klebsiella", c("africana", "pneumoniae", "quasipneumoniae", "quasivariicola", "variicola")) %>% as.mo(keep_synonyms = TRUE)
)) %>%
# Yersinia pseudotuberculosis complex in the NCBI Taxonomy Browser:
# https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=1649845
filter(mo_group != "B_YERSN_PSDT-C") %>%
bind_rows(tibble(mo_group = as.mo("B_YERSN_PSDT-C"),
mo = paste("Yersinia", c("pseudotuberculosis", "pestis", "similis", "wautersii")) %>% as.mo(keep_synonyms = TRUE))) %>%
bind_rows(tibble(
mo_group = as.mo("B_YERSN_PSDT-C"),
mo = paste("Yersinia", c("pseudotuberculosis", "pestis", "similis", "wautersii")) %>% as.mo(keep_synonyms = TRUE)
)) %>%
# RGM are Rapidly-growing Mycobacteria, see https://pubmed.ncbi.nlm.nih.gov/28084211/
filter(mo_group != "B_MYCBC_RGM") %>%
bind_rows(tibble(mo_group = as.mo("B_MYCBC_RGM"),
mo = paste("Mycobacterium", c( "abscessus abscessus", "abscessus bolletii", "abscessus massiliense", "agri", "aichiense", "algericum", "alvei", "anyangense", "arabiense", "aromaticivorans", "aubagnense", "aubagnense", "aurum", "austroafricanum", "bacteremicum", "boenickei", "bourgelatii", "brisbanense", "brumae", "canariasense", "celeriflavum", "chelonae", "chitae", "chlorophenolicum", "chubuense", "confluentis", "cosmeticum", "crocinum", "diernhoferi", "duvalii", "elephantis", "fallax", "flavescens", "fluoranthenivorans", "fortuitum", "franklinii", "frederiksbergense", "gadium", "gilvum", "goodii", "hassiacum", "hippocampi", "hodleri", "holsaticum", "houstonense", "immunogenum", "insubricum", "iranicum", "komossense", "litorale", "llatzerense", "madagascariense", "mageritense", "monacense", "moriokaense", "mucogenicum", "mucogenicum", "murale", "neoaurum", "neworleansense", "novocastrense", "obuense", "pallens", "parafortuitum", "peregrinum", "phlei", "phocaicum", "phocaicum", "porcinum", "poriferae", "psychrotolerans", "pyrenivorans", "rhodesiae", "rufum", "rutilum", "salmoniphilum", "sediminis", "senegalense", "septicum", "setense", "smegmatis", "sphagni", "thermoresistibile", "tokaiense", "vaccae", "vanbaalenii", "wolinskyi")) %>% as.mo(keep_synonyms = TRUE)))
bind_rows(tibble(
mo_group = as.mo("B_MYCBC_RGM"),
mo = paste("Mycobacterium", c("abscessus abscessus", "abscessus bolletii", "abscessus massiliense", "agri", "aichiense", "algericum", "alvei", "anyangense", "arabiense", "aromaticivorans", "aubagnense", "aubagnense", "aurum", "austroafricanum", "bacteremicum", "boenickei", "bourgelatii", "brisbanense", "brumae", "canariasense", "celeriflavum", "chelonae", "chitae", "chlorophenolicum", "chubuense", "confluentis", "cosmeticum", "crocinum", "diernhoferi", "duvalii", "elephantis", "fallax", "flavescens", "fluoranthenivorans", "fortuitum", "franklinii", "frederiksbergense", "gadium", "gilvum", "goodii", "hassiacum", "hippocampi", "hodleri", "holsaticum", "houstonense", "immunogenum", "insubricum", "iranicum", "komossense", "litorale", "llatzerense", "madagascariense", "mageritense", "monacense", "moriokaense", "mucogenicum", "mucogenicum", "murale", "neoaurum", "neworleansense", "novocastrense", "obuense", "pallens", "parafortuitum", "peregrinum", "phlei", "phocaicum", "phocaicum", "porcinum", "poriferae", "psychrotolerans", "pyrenivorans", "rhodesiae", "rufum", "rutilum", "salmoniphilum", "sediminis", "senegalense", "septicum", "setense", "smegmatis", "sphagni", "thermoresistibile", "tokaiense", "vaccae", "vanbaalenii", "wolinskyi")) %>% as.mo(keep_synonyms = TRUE)
))
# add subspecies to all species
for (group in unique(microorganisms.groups$mo_group)) {
@@ -175,8 +212,10 @@ for (group in unique(microorganisms.groups$mo_group)) {
# add full names, arrange and clean
microorganisms.groups <- microorganisms.groups %>%
mutate(mo_group_name = mo_name(mo_group, keep_synonyms = TRUE, language = NULL),
mo_name = mo_name(mo, keep_synonyms = TRUE, language = NULL)) %>%
mutate(
mo_group_name = mo_name(mo_group, keep_synonyms = TRUE, language = NULL),
mo_name = mo_name(mo, keep_synonyms = TRUE, language = NULL)
) %>%
arrange(mo_group_name, mo_name) %>%
filter(mo_group != mo) %>%
distinct() %>%

View File

@@ -68,9 +68,11 @@ new_ab <- complete_tbl |>
) |>
mutate(name = paste0(substr(toupper(name), 1, 1), substr(name, 2, 999))) |>
mutate(name = gsub(" and ", "/", name)) |>
filter(name %unlike% "^Combinations",
name %unlike% "/beta[-]lactamase inhibitor",
name %unlike% "combinations") |>
filter(
name %unlike% "^Combinations",
name %unlike% "/beta[-]lactamase inhibitor",
name %unlike% "combinations"
) |>
arrange(name)
new_atcs <- new_ab |>

View File

@@ -1,470 +1,470 @@
codes <- tibble::tribble(
~code, ~name,
"ABT773", "Abbott 773",
"AESCUL", "Aesculin",
"AGMATI", "Agmatine",
"AMDPEN", "Amidinopenicillin subclass",
"AMICYC", "Aminocyclitol class",
"AMIFLO", "Amifloxacin",
"AMIGLY", "Aminoglycoside class",
"AMIKAC", "Amikacin",
"AMIPEN", "Aminopenicillin subclass",
"AMOCL2", "Amoxicillin/ Clav.Acid */2",
"AMOCL4", "Amoxicillin/ Clav. Acid 4:1",
"AMOCLA", "Amoxicillin/ Clavulanic Acid",
"AMOXIC", "Amoxicillin",
"AMP100", "Ampicillin 100 ug/ml",
"AMP200", "Ampicillin 200 ug/ml",
"AMPHOT", "Amphotericin B",
"AMPICI", "Ampicillin",
"AMPSUL", "Ampicillin/ Sulbactam",
"ANIDUL", "Anidulafungin",
"ANSAMY", "Rifabutin",
"ANSMYC", "Ansamycin class",
"APALCI", "Apalcillin",
"APOXIC", "Apoxicillin",
"APRAMY", "Apramycin",
"ARABIN", "Arabinose",
"ARABIT", "Arabitol",
"ARBEKA", "Arbekacin",
"ARGINI", "Arginine",
"ASPOXI", "Aspoxicillin",
"ASTROM", "Astromycin",
"AVILAM", "Avilamycin",
"AZD256", "AZD2563",
"AZITHR", "Azithromycin",
"AZLOCI", "Azlocillin",
"AZT1", "Aztreonam 1 ug/ml",
"AZTREO", "Aztreonam",
"BACAMP", "Bacampicillin",
"BACITR", "Bacitracin",
"BAMMYC", "Bambermycin class",
"BAY12", "BAY12-8039",
"BERBER", "Berberine",
"BESIFL", "Besifloxacin",
"BETA", "Beta-lactamase",
"B", "HAEM Beta-haemolysis",
"BIAPEN", "Biapenem (L-627)",
"BLACT", "Beta-lactam class",
"BLINHB", "Beta-lactam Inhibitor class",
"B", "MGLU B-Methyl Glucoside",
"CAPREO", "Capreomycin",
"CAPRYL", "Caprylic Acid",
"CARBAD", "Carbadox",
"CARBAP", "Carbapenem class",
"CARBEN", "Carbenicillin",
"CARPEN", "Carboxypenicillin subclass",
"CASPOF", "Caspofungin",
"CATALA", "Catalase",
"CCARB", "Carbacephem subclass",
"CEFACL", "Cefaclor",
"CEFADR", "Cefadroxil",
"CEFAMA", "Cefamandole",
"CEFATR", "Cefatrizine",
"CEFAXE", "Cefuroxime (axetil)",
"CEFAZE", "Cefazedon",
"CEFAZO", "Cefazolin",
"CEFBUP", "Cefbuperazone",
"CEFCAP", "Cefcapene",
"CEFCLA", "Cefepime/ Clavulanic Acid",
"CEFCLI", "Cefclidin",
"CEFDIN", "Cefdinir",
"CEFDIT", "Cefditoren",
"CEFEP4", "Cefepime 4 ug/ml",
"CEFEPI", "Cefepime",
"CEFETA", "Cefetamet",
"CEFIXI", "Cefixime",
"CEFMEN", "Cefmenoxime",
"CEFMET", "Cefmetazole",
"CEFMIN", "Cefminox",
"CEFMTM", "Cefmetamet",
"CEFO32", "Cefotaxime 32 ug/ml",
"CEFONI", "Cefonicid",
"CEFOPE", "Cefoperazone",
"CEFORA", "Ceforanide",
"CEFOSE", "Cefoselis",
"CEFOTA", "Cefotaxime",
"CEFOTE", "Cefotetan",
"CEFOTI", "Cefotiam",
"CEFOVE", "Cefovecin",
"CEFOXI", "Cefoxitin",
"CEFOZO", "Cefozopran",
"CEFPAM", "Cefpiramide",
"CEFPIM", "Cefpimizole",
"CEFPOD", "Cefpodoxime",
"CEFPOM", "Cefpirome",
"CEFPRO", "Cefprozil",
"CEFQUI", "Cefquinome",
"CEFROX", "Cefroxidime",
"CEFSUL", "Cefsulodin",
"CEFTAR", "Ceftaroline",
"CEFTAZ", "Ceftazidime",
"CEFTER", "Cefteram",
"CEFTEZ", "Ceftezole",
"CEFTIB", "Ceftibuten",
"CEFTIF", "Ceftiofur",
"CEFTIX", "Ceftioxadine",
"CEFTIZ", "Ceftizoxime",
"CEFTOB", "Ceftobiprole",
"CEFTRI", "Ceftriaxone",
"CEFURO", "Cefuroxime (sodium)",
"CEFUZO", "Cefuzonam",
"CELLOB", "Cellobiose",
"CEPALE", "Cefalexin",
"CEPHAC", "Cephacetril",
"CEPHAL", "Cephalothin",
"CEPHAP", "Cephapirin",
"CEPHEM", "Cephem class",
"CEPHOR", "Cephem (oral) class",
"CEPHPA", "Cephem (parenteral) class",
"CEPHRA", "Cephradine",
"CEPLOR", "Cephaloridine",
"CHLORA", "Chloramphenicol",
"CHLTET", "Chlortetracycline",
"CI983", "CI-983",
"CINOXA", "Cinoxacin",
"CIPROF", "Ciprofloxacin",
"CIPROP", "CIPROP",
"CITRAT", "Citrate",
"CLARYT", "Clarithromycin",
"CLIN32", "Clindamycin 32 ug/ml",
"CLINAF", "Clinafloxacin",
"CLINDA", "Clindamycin",
"CLISPE", "Clindamycin/ Spectinomycin",
"CLOFAM", "Clofazimine",
"CLOXAC", "Cloxacillin",
"CMYC", "Cephamycin subclass",
"COAGUL", "Coagulase",
"COLFAZ", "Colfazamine",
"COLIST", "Colistin",
"COLMET", "Colistimethate",
"COMBO", "Combination class",
"CORAL", "Cephem (oral) class",
"COUMER", "Coumermycin",
"COXA", "Oxacephem subclass",
"CPAREN", "Cephem (parenteral) class",
"CPCA", "Cond. Pyridone Carboxylic Acid class",
"CSPOR", "Cephalosporin class",
"CSPOR1", "Cephalosporin I-Generation subclass",
"CSPOR2", "Cephalosporin II-Generation subclass",
"CSPOR3", "Cephalosporin III-Generation subclass",
"CSPOR4", "Cephalosporin IV-Generation subclass",
"CSPOR5", "Cephalosporin V-Generation subclass",
"CYCLAC", "Cyclacillin",
"CYCLOS", "Cycloserine",
"DALBAV", "Dalbavancin",
"DALFOP", "Dalfopristin",
"DANOFL", "Danofloxacin",
"DAPT25", "Daptomycin 25mg/L Ca",
"DAPT50", "Daptomycin 50mg/L Ca",
"DAPTOM", "Daptomycin",
"DEMECY", "Demeclocycline",
"DIBEKA", "Dibekacin",
"DICLOX", "Dicloxacillin",
"DIFLOX", "Difloxacin",
"DIRITH", "Dirithromycin",
"DORIPE", "Doripenem",
"DOXYCY", "Doxycycline",
"DTEST1", "DTest1",
"DTEST2", "DTest2",
"ENOXA", "Enoxacin",
"ENROFL", "Enrofloxacin",
"ERTAPE", "Ertapenem",
"ERY32", "Erythromycin 32 ug/ml",
"ERYSCH", "Erythromycin/ Sulphachloropyrid",
"ERYSDI", "Erythromycin/ Sulphadimethoxine",
"ERYSPE", "Erythromycin/ Spectinomycin",
"ERYSUL", "Erythromycin/ Sulfizoxazole",
"ERYTH", "Erythromycin",
"ESBL", "Extended spectrum beta-lactamase",
"ETHAMB", "Ethambutol",
"ETHION", "Ethionamide",
"FAROPE", "Faropenem",
"FLAVOM", "Flavomycin",
"FLEROX", "Fleroxacin",
"FLOMOX", "Flomoxef",
"FLORFE", "Florfenicol",
"FLQUIN", "Fluoroquinolone class",
"FLUCLO", "Flucloxacillin",
"FLUCON", "Fluconazole",
"FLUCYT", "5-Flucytosine",
"FLUMEQ", "Flumequine",
"FOPSUL", "Cefoperazone/ Sulbactam",
"FOSFOM", "Fosfomycin",
"FOSG6P", "Fosfomycin + Glucose6Phosphate",
"FOSMYC", "Fosfomycin class",
"FOSTRO", "Fosfomycin-trometamol",
"FOT1", "Cefotaxime 1 ug/ml",
"FOXSCR", "Cefoxitin Screen Test",
"FPINHB", "Folate Pathway Inhibitor class",
"FR1", "FR1",
"FR10", "FR10",
"FR12", "FR12",
"FR13", "FR13",
"FR14", "FR14",
"FR15", "FR15",
"FR16", "FR16",
"FR17", "FR17",
"FR18", "FR18",
"FR19", "FR19",
"FR20", "FR20",
"FR21", "FR21",
"FR22", "FR22",
"FR23", "FR23",
"FR24", "FR24",
"FR25", "FR25",
"FR26", "FR26",
"FR27", "FR27",
"FR28", "FR28",
"FR29", "FR29",
"FR3", "FR3",
"FR30", "FR30",
"FR31", "FR31",
"FR32", "FR32",
"FR5", "FR5",
"FR6", "FR6",
"FR7", "FR7",
"FR8", "FR8",
"FR9", "FR9",
"FRAMYC", "Framycetin",
"FRUCTO", "Fructose",
"FURALT", "Furaltadone",
"FURAZO", "Furazolidone",
"FUSACI", "Fusidic Acid",
"FUSIDA", "Fusidate",
"GARENO", "Garenoxacin",
"GARLIC", "Garlic",
"GATIFL", "Gatifloxacin",
"GE1000", "Gentamicin 1000 ug/ml",
"GE2000", "Gentamicin 2000 ug/ml",
"GEMIFL", "Gemifloxacin",
"GEN128", "Gentamicin 128 ug/ml",
"GEN500", "Gentamicin 500 ug/ml",
"GENTA1", "Gentamicin 1024 ug/ml",
"GENTAM", "Gentamicin",
"GLUCOS", "Glucose",
"GLYCER", "Glycerol",
"GLYCO", "Glycopeptide class",
"GREPAF", "Grepafloxacin",
"HETACI", "Hetacillin",
"HIPPUR", "Hippurate hydrolysis",
"HODGE", "Hodge Test",
"IB367", "IB-367",
"IBAFLO", "Ibafloxacin",
"ICLAPR", "Iclaprim",
"IMIDAZ", "Imidazole class",
"IMIP32", "Imipenem 32 ug/ml",
"IMIPEN", "Imipenem",
"INDOLE", "Indole",
"INOSIT", "Inositol",
"ISEPAM", "Isepamycin",
"ISONIA", "Isoniazid",
"ISOPEN", "Isoxazolyl Penicillin subclass",
"ITRACO", "Itraconazole",
"JOSAMY", "Josamycin",
"KANAMY", "Kanamycin",
"KETOCO", "Ketoconazole",
"KETOLI", "Ketolide class",
"LEVOFL", "Levofloxacin",
"LINCOM", "Lincomycin",
"LINCOS", "Lincosamide class",
"LINEZO", "Linezolid",
"LINFLO", "Linopristin-Flopristin",
"LINNEO", "Lincomycin/ Neomycin 2:1 ratio",
"LINSPE", "Lincomycin/ Spectinomycin",
"LIPGLY", "Lipoglycopeptide subclass",
"LIPOPE", "Lipopeptide class",
"LOMEFL", "Lomefloxacin",
"LORACA", "Loracarbef",
"LYSINE", "Lysine",
"MACCON", "Growth on MacConkey",
"MACRO", "Macrolide class",
"MALONA", "Malonate",
"MALTOS", "Maltose",
"MANNIT", "Mannitol",
"MARBOF", "Marbofloxacin",
"MECILL", "Mecillinam",
"MEROPE", "Meropenem",
"METHCY", "Methacycline",
"METHIC", "Methicillin",
"METRON", "Metronidazole",
"MEZLO", "Mezlocillin",
"MEZSUL", "Mezlocillin/ Sulbactam",
"MICAFU", "Micafungin",
"MICRON", "Micronomycin",
"MIDEKA", "Midekamycin",
"MINOCY", "Minocycline",
"MONOBA", "Monobactam class",
"MOTILI", "Motility",
"MOXALA", "Moxalactam",
"MOXIFL", "Moxifloxacin",
"MUPIRO", "Mupirocin",
"NAFCIL", "Nafcillin",
"NALAC", "Nalidixic Acid",
"NARASI", "Narasin",
"NEGCTL", "Negative Growth Control",
"NEOMYC", "Neomycin",
"NETILM", "Netilmicin",
"NFURAN", "Nitrofuran class",
"NIMIDA", "Nitroimidazole class",
"NIT16", "Nitrofurantoin 16ul",
"NITFUR", "Nitrofurazone",
"NITRAT", "Nitrate",
"NITRO", "Nitrofurantoin",
"NITSUL", "Nitrofurantoin/ Sulphadrazine",
"NORFLO", "Norfloxacin",
"NOVOBI", "Novobiocin",
"NYSTAN", "Nystantin",
"OFLOXA", "Ofloxacin",
"OLAQUI", "Olaquindox",
"OLEAND", "Oleandomycin",
"OPTOCH", "Optochin Sensitivity",
"ORBIFL", "Orbifloxacin",
"ORITAV", "Oritavancin",
"ORMSUL", "Ormetoprim/ Sulphadimethoxine",
"ORNIST", "Ornithine Spot Test",
"ORNITH", "Ornithine",
"OXACIL", "Oxacillin + 2% NaCl",
"OXAZOL", "Oxazolidinone class",
"OXIDAS", "Oxidase",
"OXOACI", "Oxolinic Acid",
"OXTSCH", "Oxytet/Tylosin Tar/Sulphachlor",
"OXTSDI", "Oxytet/Tylosin Tar/Sulphadimet",
"OXYCEP", "Oxyimino Cephalosporin subclass",
"OXYSCH", "Oxytetracycline/ Sulphachloropy",
"OXYTET", "Oxytetracycline",
"PASRAA", "Para-aminosalicylic acid",
"PEN003", "Penicillin 0.03ug",
"PENCIL", "Penicillin class",
"PENIC8", "Penicillin 8 ug/ml",
"PENICA", "Penicillin 1-2-8 ug/ml",
"PENICI", "Penicillin",
"PENMEN", "Penicillin(meningitis)",
"PENNME", "Penicillin(nonmeningitis)",
"PENNOV", "Penicillin/ Novobiocin",
"PENORA", "Penicillin (Oral)",
"PENSCH", "Penicillin/ Sulphachloropyridaz",
"PENSTR", "Penicillin/ Streptomycin",
"PERFLO", "Perfloxacin",
"PHENIC", "Phenicol class",
"PHEPEN", "Phenoxymethylpenicillin",
"PIGMEN", "Pigment",
"PIPACI", "Pipemidic Acid",
"PIPERA", "Piperacillin",
"PIPTAZ", "Piperacillin/ Tazobactam",
"PIRLIM", "Pirlimycin",
"PIVMEC", "Pivmecillinam",
"PLUERO", "Plueromutilin class",
"POD4", "Cefpodoxime 4 ug/ml",
"PODCLA", "Cefpodoxime/ Clavulanic Acid",
"POLION", "Polyether Ionophore class",
"POLPEP", "Polypeptide class",
"POLYB", "Polymyxin B",
"POSACO", "Posaconazole",
"POSCTL", "Positive Growth Control",
"PREMAF", "Premafloxacin",
"PRISTI", "Pristinamycin",
"PSPEN", "Penicillinase-stable Penicillin class",
"PYRUVA", "Pyruvate",
"QUIN", "Quinolone class",
"QUINOL", "Quinolones",
"QUINS1", "Quinolones subclass 1",
"QUINUP", "Quinupristin",
"R28965", "RU 28965",
"RAFFIN", "Raffinose",
"RAMOPL", "Ramoplanin",
"RAVUCO", "Ravuconazole",
"RAZUPE", "Razupenem",
"RHAMNO", "Rhamnose",
"RIFAMP", "Rifampin",
"RIFMYC", "Rifamycin class",
"ROKITA", "Rokitamycin",
"ROXITH", "Roxithromycin",
"S21420", "Schering 21420",
"S21561", "Schering 21561",
"S21562", "Schering 21562",
"S22591", "Schering 22591",
"S29482", "Schering 29482",
"S29486", "Schering 29486",
"S34343", "Schering 34343",
"S38609", "Schering 38609",
"SALCTL", "Positive Control +2% NaCl",
"SALINO", "Salinomycin",
"SANFET", "Sanfetrinem",
"SARAFL", "Sarafloxacin",
"SB2LB2", "SB265805/ LB20304",
"SBQLO", "SB265805",
"SDIMET", "Sulphadimethoxine",
"SIPRAM", "Sipramycin",
"SISOMY", "Sisomycin",
"SITAFL", "Sitafloxacin",
"SORBIT", "Sorbitol",
"SPARFL", "Sparfloxacin",
"SPECT", "Spectinomycin",
"SPIRAM", "Spiramycin",
"ST1000", "Streptomycin 1000 ug/ml",
"ST2000", "Streptomycin 2000 ug/ml",
"STREPT", "Streptomycin",
"STRGRA", "Streptogramin class",
"SUCROS", "Sucrose",
"SULAMI", "Sulfonamide subclass",
"SULBAC", "Sulbactam",
"SULBEN", "Sulbenicillin",
"SULCHL", "Sulphachloropyridazine",
"SULDIA", "Sulphadiazine",
"SULDIM", "Sulphadimidine",
"SULFAM", "Sulphamethoxazole",
"SULFIZ", "Sulfisoxazole",
"SULMET", "Sulphamethazine",
"SULOPE", "Sulopenem",
"SULTHI", "Sulphathiazole",
"SULTOS", "Sultamicillin Tosilate",
"SYNERC", "Quinupristin/dalfopristin",
"TANNAL", "Tannalbit",
"TAXCLA", "Cefotaxime/clavulanic acid",
"TAXMEN", "Cefotaxime (meningitis)",
"TAXNME", "Cefotaxime (nonmeningitis)",
"TAZCLA", "Ceftazidime/clavulanic acid",
"TAZOBA", "Tazobactam",
"TDA", "TDA",
"TEICOP", "Teicoplanin",
"TELAVA", "Telavancin",
"TELITH", "Telithromycin",
"TEMAFL", "Temafloxacin",
"TEMOCI", "Temocillin",
"TETCYC", "Tetracycline class",
"TETRA", "Tetracycline",
"THIAPH", "Thiaphenicol",
"TIAMUL", "Tiamulin",
"TICARC", "Ticarcillin",
"TICCLA", "Ticarcillin/ Clavulanic Acid",
"TIGECY", "Tigecycline",
"TILMIC", "Tilmicosin",
"TOBRAM", "Tobramycin",
"TOSUFL", "Tosufloxacin",
"TREHAL", "Trehalose",
"TRIBR", "Trimethoprim/ Sulphadiazine",
"TRICLA", "Ceftriaxone/clavulanic acid",
"TRIM", "Trimethoprim",
"TRIMEN", "Ceftriaxone (meningitis)",
"TRINME", "Ceftriaxone (nonmeningitis)",
"TRISUL", "Trimethoprim/ Sulphamethoxazole",
"TROSPE", "Trospectinomycin",
"TROVAF", "Trovafloxacin",
"TULATH", "Tulathromycin",
"TYLO", "Tylosin (Tartrate/ Base)",
"UNDECA", "Undecanoic Acid",
"UREA", "Urea",
"UREPEN", "Ureidopenicillin subclass",
"UVAURS", "Uva Ursa",
"VANCOM", "Vancomycin",
"VIRGIN", "Virginiamycin",
"VORICO", "Voriconazole",
"W49373", "Win 49373-3",
"W49548", "Win 49548-2A",
"W51692", "Win 51692",
"XYLOSE", "Xylose",
"YELPIG", "Yellow Pigment"
"ABT773", "Abbott 773",
"AESCUL", "Aesculin",
"AGMATI", "Agmatine",
"AMDPEN", "Amidinopenicillin subclass",
"AMICYC", "Aminocyclitol class",
"AMIFLO", "Amifloxacin",
"AMIGLY", "Aminoglycoside class",
"AMIKAC", "Amikacin",
"AMIPEN", "Aminopenicillin subclass",
"AMOCL2", "Amoxicillin/ Clav.Acid */2",
"AMOCL4", "Amoxicillin/ Clav. Acid 4:1",
"AMOCLA", "Amoxicillin/ Clavulanic Acid",
"AMOXIC", "Amoxicillin",
"AMP100", "Ampicillin 100 ug/ml",
"AMP200", "Ampicillin 200 ug/ml",
"AMPHOT", "Amphotericin B",
"AMPICI", "Ampicillin",
"AMPSUL", "Ampicillin/ Sulbactam",
"ANIDUL", "Anidulafungin",
"ANSAMY", "Rifabutin",
"ANSMYC", "Ansamycin class",
"APALCI", "Apalcillin",
"APOXIC", "Apoxicillin",
"APRAMY", "Apramycin",
"ARABIN", "Arabinose",
"ARABIT", "Arabitol",
"ARBEKA", "Arbekacin",
"ARGINI", "Arginine",
"ASPOXI", "Aspoxicillin",
"ASTROM", "Astromycin",
"AVILAM", "Avilamycin",
"AZD256", "AZD2563",
"AZITHR", "Azithromycin",
"AZLOCI", "Azlocillin",
"AZT1", "Aztreonam 1 ug/ml",
"AZTREO", "Aztreonam",
"BACAMP", "Bacampicillin",
"BACITR", "Bacitracin",
"BAMMYC", "Bambermycin class",
"BAY12", "BAY12-8039",
"BERBER", "Berberine",
"BESIFL", "Besifloxacin",
"BETA", "Beta-lactamase",
"B", "HAEM Beta-haemolysis",
"BIAPEN", "Biapenem (L-627)",
"BLACT", "Beta-lactam class",
"BLINHB", "Beta-lactam Inhibitor class",
"B", "MGLU B-Methyl Glucoside",
"CAPREO", "Capreomycin",
"CAPRYL", "Caprylic Acid",
"CARBAD", "Carbadox",
"CARBAP", "Carbapenem class",
"CARBEN", "Carbenicillin",
"CARPEN", "Carboxypenicillin subclass",
"CASPOF", "Caspofungin",
"CATALA", "Catalase",
"CCARB", "Carbacephem subclass",
"CEFACL", "Cefaclor",
"CEFADR", "Cefadroxil",
"CEFAMA", "Cefamandole",
"CEFATR", "Cefatrizine",
"CEFAXE", "Cefuroxime (axetil)",
"CEFAZE", "Cefazedon",
"CEFAZO", "Cefazolin",
"CEFBUP", "Cefbuperazone",
"CEFCAP", "Cefcapene",
"CEFCLA", "Cefepime/ Clavulanic Acid",
"CEFCLI", "Cefclidin",
"CEFDIN", "Cefdinir",
"CEFDIT", "Cefditoren",
"CEFEP4", "Cefepime 4 ug/ml",
"CEFEPI", "Cefepime",
"CEFETA", "Cefetamet",
"CEFIXI", "Cefixime",
"CEFMEN", "Cefmenoxime",
"CEFMET", "Cefmetazole",
"CEFMIN", "Cefminox",
"CEFMTM", "Cefmetamet",
"CEFO32", "Cefotaxime 32 ug/ml",
"CEFONI", "Cefonicid",
"CEFOPE", "Cefoperazone",
"CEFORA", "Ceforanide",
"CEFOSE", "Cefoselis",
"CEFOTA", "Cefotaxime",
"CEFOTE", "Cefotetan",
"CEFOTI", "Cefotiam",
"CEFOVE", "Cefovecin",
"CEFOXI", "Cefoxitin",
"CEFOZO", "Cefozopran",
"CEFPAM", "Cefpiramide",
"CEFPIM", "Cefpimizole",
"CEFPOD", "Cefpodoxime",
"CEFPOM", "Cefpirome",
"CEFPRO", "Cefprozil",
"CEFQUI", "Cefquinome",
"CEFROX", "Cefroxidime",
"CEFSUL", "Cefsulodin",
"CEFTAR", "Ceftaroline",
"CEFTAZ", "Ceftazidime",
"CEFTER", "Cefteram",
"CEFTEZ", "Ceftezole",
"CEFTIB", "Ceftibuten",
"CEFTIF", "Ceftiofur",
"CEFTIX", "Ceftioxadine",
"CEFTIZ", "Ceftizoxime",
"CEFTOB", "Ceftobiprole",
"CEFTRI", "Ceftriaxone",
"CEFURO", "Cefuroxime (sodium)",
"CEFUZO", "Cefuzonam",
"CELLOB", "Cellobiose",
"CEPALE", "Cefalexin",
"CEPHAC", "Cephacetril",
"CEPHAL", "Cephalothin",
"CEPHAP", "Cephapirin",
"CEPHEM", "Cephem class",
"CEPHOR", "Cephem (oral) class",
"CEPHPA", "Cephem (parenteral) class",
"CEPHRA", "Cephradine",
"CEPLOR", "Cephaloridine",
"CHLORA", "Chloramphenicol",
"CHLTET", "Chlortetracycline",
"CI983", "CI-983",
"CINOXA", "Cinoxacin",
"CIPROF", "Ciprofloxacin",
"CIPROP", "CIPROP",
"CITRAT", "Citrate",
"CLARYT", "Clarithromycin",
"CLIN32", "Clindamycin 32 ug/ml",
"CLINAF", "Clinafloxacin",
"CLINDA", "Clindamycin",
"CLISPE", "Clindamycin/ Spectinomycin",
"CLOFAM", "Clofazimine",
"CLOXAC", "Cloxacillin",
"CMYC", "Cephamycin subclass",
"COAGUL", "Coagulase",
"COLFAZ", "Colfazamine",
"COLIST", "Colistin",
"COLMET", "Colistimethate",
"COMBO", "Combination class",
"CORAL", "Cephem (oral) class",
"COUMER", "Coumermycin",
"COXA", "Oxacephem subclass",
"CPAREN", "Cephem (parenteral) class",
"CPCA", "Cond. Pyridone Carboxylic Acid class",
"CSPOR", "Cephalosporin class",
"CSPOR1", "Cephalosporin I-Generation subclass",
"CSPOR2", "Cephalosporin II-Generation subclass",
"CSPOR3", "Cephalosporin III-Generation subclass",
"CSPOR4", "Cephalosporin IV-Generation subclass",
"CSPOR5", "Cephalosporin V-Generation subclass",
"CYCLAC", "Cyclacillin",
"CYCLOS", "Cycloserine",
"DALBAV", "Dalbavancin",
"DALFOP", "Dalfopristin",
"DANOFL", "Danofloxacin",
"DAPT25", "Daptomycin 25mg/L Ca",
"DAPT50", "Daptomycin 50mg/L Ca",
"DAPTOM", "Daptomycin",
"DEMECY", "Demeclocycline",
"DIBEKA", "Dibekacin",
"DICLOX", "Dicloxacillin",
"DIFLOX", "Difloxacin",
"DIRITH", "Dirithromycin",
"DORIPE", "Doripenem",
"DOXYCY", "Doxycycline",
"DTEST1", "DTest1",
"DTEST2", "DTest2",
"ENOXA", "Enoxacin",
"ENROFL", "Enrofloxacin",
"ERTAPE", "Ertapenem",
"ERY32", "Erythromycin 32 ug/ml",
"ERYSCH", "Erythromycin/ Sulphachloropyrid",
"ERYSDI", "Erythromycin/ Sulphadimethoxine",
"ERYSPE", "Erythromycin/ Spectinomycin",
"ERYSUL", "Erythromycin/ Sulfizoxazole",
"ERYTH", "Erythromycin",
"ESBL", "Extended spectrum beta-lactamase",
"ETHAMB", "Ethambutol",
"ETHION", "Ethionamide",
"FAROPE", "Faropenem",
"FLAVOM", "Flavomycin",
"FLEROX", "Fleroxacin",
"FLOMOX", "Flomoxef",
"FLORFE", "Florfenicol",
"FLQUIN", "Fluoroquinolone class",
"FLUCLO", "Flucloxacillin",
"FLUCON", "Fluconazole",
"FLUCYT", "5-Flucytosine",
"FLUMEQ", "Flumequine",
"FOPSUL", "Cefoperazone/ Sulbactam",
"FOSFOM", "Fosfomycin",
"FOSG6P", "Fosfomycin + Glucose6Phosphate",
"FOSMYC", "Fosfomycin class",
"FOSTRO", "Fosfomycin-trometamol",
"FOT1", "Cefotaxime 1 ug/ml",
"FOXSCR", "Cefoxitin Screen Test",
"FPINHB", "Folate Pathway Inhibitor class",
"FR1", "FR1",
"FR10", "FR10",
"FR12", "FR12",
"FR13", "FR13",
"FR14", "FR14",
"FR15", "FR15",
"FR16", "FR16",
"FR17", "FR17",
"FR18", "FR18",
"FR19", "FR19",
"FR20", "FR20",
"FR21", "FR21",
"FR22", "FR22",
"FR23", "FR23",
"FR24", "FR24",
"FR25", "FR25",
"FR26", "FR26",
"FR27", "FR27",
"FR28", "FR28",
"FR29", "FR29",
"FR3", "FR3",
"FR30", "FR30",
"FR31", "FR31",
"FR32", "FR32",
"FR5", "FR5",
"FR6", "FR6",
"FR7", "FR7",
"FR8", "FR8",
"FR9", "FR9",
"FRAMYC", "Framycetin",
"FRUCTO", "Fructose",
"FURALT", "Furaltadone",
"FURAZO", "Furazolidone",
"FUSACI", "Fusidic Acid",
"FUSIDA", "Fusidate",
"GARENO", "Garenoxacin",
"GARLIC", "Garlic",
"GATIFL", "Gatifloxacin",
"GE1000", "Gentamicin 1000 ug/ml",
"GE2000", "Gentamicin 2000 ug/ml",
"GEMIFL", "Gemifloxacin",
"GEN128", "Gentamicin 128 ug/ml",
"GEN500", "Gentamicin 500 ug/ml",
"GENTA1", "Gentamicin 1024 ug/ml",
"GENTAM", "Gentamicin",
"GLUCOS", "Glucose",
"GLYCER", "Glycerol",
"GLYCO", "Glycopeptide class",
"GREPAF", "Grepafloxacin",
"HETACI", "Hetacillin",
"HIPPUR", "Hippurate hydrolysis",
"HODGE", "Hodge Test",
"IB367", "IB-367",
"IBAFLO", "Ibafloxacin",
"ICLAPR", "Iclaprim",
"IMIDAZ", "Imidazole class",
"IMIP32", "Imipenem 32 ug/ml",
"IMIPEN", "Imipenem",
"INDOLE", "Indole",
"INOSIT", "Inositol",
"ISEPAM", "Isepamycin",
"ISONIA", "Isoniazid",
"ISOPEN", "Isoxazolyl Penicillin subclass",
"ITRACO", "Itraconazole",
"JOSAMY", "Josamycin",
"KANAMY", "Kanamycin",
"KETOCO", "Ketoconazole",
"KETOLI", "Ketolide class",
"LEVOFL", "Levofloxacin",
"LINCOM", "Lincomycin",
"LINCOS", "Lincosamide class",
"LINEZO", "Linezolid",
"LINFLO", "Linopristin-Flopristin",
"LINNEO", "Lincomycin/ Neomycin 2:1 ratio",
"LINSPE", "Lincomycin/ Spectinomycin",
"LIPGLY", "Lipoglycopeptide subclass",
"LIPOPE", "Lipopeptide class",
"LOMEFL", "Lomefloxacin",
"LORACA", "Loracarbef",
"LYSINE", "Lysine",
"MACCON", "Growth on MacConkey",
"MACRO", "Macrolide class",
"MALONA", "Malonate",
"MALTOS", "Maltose",
"MANNIT", "Mannitol",
"MARBOF", "Marbofloxacin",
"MECILL", "Mecillinam",
"MEROPE", "Meropenem",
"METHCY", "Methacycline",
"METHIC", "Methicillin",
"METRON", "Metronidazole",
"MEZLO", "Mezlocillin",
"MEZSUL", "Mezlocillin/ Sulbactam",
"MICAFU", "Micafungin",
"MICRON", "Micronomycin",
"MIDEKA", "Midekamycin",
"MINOCY", "Minocycline",
"MONOBA", "Monobactam class",
"MOTILI", "Motility",
"MOXALA", "Moxalactam",
"MOXIFL", "Moxifloxacin",
"MUPIRO", "Mupirocin",
"NAFCIL", "Nafcillin",
"NALAC", "Nalidixic Acid",
"NARASI", "Narasin",
"NEGCTL", "Negative Growth Control",
"NEOMYC", "Neomycin",
"NETILM", "Netilmicin",
"NFURAN", "Nitrofuran class",
"NIMIDA", "Nitroimidazole class",
"NIT16", "Nitrofurantoin 16ul",
"NITFUR", "Nitrofurazone",
"NITRAT", "Nitrate",
"NITRO", "Nitrofurantoin",
"NITSUL", "Nitrofurantoin/ Sulphadrazine",
"NORFLO", "Norfloxacin",
"NOVOBI", "Novobiocin",
"NYSTAN", "Nystantin",
"OFLOXA", "Ofloxacin",
"OLAQUI", "Olaquindox",
"OLEAND", "Oleandomycin",
"OPTOCH", "Optochin Sensitivity",
"ORBIFL", "Orbifloxacin",
"ORITAV", "Oritavancin",
"ORMSUL", "Ormetoprim/ Sulphadimethoxine",
"ORNIST", "Ornithine Spot Test",
"ORNITH", "Ornithine",
"OXACIL", "Oxacillin + 2% NaCl",
"OXAZOL", "Oxazolidinone class",
"OXIDAS", "Oxidase",
"OXOACI", "Oxolinic Acid",
"OXTSCH", "Oxytet/Tylosin Tar/Sulphachlor",
"OXTSDI", "Oxytet/Tylosin Tar/Sulphadimet",
"OXYCEP", "Oxyimino Cephalosporin subclass",
"OXYSCH", "Oxytetracycline/ Sulphachloropy",
"OXYTET", "Oxytetracycline",
"PASRAA", "Para-aminosalicylic acid",
"PEN003", "Penicillin 0.03ug",
"PENCIL", "Penicillin class",
"PENIC8", "Penicillin 8 ug/ml",
"PENICA", "Penicillin 1-2-8 ug/ml",
"PENICI", "Penicillin",
"PENMEN", "Penicillin(meningitis)",
"PENNME", "Penicillin(nonmeningitis)",
"PENNOV", "Penicillin/ Novobiocin",
"PENORA", "Penicillin (Oral)",
"PENSCH", "Penicillin/ Sulphachloropyridaz",
"PENSTR", "Penicillin/ Streptomycin",
"PERFLO", "Perfloxacin",
"PHENIC", "Phenicol class",
"PHEPEN", "Phenoxymethylpenicillin",
"PIGMEN", "Pigment",
"PIPACI", "Pipemidic Acid",
"PIPERA", "Piperacillin",
"PIPTAZ", "Piperacillin/ Tazobactam",
"PIRLIM", "Pirlimycin",
"PIVMEC", "Pivmecillinam",
"PLUERO", "Plueromutilin class",
"POD4", "Cefpodoxime 4 ug/ml",
"PODCLA", "Cefpodoxime/ Clavulanic Acid",
"POLION", "Polyether Ionophore class",
"POLPEP", "Polypeptide class",
"POLYB", "Polymyxin B",
"POSACO", "Posaconazole",
"POSCTL", "Positive Growth Control",
"PREMAF", "Premafloxacin",
"PRISTI", "Pristinamycin",
"PSPEN", "Penicillinase-stable Penicillin class",
"PYRUVA", "Pyruvate",
"QUIN", "Quinolone class",
"QUINOL", "Quinolones",
"QUINS1", "Quinolones subclass 1",
"QUINUP", "Quinupristin",
"R28965", "RU 28965",
"RAFFIN", "Raffinose",
"RAMOPL", "Ramoplanin",
"RAVUCO", "Ravuconazole",
"RAZUPE", "Razupenem",
"RHAMNO", "Rhamnose",
"RIFAMP", "Rifampin",
"RIFMYC", "Rifamycin class",
"ROKITA", "Rokitamycin",
"ROXITH", "Roxithromycin",
"S21420", "Schering 21420",
"S21561", "Schering 21561",
"S21562", "Schering 21562",
"S22591", "Schering 22591",
"S29482", "Schering 29482",
"S29486", "Schering 29486",
"S34343", "Schering 34343",
"S38609", "Schering 38609",
"SALCTL", "Positive Control +2% NaCl",
"SALINO", "Salinomycin",
"SANFET", "Sanfetrinem",
"SARAFL", "Sarafloxacin",
"SB2LB2", "SB265805/ LB20304",
"SBQLO", "SB265805",
"SDIMET", "Sulphadimethoxine",
"SIPRAM", "Sipramycin",
"SISOMY", "Sisomycin",
"SITAFL", "Sitafloxacin",
"SORBIT", "Sorbitol",
"SPARFL", "Sparfloxacin",
"SPECT", "Spectinomycin",
"SPIRAM", "Spiramycin",
"ST1000", "Streptomycin 1000 ug/ml",
"ST2000", "Streptomycin 2000 ug/ml",
"STREPT", "Streptomycin",
"STRGRA", "Streptogramin class",
"SUCROS", "Sucrose",
"SULAMI", "Sulfonamide subclass",
"SULBAC", "Sulbactam",
"SULBEN", "Sulbenicillin",
"SULCHL", "Sulphachloropyridazine",
"SULDIA", "Sulphadiazine",
"SULDIM", "Sulphadimidine",
"SULFAM", "Sulphamethoxazole",
"SULFIZ", "Sulfisoxazole",
"SULMET", "Sulphamethazine",
"SULOPE", "Sulopenem",
"SULTHI", "Sulphathiazole",
"SULTOS", "Sultamicillin Tosilate",
"SYNERC", "Quinupristin/dalfopristin",
"TANNAL", "Tannalbit",
"TAXCLA", "Cefotaxime/clavulanic acid",
"TAXMEN", "Cefotaxime (meningitis)",
"TAXNME", "Cefotaxime (nonmeningitis)",
"TAZCLA", "Ceftazidime/clavulanic acid",
"TAZOBA", "Tazobactam",
"TDA", "TDA",
"TEICOP", "Teicoplanin",
"TELAVA", "Telavancin",
"TELITH", "Telithromycin",
"TEMAFL", "Temafloxacin",
"TEMOCI", "Temocillin",
"TETCYC", "Tetracycline class",
"TETRA", "Tetracycline",
"THIAPH", "Thiaphenicol",
"TIAMUL", "Tiamulin",
"TICARC", "Ticarcillin",
"TICCLA", "Ticarcillin/ Clavulanic Acid",
"TIGECY", "Tigecycline",
"TILMIC", "Tilmicosin",
"TOBRAM", "Tobramycin",
"TOSUFL", "Tosufloxacin",
"TREHAL", "Trehalose",
"TRIBR", "Trimethoprim/ Sulphadiazine",
"TRICLA", "Ceftriaxone/clavulanic acid",
"TRIM", "Trimethoprim",
"TRIMEN", "Ceftriaxone (meningitis)",
"TRINME", "Ceftriaxone (nonmeningitis)",
"TRISUL", "Trimethoprim/ Sulphamethoxazole",
"TROSPE", "Trospectinomycin",
"TROVAF", "Trovafloxacin",
"TULATH", "Tulathromycin",
"TYLO", "Tylosin (Tartrate/ Base)",
"UNDECA", "Undecanoic Acid",
"UREA", "Urea",
"UREPEN", "Ureidopenicillin subclass",
"UVAURS", "Uva Ursa",
"VANCOM", "Vancomycin",
"VIRGIN", "Virginiamycin",
"VORICO", "Voriconazole",
"W49373", "Win 49373-3",
"W49548", "Win 49548-2A",
"W51692", "Win 51692",
"XYLOSE", "Xylose",
"YELPIG", "Yellow Pigment"
)
codes$name <- gsub("Apoxi", "Aspoxi", codes$name)
@@ -476,10 +476,10 @@ codes$ab_name <- ab_name(codes$name_gen)
codes$lev <- unlist(Map(f = function(a, b) {
as.double(utils::adist(a, b,
ignore.case = FALSE,
fixed = TRUE,
costs = c(insertions = 5, deletions = 1, substitutions = 10),
counts = FALSE
ignore.case = FALSE,
fixed = TRUE,
costs = c(insertions = 5, deletions = 1, substitutions = 10),
counts = FALSE
))
}, codes$name_gen, generalise_antibiotic_name(codes$ab_name), USE.NAMES = FALSE))
@@ -487,7 +487,10 @@ codes$lev_pct <- codes$lev / nchar(codes$name)
View(codes)
import <- codes |> filter(lev <= 10 | name_gen == "PENICILLIN") |> as_tibble() |> mutate(ab = as.ab(ab_name, fast_mode = TRUE))
import <- codes |>
filter(lev <= 10 | name_gen == "PENICILLIN") |>
as_tibble() |>
mutate(ab = as.ab(ab_name, fast_mode = TRUE))
for (i in seq_len(NROW(import))) {
# put them in the abbreviations

View File

@@ -1056,8 +1056,10 @@ import$mo <- as.mo(import$mo_name)
microorganisms.codes <- microorganisms.codes |>
bind_rows(
tibble(code = toupper(import$code),
mo = import$mo) |>
tibble(
code = toupper(import$code),
mo = import$mo
) |>
distinct()
) |>
arrange(code)
@@ -1065,4 +1067,3 @@ class(microorganisms.codes$mo) <- c("mo", "character")
usethis::use_data(microorganisms.codes, overwrite = TRUE, compress = "xz", version = 2)
rm(microorganisms.codes)
devtools::load_all()

View File

@@ -3,13 +3,15 @@ df <- example_isolates |>
mutate(mo = ifelse(mo_genus(mo) == "Klebsiella", as.mo("Klebsiella"), mo)) |>
top_n_microorganisms(10)
out_new <- df |> antibiogram(c("TZP","TZP+GEN","TZP+TOB"), wisca = TRUE, syndromic_group = "ward")
out_nonwisca <- df |> antibiogram(c("TZP","TZP+GEN","TZP+TOB"),
syndromic_group = "ward",
mo_transform = function(x) "",
digits = 1,
minimum = 10,
formatting_type = 14) |>
out_new <- df |> antibiogram(c("TZP", "TZP+GEN", "TZP+TOB"), wisca = TRUE, syndromic_group = "ward")
out_nonwisca <- df |>
antibiogram(c("TZP", "TZP+GEN", "TZP+TOB"),
syndromic_group = "ward",
mo_transform = function(x) "",
digits = 1,
minimum = 10,
formatting_type = 14
) |>
as_tibble() |>
select(-Pathogen)
@@ -17,7 +19,3 @@ out_nonwisca <- df |> antibiogram(c("TZP","TZP+GEN","TZP+TOB"),
# parameters_amr.R: number of first isolates are determined on the whole data set, while Klebsiella is aggregated afterwards (=duplicates on genus level)
source("~/Downloads/estimate_definition_amr.R")

View File

@@ -12,7 +12,7 @@ This is an overview of all the package-specific options you can set in the \code
\itemize{
\item \code{AMR_antibiogram_formatting_type} \cr A \link{numeric} (1-22) to use in \code{\link[=antibiogram]{antibiogram()}}, to indicate which formatting type to use.
\item \code{AMR_breakpoint_type} \cr A \link{character} to use in \code{\link[=as.sir]{as.sir()}}, to indicate which breakpoint type to use. This must be either {.val ECOFF}, {.val animal}, or {.val human}.
\item \code{AMR_breakpoint_type} \cr A \link{character} to use in \code{\link[=as.sir]{as.sir()}}, to indicate which breakpoint type to use. This must be either \code{"ECOFF"}, \code{"animal"}, or \code{"human"}.
\item \code{AMR_capped_mic_handling} \cr A \link{character} to use in \code{\link[=as.sir]{as.sir()}}, to indicate how capped MIC values (\code{<}, \code{<=}, \code{>}, \code{>=}) should be interpreted. Must be one of \code{"none"}, \code{"conservative"}, \code{"standard"}, or \code{"lenient"} - the default is \code{"conservative"}.
\item \code{AMR_cleaning_regex} \cr A \link[base:regex]{regular expression} (case-insensitive) to use in \code{\link[=as.mo]{as.mo()}} and all \code{\link[=mo_property]{mo_*}} functions, to clean the user input. The default is the outcome of \code{\link[=mo_cleaning_regex]{mo_cleaning_regex()}}, which removes texts between brackets and texts such as "species" and "serovar".
\item \code{AMR_custom_ab} \cr A file location to an RDS file, to use custom antimicrobial drugs with this package. This is explained in \code{\link[=add_custom_antimicrobials]{add_custom_antimicrobials()}}.

View File

@@ -67,7 +67,7 @@ set_ab_names(data, ..., property = "name", language = get_AMR_locale(),
\item{open}{Browse the URL using \code{\link[utils:browseURL]{utils::browseURL()}}.}
\item{property}{One of the column names of one of the \link{antimicrobials} data set: \code{vector_or(colnames(antimicrobials), sort = FALSE)}.}
\item{property}{One of the column names of one of the \link{antimicrobials} data set: \code{"ab"}, \code{"cid"}, \code{"name"}, \code{"group"}, \code{"atc"}, \code{"atc_group1"}, \code{"atc_group2"}, \code{"abbreviations"}, \code{"synonyms"}, \code{"oral_ddd"}, \code{"oral_units"}, \code{"iv_ddd"}, \code{"iv_units"}, or \code{"loinc"}.}
\item{data}{A \link{data.frame} of which the columns need to be renamed, or a \link{character} vector of column names.}

View File

@@ -68,9 +68,9 @@ retrieve_wisca_parameters(wisca_model, ...)
}
}}
\item{mo_transform}{A character to transform microorganism input - must be \code{"name"}, \code{"shortname"} (default), \code{"gramstain"}, or one of the column names of the \link{microorganisms} data set: {.val mo}, {.val fullname}, {.val status}, {.val kingdom}, {.val phylum}, {.val class}, {.val order}, {.val family}, {.val genus}, {.val species}, {.val subspecies}, {.val rank}, {.val ref}, {.val oxygen_tolerance}, {.val source}, {.val lpsn}, {.val lpsn_parent}, {.val lpsn_renamed_to}, {.val mycobank}, {.val mycobank_parent}, {.val mycobank_renamed_to}, {.val gbif}, {.val gbif_parent}, {.val gbif_renamed_to}, {.val prevalence}, or {.val snomed}. Can also be \code{NULL} to not transform the input or \code{NA} to consider all microorganisms 'unknown'.}
\item{mo_transform}{A character to transform microorganism input - must be \code{"name"}, \code{"shortname"} (default), \code{"gramstain"}, or one of the column names of the \link{microorganisms} data set: \code{"mo"}, \code{"fullname"}, \code{"status"}, \code{"kingdom"}, \code{"phylum"}, \code{"class"}, \code{"order"}, \code{"family"}, \code{"genus"}, \code{"species"}, \code{"subspecies"}, \code{"rank"}, \code{"ref"}, \code{"oxygen_tolerance"}, \code{"source"}, \code{"lpsn"}, \code{"lpsn_parent"}, \code{"lpsn_renamed_to"}, \code{"mycobank"}, \code{"mycobank_parent"}, \code{"mycobank_renamed_to"}, \code{"gbif"}, \code{"gbif_parent"}, \code{"gbif_renamed_to"}, \code{"prevalence"}, or \code{"snomed"}. Can also be \code{NULL} to not transform the input or \code{NA} to consider all microorganisms 'unknown'.}
\item{ab_transform}{A character to transform antimicrobial input - must be one of the column names of the \link{antimicrobials} data set (defaults to \code{"name"}): {.val ab}, {.val cid}, {.val name}, {.val group}, {.val atc}, {.val atc_group1}, {.val atc_group2}, {.val abbreviations}, {.val synonyms}, {.val oral_ddd}, {.val oral_units}, {.val iv_ddd}, {.val iv_units}, or {.val loinc}. Can also be \code{NULL} to not transform the input.}
\item{ab_transform}{A character to transform antimicrobial input - must be one of the column names of the \link{antimicrobials} data set (defaults to \code{"name"}): \code{"ab"}, \code{"cid"}, \code{"name"}, \code{"group"}, \code{"atc"}, \code{"atc_group1"}, \code{"atc_group2"}, \code{"abbreviations"}, \code{"synonyms"}, \code{"oral_ddd"}, \code{"oral_units"}, \code{"iv_ddd"}, \code{"iv_units"}, or \code{"loinc"}. Can also be \code{NULL} to not transform the input.}
\item{syndromic_group}{A column name of \code{x}, or values calculated to split rows of \code{x}, e.g. by using \code{\link[=ifelse]{ifelse()}} or \code{\link[dplyr:case-and-replace-when]{case_when()}}. See \emph{Examples}.}

View File

@@ -157,7 +157,7 @@ not_intrinsic_resistant(only_sir_columns = FALSE, col_mo = NULL,
\item{col_mo}{Column name of the names or codes of the microorganisms (see \code{\link[=as.mo]{as.mo()}}) - the default is the first column of class \code{\link{mo}}. Values will be coerced using \code{\link[=as.mo]{as.mo()}}.}
\item{version_expected_phenotypes}{The version number to use for the EUCAST Expected Phenotypes. Can be {.val 1.2}.}
\item{version_expected_phenotypes}{The version number to use for the EUCAST Expected Phenotypes. Can be \code{"1.2"}.}
}
\value{
When used inside selecting or filtering, this returns a \link{character} vector of column names, with additional class \code{"amr_selector"}. When used individually, this returns an \link[=as.ab]{'ab' vector} with all possible antimicrobials that the function would be able to select or filter.

View File

@@ -138,7 +138,7 @@ The default \code{"conservative"} setting ensures cautious handling of uncertain
\item{include_PKPD}{A \link{logical} to indicate that PK/PD clinical breakpoints must be applied as a last resort - the default is \code{TRUE}. Can also be set with the package option \code{\link[=AMR-options]{AMR_include_PKPD}}.}
\item{breakpoint_type}{The type of breakpoints to use, either {.val ECOFF}, {.val animal}, or {.val human}. ECOFF stands for Epidemiological Cut-Off values. The default is \code{"human"}, which can also be set with the package option \code{\link[=AMR-options]{AMR_breakpoint_type}}. If \code{host} is set to values of veterinary species, this will automatically be set to \code{"animal"}.}
\item{breakpoint_type}{The type of breakpoints to use, either \code{"ECOFF"}, \code{"animal"}, or \code{"human"}. ECOFF stands for Epidemiological Cut-Off values. The default is \code{"human"}, which can also be set with the package option \code{\link[=AMR-options]{AMR_breakpoint_type}}. If \code{host} is set to values of veterinary species, this will automatically be set to \code{"animal"}.}
\item{host}{A vector (or column name) with \link{character}s to indicate the host. Only useful for veterinary breakpoints, as it requires \code{breakpoint_type = "animal"}. The values can be any text resembling the animal species, even in any of the 28 supported languages of this package. For foreign languages, be sure to set the language with \code{\link[=set_AMR_locale]{set_AMR_locale()}} (though it will be automatically guessed based on the system language).}

View File

@@ -52,7 +52,7 @@ av_property(x, property = "name", language = get_AMR_locale(), ...)
\item{open}{Browse the URL using \code{\link[utils:browseURL]{utils::browseURL()}}.}
\item{property}{One of the column names of one of the \link{antivirals} data set: \code{vector_or(colnames(antivirals), sort = FALSE)}.}
\item{property}{One of the column names of one of the \link{antivirals} data set: \code{"av"}, \code{"name"}, \code{"atc"}, \code{"cid"}, \code{"atc_group"}, \code{"synonyms"}, \code{"oral_ddd"}, \code{"oral_units"}, \code{"iv_ddd"}, \code{"iv_units"}, or \code{"loinc"}.}
}
\value{
\itemize{

View File

@@ -54,9 +54,9 @@ eucast_dosage(ab, administration = "iv", version_breakpoints = 15)
\item{version_breakpoints}{The version number to use for the EUCAST Clinical Breakpoints guideline. Can be \code{"16.0"}, \code{"15.0"}, \code{"14.0"}, \code{"13.1"}, \code{"12.0"}, \code{"11.0"}, or \code{"10.0"}.}
\item{version_expected_phenotypes}{The version number to use for the EUCAST Expected Phenotypes. Can be {.val 1.2}.}
\item{version_expected_phenotypes}{The version number to use for the EUCAST Expected Phenotypes. Can be \code{"1.2"}.}
\item{version_expertrules}{The version number to use for the EUCAST Expert Rules and Intrinsic Resistance guideline. Can be {.val 3.3}, {.val 3.2}, or {.val 3.1}.}
\item{version_expertrules}{The version number to use for the EUCAST Expert Rules and Intrinsic Resistance guideline. Can be \code{"3.3"}, \code{"3.2"}, or \code{"3.1"}.}
\item{ampc_cephalosporin_resistance}{(only applies when \code{rules} contains \code{"expert"} or \code{"all"}) a \link{character} value that should be applied to cefotaxime, ceftriaxone and ceftazidime for AmpC de-repressed cephalosporin-resistant mutants - the default is \code{NA}. Currently only works when \code{version_expertrules} is \code{3.2} and higher; these versions of '\emph{EUCAST Expert Rules on Enterobacterales}' state that results of cefotaxime, ceftriaxone and ceftazidime should be reported with a note, or results should be suppressed (emptied) for these three drugs. A value of \code{NA} (the default) for this argument will remove results for these three drugs, while e.g. a value of \code{"R"} will make the results for these drugs resistant. Use \code{NULL} or \code{FALSE} to not alter results for these three drugs of AmpC de-repressed cephalosporin-resistant mutants. Using \code{TRUE} is equal to using \code{"R"}. \cr For \emph{EUCAST Expert Rules} v3.2, this rule applies to: \emph{Citrobacter braakii}, \emph{Citrobacter freundii}, \emph{Citrobacter gillenii}, \emph{Citrobacter murliniae}, \emph{Citrobacter rodenticum}, \emph{Citrobacter sedlakii}, \emph{Citrobacter werkmanii}, \emph{Citrobacter youngae}, \emph{Enterobacter}, \emph{Hafnia alvei}, \emph{Klebsiella aerogenes}, \emph{Morganella morganii}, \emph{Providencia}, and \emph{Serratia}.}
@@ -72,7 +72,7 @@ eucast_dosage(ab, administration = "iv", version_breakpoints = 15)
\item{ab}{Any (vector of) text that can be coerced to a valid antimicrobial drug code with \code{\link[=as.ab]{as.ab()}}.}
\item{administration}{Route of administration, either {.val }, {.val im}, {.val iv}, {.val oral}, or NA.}
\item{administration}{Route of administration, either \code{""}, \code{"im"}, \code{"iv"}, \code{"oral"}, or NA.}
}
\value{
The input of \code{x}, possibly with edited values of antimicrobials. Or, if \code{verbose = TRUE}, a \link{data.frame} with all original and new values of the affected bug-drug combinations.

View File

@@ -165,7 +165,7 @@ The default is \code{FALSE}, which will return a note if outdated taxonomic name
\item{open}{Browse the URL using \code{\link[utils:browseURL]{browseURL()}}.}
\item{property}{One of the column names of the \link{microorganisms} data set: {.val mo}, {.val fullname}, {.val status}, {.val kingdom}, {.val phylum}, {.val class}, {.val order}, {.val family}, {.val genus}, {.val species}, {.val subspecies}, {.val rank}, {.val ref}, {.val oxygen_tolerance}, {.val source}, {.val lpsn}, {.val lpsn_parent}, {.val lpsn_renamed_to}, {.val mycobank}, {.val mycobank_parent}, {.val mycobank_renamed_to}, {.val gbif}, {.val gbif_parent}, {.val gbif_renamed_to}, {.val prevalence}, or {.val snomed}, or must be \code{"shortname"}.}
\item{property}{One of the column names of the \link{microorganisms} data set: \code{"mo"}, \code{"fullname"}, \code{"status"}, \code{"kingdom"}, \code{"phylum"}, \code{"class"}, \code{"order"}, \code{"family"}, \code{"genus"}, \code{"species"}, \code{"subspecies"}, \code{"rank"}, \code{"ref"}, \code{"oxygen_tolerance"}, \code{"source"}, \code{"lpsn"}, \code{"lpsn_parent"}, \code{"lpsn_renamed_to"}, \code{"mycobank"}, \code{"mycobank_parent"}, \code{"mycobank_renamed_to"}, \code{"gbif"}, \code{"gbif_parent"}, \code{"gbif_renamed_to"}, \code{"prevalence"}, or \code{"snomed"}, or must be \code{"shortname"}.}
}
\value{
\itemize{

View File

@@ -137,7 +137,7 @@ labels_sir_count(position = NULL, x = "antibiotic",
\item{include_PKPD}{A \link{logical} to indicate that PK/PD clinical breakpoints must be applied as a last resort - the default is \code{TRUE}. Can also be set with the package option \code{\link[=AMR-options]{AMR_include_PKPD}}.}
\item{breakpoint_type}{The type of breakpoints to use, either {.val ECOFF}, {.val animal}, or {.val human}. ECOFF stands for Epidemiological Cut-Off values. The default is \code{"human"}, which can also be set with the package option \code{\link[=AMR-options]{AMR_breakpoint_type}}. If \code{host} is set to values of veterinary species, this will automatically be set to \code{"animal"}.}
\item{breakpoint_type}{The type of breakpoints to use, either \code{"ECOFF"}, \code{"animal"}, or \code{"human"}. ECOFF stands for Epidemiological Cut-Off values. The default is \code{"human"}, which can also be set with the package option \code{\link[=AMR-options]{AMR_breakpoint_type}}. If \code{host} is set to values of veterinary species, this will automatically be set to \code{"animal"}.}
\item{facet}{Variable to split plots by, either \code{"interpretation"} (default) or \code{"antibiotic"} or a grouping variable.}

View File

@@ -12,7 +12,7 @@ top_n_microorganisms(x, n, property = "species", n_for_each = NULL,
\item{n}{An integer specifying the maximum number of unique values of the \code{property} to include in the output.}
\item{property}{A character string indicating the microorganism property to use for filtering. Must be one of the column names of the \link{microorganisms} data set: {.val mo}, {.val fullname}, {.val status}, {.val kingdom}, {.val phylum}, {.val class}, {.val order}, {.val family}, {.val genus}, {.val species}, {.val subspecies}, {.val rank}, {.val ref}, {.val oxygen_tolerance}, {.val source}, {.val lpsn}, {.val lpsn_parent}, {.val lpsn_renamed_to}, {.val mycobank}, {.val mycobank_parent}, {.val mycobank_renamed_to}, {.val gbif}, {.val gbif_parent}, {.val gbif_renamed_to}, {.val prevalence}, or {.val snomed}. If \code{NULL}, the raw values from \code{col_mo} will be used without transformation. When using \code{"species"} (default) or \code{"subpecies"}, the genus will be added to make sure each (sub)species still belongs to the right genus.}
\item{property}{A character string indicating the microorganism property to use for filtering. Must be one of the column names of the \link{microorganisms} data set: \code{"mo"}, \code{"fullname"}, \code{"status"}, \code{"kingdom"}, \code{"phylum"}, \code{"class"}, \code{"order"}, \code{"family"}, \code{"genus"}, \code{"species"}, \code{"subspecies"}, \code{"rank"}, \code{"ref"}, \code{"oxygen_tolerance"}, \code{"source"}, \code{"lpsn"}, \code{"lpsn_parent"}, \code{"lpsn_renamed_to"}, \code{"mycobank"}, \code{"mycobank_parent"}, \code{"mycobank_renamed_to"}, \code{"gbif"}, \code{"gbif_parent"}, \code{"gbif_renamed_to"}, \code{"prevalence"}, or \code{"snomed"}. If \code{NULL}, the raw values from \code{col_mo} will be used without transformation. When using \code{"species"} (default) or \code{"subpecies"}, the genus will be added to make sure each (sub)species still belongs to the right genus.}
\item{n_for_each}{An optional integer specifying the maximum number of rows to retain for each value of the selected property. If \code{NULL}, all rows within the top \emph{n} groups will be included.}

View File

@@ -268,7 +268,8 @@ To create a traditional antibiogram, simply state which antibiotics should be us
```{r trad}
antibiogram(example_isolates,
antibiotics = c(aminoglycosides(), carbapenems()))
antibiotics = c(aminoglycosides(), carbapenems())
)
```
Notice that the `antibiogram()` function automatically prints in the right format when using Quarto or R Markdown (such as this page), and even applies italics for taxonomic names (by using `italicise_taxonomy()` internally).
@@ -277,10 +278,11 @@ It also uses the language of your OS if this is either `r AMR:::vector_or(vapply
```{r trad2}
antibiogram(example_isolates,
mo_transform = "gramstain",
antibiotics = aminoglycosides(),
ab_transform = "name",
language = "es")
mo_transform = "gramstain",
antibiotics = aminoglycosides(),
ab_transform = "name",
language = "es"
)
```
### Combined Antibiogram
@@ -289,8 +291,9 @@ To create a combined antibiogram, use antibiotic codes or names with a plus `+`
```{r comb}
combined_ab <- antibiogram(example_isolates,
antibiotics = c("TZP", "TZP+TOB", "TZP+GEN"),
ab_transform = NULL)
antibiotics = c("TZP", "TZP+TOB", "TZP+GEN"),
ab_transform = NULL
)
combined_ab
```
@@ -300,8 +303,9 @@ To create a syndromic antibiogram, the `syndromic_group` argument must be used.
```{r synd}
antibiogram(example_isolates,
antibiotics = c(aminoglycosides(), carbapenems()),
syndromic_group = "ward")
antibiotics = c(aminoglycosides(), carbapenems()),
syndromic_group = "ward"
)
```
### Weighted-Incidence Syndromic Combination Antibiogram (WISCA)
@@ -310,8 +314,10 @@ To create a **Weighted-Incidence Syndromic Combination Antibiogram (WISCA)**, si
```{r wisca}
example_isolates %>%
wisca(antibiotics = c("TZP", "TZP+TOB", "TZP+GEN"),
minimum = 10) # Recommended threshold: ≥30
wisca(
antibiotics = c("TZP", "TZP+TOB", "TZP+GEN"),
minimum = 10
) # Recommended threshold: ≥30
```
WISCA uses a **Bayesian decision model** to integrate data from multiple pathogens, improving empirical therapy guidance, especially for low-incidence infections. It is **pathogen-agnostic**, meaning results are syndrome-based rather than stratified by microorganism.
@@ -323,8 +329,10 @@ For **patient- or syndrome-specific WISCA**, run the function on a grouped `tibb
```{r wisca_grouped}
example_isolates %>%
top_n_microorganisms(n = 10) %>%
group_by(age_group = age_groups(age, c(25, 50, 75)),
gender) %>%
group_by(
age_group = age_groups(age, c(25, 50, 75)),
gender
) %>%
wisca(antibiotics = c("TZP", "TZP+TOB", "TZP+GEN"))
```
@@ -381,15 +389,19 @@ We can visualise MIC distributions and their SIR interpretations using `ggplot2`
# add a group
my_data$group <- rep(c("A", "B", "C", "D"), each = 25)
ggplot(my_data,
aes(x = group, y = MIC, colour = SIR)) +
ggplot(
my_data,
aes(x = group, y = MIC, colour = SIR)
) +
geom_jitter(width = 0.2, size = 2) +
geom_boxplot(fill = NA, colour = "grey40") +
scale_y_mic() +
scale_colour_sir() +
labs(title = "MIC Distribution and SIR Interpretation",
x = "Sample Groups",
y = "MIC (mg/L)")
labs(
title = "MIC Distribution and SIR Interpretation",
x = "Sample Groups",
y = "MIC (mg/L)"
)
```
This plot provides an intuitive way to assess susceptibility patterns across different groups while incorporating clinical breakpoints.

View File

@@ -53,8 +53,8 @@ We begin by loading the required libraries and preparing the `example_isolates`
```{r lib packages, message = FALSE, warning = FALSE, results = 'asis'}
# Load required libraries
library(AMR) # For AMR data analysis
library(tidymodels) # For machine learning workflows, and data manipulation (dplyr, tidyr, ...)
library(AMR) # For AMR data analysis
library(tidymodels) # For machine learning workflows, and data manipulation (dplyr, tidyr, ...)
```
Prepare the data:
@@ -68,13 +68,19 @@ data <- example_isolates %>%
# select AB results dynamically
select(mo, aminoglycosides(), betalactams()) %>%
# replace NAs with NI (not-interpretable)
mutate(across(where(is.sir),
~replace_na(.x, "NI")),
# make factors of SIR columns
across(where(is.sir),
as.integer),
# get Gramstain of microorganisms
mo = as.factor(mo_gramstain(mo))) %>%
mutate(
across(
where(is.sir),
~ replace_na(.x, "NI")
),
# make factors of SIR columns
across(
where(is.sir),
as.integer
),
# get Gramstain of microorganisms
mo = as.factor(mo_gramstain(mo))
) %>%
# drop NAs - the ones without a Gramstain (fungi, etc.)
drop_na()
```
@@ -149,7 +155,7 @@ To train the model, we split the data into training and testing sets. Then, we f
set.seed(123) # For reproducibility
data_split <- initial_split(data, prop = 0.8) # 80% training, 20% testing
training_data <- training(data_split) # Training set
testing_data <- testing(data_split) # Testing set
testing_data <- testing(data_split) # Testing set
# Fit the workflow to the training data
fitted_workflow <- resistance_workflow %>%
@@ -168,7 +174,7 @@ Next, we evaluate the model on the testing data.
```{r}
# Make predictions on the testing set
predictions <- fitted_workflow %>%
predict(testing_data) # Generate predictions
predict(testing_data) # Generate predictions
probabilities <- fitted_workflow %>%
predict(testing_data, type = "prob") # Generate probabilities
@@ -266,8 +272,8 @@ testing_data <- testing(split)
# Define the recipe
mic_recipe <- recipe(esbl ~ ., data = training_data) %>%
remove_role(genus, old_role = "predictor") %>% # Remove non-informative variable
step_mic_log2(all_mic_predictors()) # Log2 transform all MIC predictors
remove_role(genus, old_role = "predictor") %>% # Remove non-informative variable
step_mic_log2(all_mic_predictors()) # Log2 transform all MIC predictors
prep(mic_recipe)
```
@@ -341,9 +347,11 @@ library(ggplot2)
ggplot(predictions, aes(x = esbl, fill = .pred_class)) +
geom_bar(position = "stack") +
labs(title = "Predicted vs Actual ESBL Status",
x = "Actual ESBL",
y = "Count") +
labs(
title = "Predicted vs Actual ESBL Status",
x = "Actual ESBL",
y = "Count"
) +
theme_minimal()
```
@@ -351,18 +359,27 @@ And plot the certainties too - how certain were the actual predictions?
```{r}
predictions %>%
mutate(certainty = ifelse(.pred_class == "FALSE",
.pred_FALSE,
.pred_TRUE),
correct = ifelse(esbl == .pred_class, "Right", "Wrong")) %>%
ggplot(aes(x = seq_len(nrow(predictions)),
y = certainty,
colour = correct)) +
scale_colour_manual(values = c(Right = "green3", Wrong = "red2"),
name = "Correct?") +
mutate(
certainty = ifelse(.pred_class == "FALSE",
.pred_FALSE,
.pred_TRUE
),
correct = ifelse(esbl == .pred_class, "Right", "Wrong")
) %>%
ggplot(aes(
x = seq_len(nrow(predictions)),
y = certainty,
colour = correct
)) +
scale_colour_manual(
values = c(Right = "green3", Wrong = "red2"),
name = "Correct?"
) +
geom_point() +
scale_y_continuous(labels = function(x) paste0(x * 100, "%"),
limits = c(0.5, 1)) +
scale_y_continuous(
labels = function(x) paste0(x * 100, "%"),
limits = c(0.5, 1)
) +
theme_minimal()
```
@@ -399,13 +416,18 @@ library(tidymodels)
# Transform dataset
data_time <- example_isolates %>%
top_n_microorganisms(n = 10) %>% # Filter on the top #10 species
mutate(year = as.integer(format(date, "%Y")), # Extract year from date
gramstain = mo_gramstain(mo)) %>% # Get taxonomic names
mutate(
year = as.integer(format(date, "%Y")), # Extract year from date
gramstain = mo_gramstain(mo)
) %>% # Get taxonomic names
group_by(year, gramstain) %>%
summarise(across(c(AMX, AMC, CIP),
function(x) resistance(x, minimum = 0),
.names = "res_{.col}"),
.groups = "drop") %>%
summarise(
across(c(AMX, AMC, CIP),
function(x) resistance(x, minimum = 0),
.names = "res_{.col}"
),
.groups = "drop"
) %>%
filter(!is.na(res_AMX) & !is.na(res_AMC) & !is.na(res_CIP)) # Drop missing values
data_time
@@ -426,9 +448,9 @@ We now define the modelling workflow, which consists of a preprocessing step, a
```{r}
# Define the recipe
resistance_recipe_time <- recipe(res_AMX ~ year + gramstain, data = data_time) %>%
step_dummy(gramstain, one_hot = TRUE) %>% # Convert categorical to numerical
step_normalize(year) %>% # Normalise year for better model performance
step_nzv(all_predictors()) # Remove near-zero variance predictors
step_dummy(gramstain, one_hot = TRUE) %>% # Convert categorical to numerical
step_normalize(year) %>% # Normalise year for better model performance
step_nzv(all_predictors()) # Remove near-zero variance predictors
resistance_recipe_time
```
@@ -514,9 +536,11 @@ library(ggplot2)
ggplot(predictions_time, aes(x = year)) +
geom_point(aes(y = res_AMX, color = "Actual")) +
geom_line(aes(y = .pred, color = "Predicted")) +
labs(title = "Predicted vs Actual AMX Resistance Over Time",
x = "Year",
y = "Resistance Proportion") +
labs(
title = "Predicted vs Actual AMX Resistance Over Time",
x = "Year",
y = "Resistance Proportion"
) +
theme_minimal()
```
@@ -525,13 +549,17 @@ Additionally, we can visualise resistance trends in `ggplot2` and directly add l
```{r}
ggplot(data_time, aes(x = year, y = res_AMX, color = gramstain)) +
geom_line() +
labs(title = "AMX Resistance Trends",
x = "Year",
y = "Resistance Proportion") +
labs(
title = "AMX Resistance Trends",
x = "Year",
y = "Resistance Proportion"
) +
# add a linear model directly in ggplot2:
geom_smooth(method = "lm",
formula = y ~ x,
alpha = 0.25) +
geom_smooth(
method = "lm",
formula = y ~ x,
alpha = 0.25
) +
theme_minimal()
```

View File

@@ -80,7 +80,7 @@ data <- tibble::tibble(
CAZ = "-", # Ceftazidime
CXM = "-", # Cefuroxime
PEN = "S", # Benzylenicillin
FOX = "S" # Cefoxitin
FOX = "S" # Cefoxitin
)
```
```{r, eval = FALSE}

View File

@@ -147,31 +147,35 @@ data$syndrome <- ifelse(data$mo %like% "coli", "UTI", "No UTI")
```{r}
wisca(data,
antimicrobials = c("AMC", "CIP", "GEN"))
antimicrobials = c("AMC", "CIP", "GEN")
)
```
### Use combination regimens
```{r}
wisca(data,
antimicrobials = c("AMC", "AMC + CIP", "AMC + GEN"))
antimicrobials = c("AMC", "AMC + CIP", "AMC + GEN")
)
```
### Stratify by syndrome
```{r}
wisca(data,
antimicrobials = c("AMC", "AMC + CIP", "AMC + GEN"),
syndromic_group = "syndrome")
antimicrobials = c("AMC", "AMC + CIP", "AMC + GEN"),
syndromic_group = "syndrome"
)
```
The `AMR` package is available in `r length(AMR:::LANGUAGES_SUPPORTED)` languages, which can all be used for the `wisca()` function too:
```{r}
wisca(data,
antimicrobials = c("AMC", "AMC + CIP", "AMC + GEN"),
syndromic_group = gsub("UTI", "UCI", data$syndrome),
language = "Spanish")
antimicrobials = c("AMC", "AMC + CIP", "AMC + GEN"),
syndromic_group = gsub("UTI", "UCI", data$syndrome),
language = "Spanish"
)
```