From 29e448883df2dab05c2a1ea7f8c6179a21de3780 Mon Sep 17 00:00:00 2001 From: "Matthijs S. Berends" Date: Sun, 3 Nov 2019 22:24:42 +0100 Subject: [PATCH] (v0.8.0.9008) new verbose mode for MDROs --- .gitlab-ci.R | 7 +- DESCRIPTION | 6 +- NAMESPACE | 7 +- NEWS.md | 12 +- R/availability.R | 2 +- R/bug_drug_combinations.R | 2 +- R/catalogue_of_life.R | 1 - R/freq.R | 9 +- R/ggplot_rsi.R | 4 +- R/like.R | 1 - R/mdro.R | 284 ++++++++++++------ R/mic.R | 103 +------ R/misc.R | 42 --- R/mo.R | 4 +- R/rsi.R | 2 - R/rsi_calc.R | 2 +- data-raw/reproduction_of_antibiotics.R | 2 +- data/antibiotics.rda | Bin 35018 -> 35021 bytes docs/404.html | 2 +- docs/LICENSE-text.html | 2 +- docs/articles/index.html | 2 +- docs/authors.html | 2 +- docs/index.html | 2 +- docs/news/index.html | 90 +++--- docs/reference/as.mic.html | 6 +- docs/reference/as.rsi.html | 6 +- docs/reference/catalogue_of_life_version.html | 7 +- docs/reference/eucast_rules.html | 2 +- docs/reference/index.html | 2 +- docs/reference/like.html | 5 +- docs/reference/mdro.html | 23 +- docs/reference/microorganisms.html | 2 +- docs/reference/mo_property.html | 2 +- docs/reference/reexports.html | 6 +- man/as.mic.Rd | 2 - man/as.rsi.Rd | 2 - man/catalogue_of_life_version.Rd | 1 - man/like.Rd | 1 - man/mdro.Rd | 15 +- man/reexports.Rd | 2 +- tests/testthat/test-freq.R | 2 +- tests/testthat/test-mdro.R | 5 + 42 files changed, 338 insertions(+), 343 deletions(-) diff --git a/.gitlab-ci.R b/.gitlab-ci.R index aea195d1..0b6c2629 100644 --- a/.gitlab-ci.R +++ b/.gitlab-ci.R @@ -23,7 +23,11 @@ install_if_needed <- function(pkg, repos, quiet) { package_path <- find.package(pkg, quiet = quiet) if (length(package_path) == 0) { message("NOTE: pkg ", pkg, " missing, installing...") - install.packages(pkg, repos = repos, quiet = quiet) + if (pkg == "cleaner") { + devtools::install_github("msberends/cleaner") + } else { + install.packages(pkg, repos = repos, quiet = quiet) + } } } @@ -41,6 +45,7 @@ gl_update_pkg_all <- function(repos = "https://cran.rstudio.com", if (install_lintr == TRUE) { install_if_needed(pkg = "lintr", repos = repos, quiet = quiet) } + install_if_needed(pkg = "cleaner", repos = repos, quiet = quiet) devtools::install_dev_deps(repos = repos, quiet = quiet, upgrade = TRUE) diff --git a/DESCRIPTION b/DESCRIPTION index 055df164..7bce8c0d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 0.8.0.9007 -Date: 2019-10-30 +Version: 0.8.0.9008 +Date: 2019-11-03 Title: Antimicrobial Resistance Analysis Authors@R: c( person(role = c("aut", "cre"), @@ -36,7 +36,7 @@ Depends: R (>= 3.1.0) Imports: backports, - clean (>= 1.1.0), + cleaner, crayon (>= 1.3.0), data.table (>= 1.9.0), dplyr (>= 0.7.0), diff --git a/NAMESPACE b/NAMESPACE index ed00fbae..55f6f52e 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -232,9 +232,10 @@ exportMethods(skewness.matrix) exportMethods(summary.mic) exportMethods(summary.mo) exportMethods(summary.rsi) -importFrom(clean,freq) -importFrom(clean,freq.default) -importFrom(clean,top_freq) +importFrom(cleaner,freq) +importFrom(cleaner,freq.default) +importFrom(cleaner,percentage) +importFrom(cleaner,top_freq) importFrom(crayon,bgGreen) importFrom(crayon,bgRed) importFrom(crayon,bgYellow) diff --git a/NEWS.md b/NEWS.md index 21e2cd94..8153b720 100755 --- a/NEWS.md +++ b/NEWS.md @@ -1,8 +1,10 @@ -# AMR 0.8.0.9007 -Last updated: 30-Oct-2019 +# AMR 0.8.0.9008 +Last updated: 03-Nov-2019 ### New -* Support for a new MDRO guideline: Magiorakos AP, Srinivasan A *et al.* "Multidrug-resistant, extensively drug-resistant and pandrug-resistant bacteria: an international expert proposal for interim standard definitions for acquired resistance." Clinical Microbiology and Infection (2012). **This is now the new default guideline for the `mdro()` function.** +* Support for a new MDRO guideline: Magiorakos AP, Srinivasan A *et al.* "Multidrug-resistant, extensively drug-resistant and pandrug-resistant bacteria: an international expert proposal for interim standard definitions for acquired resistance." Clinical Microbiology and Infection (2012). + * This is now the new default guideline for the `mdro()` function + * The new Verbose mode (`mdro(...., verbose = TRUE)`) returns an informative data set where the reason for MDRO determination is given for every isolate ### Changes * When running `as.rsi()` over a data set, it will now print the guideline that will be used if it is not specified by the user @@ -12,6 +14,10 @@ * Added "imi" as allowed abbreviation for Imipenem * Fix for automatically determining columns with antibiotic results in `mdro()` and `eucast_rules()` * Added ATC codes for ceftaroline, ceftobiprole and faropenem and fixed two typos in the `antibiotics` data set +* More robust way of determining valid MIC values + +### Other +* Change dependency on `clean` to `cleaner`, as this package was renamed accordingly upon CRAN request # AMR 0.8.0 diff --git a/R/availability.R b/R/availability.R index a05cb2d2..95fb0fcf 100644 --- a/R/availability.R +++ b/R/availability.R @@ -27,7 +27,7 @@ #' @details The function returns a \code{data.frame} with columns \code{"resistant"} and \code{"visual_resistance"}. The values in that columns are calculated with \code{\link{portion_R}}. #' @return \code{data.frame} with column names of \code{tbl} as row names #' @inheritSection AMR Read more on our website! -# @importFrom clean percentage +#' @importFrom cleaner percentage #' @export #' @examples #' availability(example_isolates) diff --git a/R/bug_drug_combinations.R b/R/bug_drug_combinations.R index 3921b54c..bcdd3728 100644 --- a/R/bug_drug_combinations.R +++ b/R/bug_drug_combinations.R @@ -33,7 +33,6 @@ #' @inheritParams base::formatC #' @importFrom dplyr %>% rename group_by select mutate filter summarise ungroup #' @importFrom tidyr spread -# @importFrom clean freq percentage #' @details The function \code{format} calculates the resistance per bug-drug combination. Use \code{combine_IR = FALSE} (default) to test R vs. S+I and \code{combine_IR = TRUE} to test R+I vs. S. #' #' The language of the output can be overwritten with \code{options(AMR_locale)}, please see \link{translate}. @@ -95,6 +94,7 @@ bug_drug_combinations <- function(x, #' @importFrom dplyr everything rename %>% ungroup group_by summarise mutate_all arrange everything lag #' @importFrom tidyr spread +#' @importFrom cleaner percentage #' @exportMethod format.bug_drug_combinations #' @export #' @rdname bug_drug_combinations diff --git a/R/catalogue_of_life.R b/R/catalogue_of_life.R index bd5d7f65..edb11c69 100755 --- a/R/catalogue_of_life.R +++ b/R/catalogue_of_life.R @@ -90,7 +90,6 @@ NULL #' @export #' @examples #' library(dplyr) -#' library(clean) #' microorganisms %>% freq(kingdom) #' microorganisms %>% group_by(kingdom) %>% freq(phylum, nmax = NULL) catalogue_of_life_version <- function() { diff --git a/R/freq.R b/R/freq.R index 120b9697..ebba431d 100755 --- a/R/freq.R +++ b/R/freq.R @@ -19,14 +19,13 @@ # Visit our website for more info: https://msberends.gitlab.io/AMR. # # ==================================================================== # -#' @importFrom clean freq +#' @importFrom cleaner freq #' @export -clean::freq +cleaner::freq #' @exportMethod freq.mo #' @importFrom dplyr n_distinct -#' @importFrom clean freq.default -# @importFrom clean percentage +#' @importFrom cleaner freq.default percentage #' @export #' @noRd freq.mo <- function(x, ...) { @@ -53,7 +52,7 @@ freq.mo <- function(x, ...) { } #' @exportMethod freq.rsi -#' @importFrom clean freq.default +#' @importFrom cleaner freq.default #' @export #' @noRd freq.rsi <- function(x, ...) { diff --git a/R/ggplot_rsi.R b/R/ggplot_rsi.R index 06b8a199..2a7a953e 100755 --- a/R/ggplot_rsi.R +++ b/R/ggplot_rsi.R @@ -337,7 +337,7 @@ facet_rsi <- function(facet = c("interpretation", "antibiotic"), nrow = NULL) { } #' @rdname ggplot_rsi -# @importFrom clean percentage +#' @importFrom cleaner percentage #' @export scale_y_percent <- function(breaks = seq(0, 1, 0.1), limits = NULL) { stopifnot_installed_package("ggplot2") @@ -387,7 +387,7 @@ theme_rsi <- function() { #' @rdname ggplot_rsi #' @importFrom dplyr mutate %>% group_by_at -# @importFrom clean percentage +#' @importFrom cleaner percentage #' @export labels_rsi_count <- function(position = NULL, x = "antibiotic", diff --git a/R/like.R b/R/like.R index eedfd210..6b388e12 100755 --- a/R/like.R +++ b/R/like.R @@ -48,7 +48,6 @@ #' #' # get frequencies of bacteria whose name start with 'Ent' or 'ent' #' library(dplyr) -#' library(clean) #' example_isolates %>% #' left_join_microorganisms() %>% #' filter(genus %like% '^ent') %>% diff --git a/R/mdro.R b/R/mdro.R index d9bef3e5..ec990963 100755 --- a/R/mdro.R +++ b/R/mdro.R @@ -22,13 +22,16 @@ #' Determine multidrug-resistant organisms (MDRO) #' #' Determine which isolates are multidrug-resistant organisms (MDRO) according to (country-specific) guidelines. -#' @param x table with antibiotic columns, like e.g. \code{AMX} and \code{AMC} #' @param guideline a specific guideline to follow. When left empty, the publication by Magiorakos \emph{et al.} (2012, Clinical Microbiology and Infection) will be followed, see Details. #' @param info print progress #' @inheritParams eucast_rules #' @param verbose print additional info: missing antibiotic columns per parameter +#' @param pct_required_classes minimal required percentage of antimicrobial classes that must be available per isolate, rounded down. For example, with the default guideline, 17 antimicrobial classes must be available for \emph{S. aureus}. Setting this \code{pct_required_classes} argument to \code{0.5} (default) means that for every \emph{S. aureus} isolate at least 8 different classes must be available. Any lower number of available classes will return \code{NA} for that isolate. +#' @param verbose a logical to turn Verbose mode on and off (default is off). In Verbose mode, the function does not return the MDRO results, but instead returns a data set in logbook form with extensive info about which isolates would be MDRO-positive, or why they are not. #' @inheritSection eucast_rules Antibiotics -#' @details Currently supported guidelines are (case-insensitive): +#' @details +#' For the \code{pct_required_classes} argument, values above 1 will be divided by 100. This is to support both fractions (\code{0.75} or \code{3/4}) and percentages (\code{75}). +#' Currently supported guidelines are (case-insensitive): #' \itemize{ #' \item{\code{guideline = "CMI2012"}: Magiorakos AP, Srinivasan A \emph{et al.} "Multidrug-resistant, extensively drug-resistant and pandrug-resistant bacteria: an international expert proposal for interim standard definitions for acquired resistance." Clinical Microbiology and Infection (2012) (\href{https://www.clinicalmicrobiologyandinfection.com/article/S1198-743X(14)61632-3/fulltext}{link})} #' \item{\code{guideline = "EUCAST"}: The European international guideline - EUCAST Expert Rules Version 3.1 "Intrinsic Resistance and Exceptional Phenotypes Tables" (\href{http://www.eucast.org/fileadmin/src/media/PDFs/EUCAST_files/Expert_Rules/Expert_rules_intrinsic_exceptional_V3.1.pdf}{link})} @@ -38,6 +41,7 @@ #' } #' #' Please suggest your own (country-specific) guidelines by letting us know: \url{https://gitlab.com/msberends/AMR/issues/new}. +#' #' @return \itemize{ #' \item{CMI 2012 paper - function \code{mdr_cmi2012()} or \code{mdro()}:\cr Ordered factor with levels \code{Negative < Multi-drug-resistant (MDR) < Extensively drug-resistant (XDR) < Pandrug-resistant (PDR)}} #' \item{TB guideline - function \code{mdr_tb()} or \code{mdro(..., guideline = "TB")}:\cr Ordered factor with levels \code{Negative < Mono-resistant < Poly-resistant < Multi-drug-resistant < Extensively drug-resistant}} @@ -47,6 +51,7 @@ #' @rdname mdro #' @importFrom dplyr %>% filter_all #' @importFrom crayon blue bold italic +#' @importFrom cleaner percentage #' @export #' @inheritSection AMR Read more on our website! #' @source @@ -54,13 +59,13 @@ #' @examples #' library(dplyr) #' -#' example_isolates %>% -#' mdro() %>% +#' example_isolates %>% +#' mdro() %>% #' freq() #' #' \donttest{ #' example_isolates %>% -#' mutate(EUCAST = mdro(.), +#' mutate(EUCAST = eucast_exceptional_phenotypes(.), #' BRMO = brmo(.), #' MRGN = mrgn(.)) #' @@ -74,13 +79,35 @@ mdro <- function(x, col_mo = NULL, info = TRUE, verbose = FALSE, + pct_required_classes = 0.5, ...) { - + + if (verbose == TRUE & interactive()) { + txt <- paste0("WARNING: In Verbose mode, the mdro() function does not return the MDRO results, but instead returns a data set in logbook form with extensive info about which isolates would be MDRO-positive, or why they are not.", + "\n\nThis may overwrite your existing data if you use e.g.:", + "\ndata <- mdro(data, verbose = TRUE)\n\nDo you want to continue?") + if ("rstudioapi" %in% rownames(utils::installed.packages())) { + q_continue <- rstudioapi::showQuestion("Using verbose = TRUE with mdro()", txt) + } else { + q_continue <- menu(choices = c("OK", "Cancel"), graphics = TRUE, title = txt) + } + if (q_continue %in% c(FALSE, 2)) { + message("Cancelled, returning original data") + return(x) + } + } + if (!is.data.frame(x)) { stop("`x` must be a data frame.", call. = FALSE) } - - + if (!is.numeric(pct_required_classes)) { + stop("`pct_required_classes` must be numeric.", call. = FALSE) + } + if (pct_required_classes > 1) { + # allow pct_required_classes = 75 -> pct_required_classes = 0.75 + pct_required_classes <- pct_required_classes / 100 + } + if (!is.null(list(...)$country)) { warning("Using `country` is deprecated, use `guideline` instead. Please see ?mdro.", call. = FALSE) guideline <- list(...)$country @@ -88,7 +115,7 @@ mdro <- function(x, if (length(guideline) > 1) { stop("`guideline` must be a length one character string.", call. = FALSE) } - + if (is.null(guideline)) { # default to the paper by Magiorakos et al. (2012) guideline <- "cmi2012" @@ -103,7 +130,7 @@ mdro <- function(x, stop("invalid guideline: ", guideline, call. = FALSE) } guideline <- list(code = tolower(guideline)) - + # try to find columns based on type # -- mo if (is.null(col_mo)) { @@ -118,7 +145,7 @@ mdro <- function(x, if (is.null(col_mo)) { stop("`col_mo` must be set.", call. = FALSE) } - + if (guideline$code == "cmi2012") { guideline$name <- "Multidrug-resistant, extensively drug-resistant and pandrug-resistant bacteria: an international expert proposal for interim standard definitions for acquired resistance." guideline$author <- "Magiorakos AP, Srinivasan A, Carey RB, ..., Vatopoulos A, Weber JT, Monnet DL" @@ -130,13 +157,13 @@ mdro <- function(x, guideline$author <- "EUCAST (European Committee on Antimicrobial Susceptibility Testing)" guideline$version <- "3.1" guideline$source <- "http://www.eucast.org/fileadmin/src/media/PDFs/EUCAST_files/Expert_Rules/Expert_rules_intrinsic_exceptional_V3.1.pdf" - + } else if (guideline$code == "tb") { guideline$name <- "Companion handbook to the WHO guidelines for the programmatic management of drug-resistant tuberculosis" guideline$author <- "WHO (World Health Organization)" guideline$version <- "WHO/HTM/TB/2014.11" guideline$source <- "https://www.who.int/tb/publications/pmdt_companionhandbook/en/" - + # support per country: } else if (guideline$code == "mrgn") { guideline$name <- "Cross-border comparison of the Dutch and German guidelines on multidrug-resistant Gram-negative microorganisms" @@ -152,7 +179,7 @@ mdro <- function(x, } else { stop("This guideline is currently unsupported: ", guideline$code, call. = FALSE) } - + if (guideline$code == "cmi2012") { cols_ab <- get_column_abx(x = x, soft_dependencies = c( @@ -270,7 +297,7 @@ mdro <- function(x, "TCY", "DOX", "MNO" - ), + ), verbose = verbose, ...) } else if (guideline$code == "tb") { cols_ab <- get_column_abx(x = x, @@ -295,7 +322,7 @@ mdro <- function(x, } else { cols_ab <- get_column_abx(x = x, verbose = verbose, ...) } - + AMC <- cols_ab["AMC"] AMK <- cols_ab["AMK"] AMP <- cols_ab["AMP"] @@ -391,21 +418,23 @@ mdro <- function(x, bold("Source: "), guideline$source, "\n", "\n", sep = "") } - + ab_missing <- function(ab) { isTRUE(ab %in% c(NULL, NA)) | length(ab) == 0 } ab_NA <- function(x) { x[!is.na(x)] } - + + verbose_df <- NULL + # antibiotic classes aminoglycosides <- c(TOB, GEN) cephalosporins <- c(FEP, CTX, FOX, CED, CAZ, CRO, CXM, CZO) cephalosporins_3rd <- c(CTX, CRO, CAZ) carbapenems <- c(ETP, IPM, MEM) fluoroquinolones <- c(OFX, CIP, LVX, MFX) - + # helper function for editing the table trans_tbl <- function(to, rows, cols, any_all) { cols <- cols[!ab_missing(cols)] @@ -421,41 +450,41 @@ mdro <- function(x, } rows <- rows[rows %in% row_filter] x[rows, "MDRO"] <<- to + x[rows, "reason"] <<- paste0(any_all, " of these ", ifelse(any_all == "any", "is", "are"), " R: ", + paste(cols, collapse = ", ")) } } trans_tbl2 <- function(txt, rows, lst) { if (info == TRUE) { message(blue(txt, "..."), appendLF = FALSE) } - # function specific for the CMI paper of 2012 (Magiorakos et al.) - lst_vector <- unlist(lst)[!is.na(unlist(lst))] - x$total_groups <- NA_integer_ - x$affected_groups <- NA_integer_ - x[rows, "total_groups"] <- length(lst) - # now the hard part - using two sapply()s for super fast results: - # [1] run through all `rows` with sapply() - # [2] within each row, run through all antibiotic groups with another sapply() - # [3] determine for each antibiotic group in that row if at least 1 drug is R of I - # [4] sum the number of TRUEs of this determination - x[rows, "affected_groups"] <- sapply(rows, - function(row, group_tbl = lst) { - sum(sapply(group_tbl, - function(group) { - any(x[row, group[!is.na(group)]] == "R") | - any(x[row, group[!is.na(group)]] == "I") - }), - na.rm = TRUE) - }) - # now set MDROs: - # MDR (=2): >=3 groups affected - x[which(x$row_number %in% rows & x$affected_groups >= 3), "MDRO"] <<- 2 - # XDR (=3): all but <=2 groups affected - x[which(x$row_number %in% rows & (x$total_groups - x$affected_groups) <= 2), "MDRO"] <<- 3 - # PDR (=4): all agents are R - x[filter_at(x[rows, ], - vars(lst_vector), - all_vars(. %in% c("R", "I")))$row_number, - "MDRO"] <<- 4 + if (length(rows) > 0) { + # function specific for the CMI paper of 2012 (Magiorakos et al.) + lst_vector <- unlist(lst)[!is.na(unlist(lst))] + x[rows, "classes_in_guideline"] <<- length(lst) + x[rows, "classes_available"] <<- sapply(rows, + function(row, group_tbl = lst) { + sum(sapply(group_tbl, function(group) !all(is.na(group)))) + }) + # now the hard part - using two sapply()s for super fast results: + # [1] run through all `rows` with sapply() + # [2] within each row, run through all antibiotic classes with another sapply() + # [3] determine for each antibiotic group in that row if at least 1 drug is R of I + # [4] sum the number of TRUEs of this determination + x[rows, "classes_affected"] <<- sapply(rows, + function(row, group_tbl = lst) { + sum(sapply(group_tbl, + function(group) { + any(x[row, group[!is.na(group)]] == "R") | + any(x[row, group[!is.na(group)]] == "I") + }), + na.rm = TRUE) + }) + x[filter_at(x[rows,], + vars(lst_vector), + all_vars(. %in% c("R", "I")))$row_number, "classes_affected"] <<- 999 + } + if (info == TRUE) { message(blue(" OK")) } @@ -465,9 +494,10 @@ mdro <- function(x, mutate_at(vars(col_mo), as.mo) %>% # join to microorganisms data set left_join_microorganisms(by = col_mo) %>% - # add unconfirmed to where genus is available + # add unavailable to where genus is available mutate(MDRO = ifelse(!is.na(genus), 1, NA_integer_), - row_number = seq_len(nrow(.))) %>% + row_number = seq_len(nrow(.)), + reason = paste0("not covered by ", toupper(guideline$code), " guideline")) %>% # transform to data.frame so subsetting is possible with x[y, z] (might not be the case with tibble/data.table/...) as.data.frame(stringsAsFactors = FALSE) @@ -475,19 +505,34 @@ mdro <- function(x, # CMI, 2012 --------------------------------------------------------------- # Non-susceptible = R and I # (see header 'Approaches to Creating Definitions for MDR, XDR and PDR' in paper) - + # take amoxicillin if ampicillin is unavailable - if (is.na(AMP) & !is.na(AMX)) AMP <- AMX + if (is.na(AMP) & !is.na(AMX)) { + if (verbose == TRUE) { + message(blue("NOTE: Filling ampicillin (AMP) results with amoxicillin (AMX) results")) + } + AMP <- AMX + } # take ceftriaxone if cefotaxime is unavailable and vice versa - if (is.na(CRO) & !is.na(CTX)) CRO <- CTX - if (is.na(CTX) & !is.na(CRO)) CTX <- CRO + if (is.na(CRO) & !is.na(CTX)) { + if (verbose == TRUE) { + message(blue("NOTE: Filling ceftriaxone (CRO) results with cefotaxime (CTX) results")) + } + CRO <- CTX + } + if (is.na(CTX) & !is.na(CRO)) { + if (verbose == TRUE) { + message(blue("NOTE: Filling cefotaxime (CTX) results with ceftriaxone (CRO) results")) + } + CTX <- CRO + } # intrinsic resistant must not be considered for the determination of MDR, # so let's just remove them, meticulously following the paper x[which(x$genus == "Enterococcus" & x$species == "faecium"), ab_NA(IPM)] <- NA x[which(x$genus == "Enterococcus" & x$species == "faecalis"), ab_NA(QDA)] <- NA x[which((x$genus == "Providencia" & x$species == "rettgeri") - | (x$genus == "Providencia" & x$species == "stuartii")), ab_NA(c(GEN, TOB, NET))] <- NA + | (x$genus == "Providencia" & x$species == "stuartii")), ab_NA(c(GEN, TOB, NET))] <- NA x[which(x$genus == "Escherichia" & x$species == "hermannii"), ab_NA(c(TCC, TZP))] <- NA x[which((x$genus == "Citrobacter" & x$species == "freundii") | (x$genus == "Enterobacter" & x$species == "aerogenes") @@ -554,6 +599,10 @@ mdro <- function(x, | (x$genus == "Providencia" & x$species == "rettgeri") | (x$genus == "Providencia" & x$species == "stuartii")), ab_NA(c(DOX, MNO))] <- NA + x$classes_in_guideline <- NA_integer_ + x$classes_available <- NA_integer_ + x$classes_affected <- NA_integer_ + # now add the MDR levels to the data trans_tbl(2, which(x$genus == "Staphylococcus" & x$species == "aureus"), @@ -592,7 +641,7 @@ mdro <- function(x, QDA, c(DOX, MNO))) trans_tbl2(paste0("Table 3 - ", italic("Enterobacteriaceae"), - " (before the taxonomic reclassification by Adeolu ", italic("et al."), ", 2016)"), + " (before the taxonomic reclassification by Adeolu ", italic("et al."), ", 2016)"), # this new order was previously 'Enterobacteriales' and contained only the family 'Enterobacteriaceae': which(x$order == "Enterobacterales"), list(c(GEN, TOB, AMK, NET), @@ -634,6 +683,37 @@ mdro <- function(x, SAM, c(COL, PLB), c(TCY, DOX, MNO))) + + # now set MDROs: + # MDR (=2): >=3 classes affected + x[which(x$classes_affected >= 3), "MDRO"] <- 2 + if (verbose == TRUE) { + x[which(x$classes_affected >= 3), "reason"] <- paste0("at least 3 classes contain R or I: ", x$classes_affected[which(x$classes_affected >= 3)], + " out of ", x$classes_available[which(x$classes_affected >= 3)], " available classes") + } + # XDR (=3): all but <=2 classes affected + x[which((x$classes_in_guideline - x$classes_affected) <= 2), "MDRO"] <- 3 + if (verbose == TRUE) { + x[which((x$classes_in_guideline - x$classes_affected) <= 2), "reason"] <- paste0("less than 3 classes remain susceptible (", x$classes_in_guideline[which((x$classes_in_guideline - x$classes_affected) <= 2)] - x$classes_affected[which((x$classes_in_guideline - x$classes_affected) <= 2)], + " out of ", x$classes_in_guideline[which((x$classes_in_guideline - x$classes_affected) <= 2)], " classes)") + } + # PDR (=4): all agents are R + x[which(x$classes_affected == 999 & x$classes_in_guideline == x$classes_available), "MDRO"] <- 4 + if (verbose == TRUE) { + x[which(x$classes_affected == 999 & x$classes_in_guideline == x$classes_available), "reason"] <- paste("all antibiotics in all", x$classes_in_guideline[which(x$classes_affected == 999 & x$classes_in_guideline == x$classes_available)], "classes were tested R or I") + } + + # not enough classes available + x[which(x$classes_available < base::floor(x$classes_in_guideline * pct_required_classes)), "MDRO"] <- -1 + if (verbose == TRUE) { + x[which(x$classes_available < base::floor(x$classes_in_guideline * pct_required_classes)), "reason"] <- paste0("not enough classes available: ", x$classes_available[which(x$classes_available < base::floor(x$classes_in_guideline * pct_required_classes))], + " instead of ", (base::floor(x$classes_in_guideline * pct_required_classes))[which(x$classes_available < base::floor(x$classes_in_guideline * pct_required_classes))], + " (~", percentage(pct_required_classes), " of ", x$classes_in_guideline[which(x$classes_available < base::floor(x$classes_in_guideline * pct_required_classes))], ")") + } + # some more info on negative results + if (verbose == TRUE) { + x[which(x$MDRO == 1 & !is.na(x$classes_affected)), "reason"] <- paste0(x$classes_affected[which(x$MDRO == 1 & !is.na(x$classes_affected))], " of ", x$classes_available[which(x$MDRO == 1 & !is.na(x$classes_affected))], " available classes contain R or I (3 required for MDR)") + } } if (guideline$code == "eucast") { @@ -693,14 +773,14 @@ mdro <- function(x, # Table 7 trans_tbl(3, which(x$genus == "Bacteroides"), - MTR, + MTR, "any") trans_tbl(3, which(x$fullname %like% "^Clostridium difficile"), c(MTR, VAN), "any") } - + if (guideline$code == "mrgn") { # Germany ----------------------------------------------------------------- CTX_or_CAZ <- CTX %or% CAZ @@ -715,7 +795,7 @@ mdro <- function(x, # Table 1 x[which((x$order == "Enterobacterales" | # following in fact the old Enterobacteriaceae classification - x$fullname %like% "^Acinetobacter baumannii") & + x$fullname %like% "^Acinetobacter baumannii") & x[, PIP] == "R" & x[, CTX_or_CAZ] == "R" & x[, IPM_or_MEM] == "S" & @@ -749,7 +829,7 @@ mdro <- function(x, x[, CIP] == "R"), "MDRO"] <- 3 # 3 = 4MRGN } - + if (guideline$code == "brmo") { # Netherlands ------------------------------------------------------------- aminoglycosides <- aminoglycosides[!is.na(aminoglycosides)] @@ -762,23 +842,23 @@ mdro <- function(x, if (length(ESBLs) != 2) { ESBLs <- character(0) } - + # Table 1 trans_tbl(3, which(x$order == "Enterobacterales"), # following in fact the old Enterobacteriaceae classification c(aminoglycosides, fluoroquinolones), "all") - + trans_tbl(2, which(x$order == "Enterobacterales"), # following in fact the old Enterobacteriaceae classification carbapenems, "any") - + trans_tbl(2, which(x$order == "Enterobacterales"), # following in fact the old Enterobacteriaceae classification ESBLs, "all") - + # Table 2 trans_tbl(2, which(x$genus == "Acinetobacter"), @@ -788,12 +868,12 @@ mdro <- function(x, which(x$genus == "Acinetobacter"), c(aminoglycosides, fluoroquinolones), "all") - + trans_tbl(3, which(x$fullname %like% "^Stenotrophomonas maltophilia"), SXT, "all") - + if (!ab_missing(MEM) & !ab_missing(IPM) & !ab_missing(GEN) & !ab_missing(TOB) & !ab_missing(CIP) @@ -812,7 +892,7 @@ mdro <- function(x, x$fullname %like% "Pseudomonas aeruginosa" & x$psae >= 3 ), "MDRO"] <- 3 - + # Table 3 trans_tbl(3, which(x$fullname %like% "Streptococcus pneumoniae"), @@ -827,7 +907,7 @@ mdro <- function(x, c(PEN, VAN), "all") } - + prepare_drug <- function(ab) { # returns vector values of drug # if `ab` is a column name, looks up the values in `x` @@ -858,7 +938,7 @@ mdro <- function(x, ab != "R" } } - + if (guideline$code == "tb") { # Tuberculosis ------------------------------------------------------------ x <- x %>% @@ -881,43 +961,59 @@ mdro <- function(x, TRUE, FALSE), xdr = ifelse(mdr & xdr & second, TRUE, FALSE)) %>% mutate(MDRO = case_when(xdr ~ 5, - mdr ~ 4, - poly ~ 3, - mono ~ 2, - TRUE ~ 1), + mdr ~ 4, + poly ~ 3, + mono ~ 2, + TRUE ~ 1), # keep all real TB, make other species NA MDRO = ifelse(x$fullname == "Mycobacterium tuberculosis", MDRO, NA_real_)) } if (info == TRUE) { cat(bold(paste0("=> Found ", sum(x$MDRO %in% c(2:5), na.rm = TRUE), " MDROs out of ", sum(!is.na(x$MDRO)), - " possible cases (", percentage(sum(x$MDRO %in% c(2:5), na.rm = TRUE) / sum(!is.na(x$MDRO))), ")"))) + " tested isolates (", percentage(sum(x$MDRO %in% c(2:5), na.rm = TRUE) / sum(!is.na(x$MDRO))), ")\n"))) } - - # return results + + # Results ---- if (guideline$code == "cmi2012") { - factor(x = x$MDRO, - levels = 1:4, - labels = c("Negative", "Multi-drug-resistant (MDR)", - "Extensively drug-resistant (XDR)", "Pandrug-resistant (PDR)"), - ordered = TRUE) + if (any(x$MDRO == -1)) { + warning("NA introduced for isolates where the available percentage of antimicrobial classes was below ", + percentage(pct_required_classes), " (set with `pct_required_classes`)") + # set these -1s to NA + x[which(x$MDRO == -1), "MDRO"] <- NA_integer_ + } + x$MDRO <- factor(x = x$MDRO, + levels = 1:4, + labels = c("Negative", "Multi-drug-resistant (MDR)", + "Extensively drug-resistant (XDR)", "Pandrug-resistant (PDR)"), + ordered = TRUE) } else if (guideline$code == "tb") { - factor(x = x$MDRO, - levels = 1:5, - labels = c("Negative", "Mono-resistant", "Poly-resistant", - "Multi-drug-resistant", "Extensively drug-resistant"), - ordered = TRUE) + x$MDRO <- factor(x = x$MDRO, + levels = 1:5, + labels = c("Negative", "Mono-resistant", "Poly-resistant", + "Multi-drug-resistant", "Extensively drug-resistant"), + ordered = TRUE) } else if (guideline$code == "mrgn") { - factor(x = x$MDRO, - levels = 1:3, - labels = c("Negative", "3MRGN", "4MRGN"), - ordered = TRUE) + x$MDRO <- factor(x = x$MDRO, + levels = 1:3, + labels = c("Negative", "3MRGN", "4MRGN"), + ordered = TRUE) } else { - factor(x = x$MDRO, - levels = 1:3, - labels = c("Negative", "Positive, unconfirmed", "Positive"), - ordered = TRUE) + x$MDRO <- factor(x = x$MDRO, + levels = 1:3, + labels = c("Negative", "Positive, unconfirmed", "Positive"), + ordered = TRUE) } + + if (verbose == TRUE) { + x[, c("row_number", + col_mo, + "MDRO", + "reason")] + } else { + x$MDRO + } + } #' @rdname mdro diff --git a/R/mic.R b/R/mic.R index 4dbf0b60..25211016 100755 --- a/R/mic.R +++ b/R/mic.R @@ -51,8 +51,6 @@ #' #' plot(mic_data) #' barplot(mic_data) -#' -#' library(clean) #' freq(mic_data) as.mic <- function(x, na.rm = FALSE) { if (is.mic(x)) { @@ -97,98 +95,15 @@ as.mic <- function(x, na.rm = FALSE) { x[x.bak != "" & x == ""] <- "invalid" # these are allowed MIC values and will become factor levels - lvls <- c("<0.001", "<=0.001", "0.001", ">=0.001", ">0.001", - "<0.002", "<=0.002", "0.002", ">=0.002", ">0.002", - "<0.003", "<=0.003", "0.003", ">=0.003", ">0.003", - "<0.004", "<=0.004", "0.004", ">=0.004", ">0.004", - "<0.005", "<=0.005", "0.005", ">=0.005", ">0.005", - "<0.006", "<=0.006", "0.006", ">=0.006", ">0.006", - "<0.007", "<=0.007", "0.007", ">=0.007", ">0.007", - "<0.008", "<=0.008", "0.008", ">=0.008", ">0.008", - "<0.009", "<=0.009", "0.009", ">=0.009", ">0.009", - "<0.01", "<=0.01", "0.01", ">=0.01", ">0.01", - "<0.012", "<=0.012", "0.012", ">=0.012", ">0.012", - "<0.0125", "<=0.0125", "0.0125", ">=0.0125", ">0.0125", - "<0.016", "<=0.016", "0.016", ">=0.016", ">0.016", - "<0.019", "<=0.019", "0.019", ">=0.019", ">0.019", - "<0.02", "<=0.02", "0.02", ">=0.02", ">0.02", - "<0.023", "<=0.023", "0.023", ">=0.023", ">0.023", - "<0.025", "<=0.025", "0.025", ">=0.025", ">0.025", - "<0.028", "<=0.028", "0.028", ">=0.028", ">0.028", - "<0.03", "<=0.03", "0.03", ">=0.03", ">0.03", - "<0.031", "<=0.031", "0.031", ">=0.031", ">0.031", - "<0.032", "<=0.032", "0.032", ">=0.032", ">0.032", - "<0.038", "<=0.038", "0.038", ">=0.038", ">0.038", - "<0.04", "<=0.04", "0.04", ">=0.04", ">0.04", - "<0.047", "<=0.047", "0.047", ">=0.047", ">0.047", - "<0.05", "<=0.05", "0.05", ">=0.05", ">0.05", - "<0.054", "<=0.054", "0.054", ">=0.054", ">0.054", - "<0.06", "<=0.06", "0.06", ">=0.06", ">0.06", - "<0.0625", "<=0.0625", "0.0625", ">=0.0625", ">0.0625", - "<0.063", "<=0.063", "0.063", ">=0.063", ">0.063", - "<0.064", "<=0.064", "0.064", ">=0.064", ">0.064", - "<0.075", "<=0.075", "0.075", ">=0.075", ">0.075", - "<0.08", "<=0.08", "0.08", ">=0.08", ">0.08", - "<0.09", "<=0.09", "0.09", ">=0.09", ">0.09", - "<0.094", "<=0.094", "0.094", ">=0.094", ">0.094", - "<0.095", "<=0.095", "0.095", ">=0.095", ">0.095", - "<0.1", "<=0.1", "0.1", ">=0.1", ">0.1", - "<0.12", "<=0.12", "0.12", ">=0.12", ">0.12", - "<0.125", "<=0.125", "0.125", ">=0.125", ">0.125", - "<0.128", "<=0.128", "0.128", ">=0.128", ">0.128", - "<0.15", "<=0.15", "0.15", ">=0.15", ">0.15", - "<0.16", "<=0.16", "0.16", ">=0.16", ">0.16", - "<0.17", "<=0.17", "0.17", ">=0.17", ">0.17", - "<0.18", "<=0.18", "0.18", ">=0.18", ">0.18", - "<0.19", "<=0.19", "0.19", ">=0.19", ">0.19", - "<0.2", "<=0.2", "0.2", ">=0.2", ">0.2", - "<0.23", "<=0.23", "0.23", ">=0.23", ">0.23", - "<0.25", "<=0.25", "0.25", ">=0.25", ">0.25", - "<0.256", "<=0.256", "0.256", ">=0.256", ">0.256", - "<0.28", "<=0.28", "0.28", ">=0.28", ">0.28", - "<0.3", "<=0.3", "0.3", ">=0.3", ">0.3", - "<0.32", "<=0.32", "0.32", ">=0.32", ">0.32", - "<0.35", "<=0.35", "0.35", ">=0.35", ">0.35", - "<0.36", "<=0.36", "0.36", ">=0.36", ">0.36", - "<0.38", "<=0.38", "0.38", ">=0.38", ">0.38", - "<0.47", "<=0.47", "0.47", ">=0.47", ">0.47", - "<0.5", "<=0.5", "0.5", ">=0.5", ">0.5", - "<0.512", "<=0.512", "0.512", ">=0.512", ">0.512", - "<0.64", "<=0.64", "0.64", ">=0.64", ">0.64", - "<0.73", "<=0.73", "0.73", ">=0.73", ">0.73", - "<0.75", "<=0.75", "0.75", ">=0.75", ">0.75", - "<0.8", "<=0.8", "0.8", ">=0.8", ">0.8", - "<0.94", "<=0.94", "0.94", ">=0.94", ">0.94", - "<1", "<=1", "1", ">=1", ">1", - "<1.5", "<=1.5", "1.5", ">=1.5", ">1.5", - "<2", "<=2", "2", ">=2", ">2", - "<3", "<=3", "3", ">=3", ">3", - "<4", "<=4", "4", ">=4", ">4", - "<5", "<=5", "5", ">=5", ">5", - "<6", "<=6", "6", ">=6", ">6", - "<7", "<=7", "7", ">=7", ">7", - "<8", "<=8", "8", ">=8", ">8", - "<10", "<=10", "10", ">=10", ">10", - "<12", "<=12", "12", ">=12", ">12", - "<16", "<=16", "16", ">=16", ">16", - "<20", "<=20", "20", ">=20", ">20", - "<24", "<=24", "24", ">=24", ">24", - "<32", "<=32", "32", ">=32", ">32", - "<40", "<=40", "40", ">=40", ">40", - "<48", "<=48", "48", ">=48", ">48", - "<64", "<=64", "64", ">=64", ">64", - "<80", "<=80", "80", ">=80", ">80", - "<96", "<=96", "96", ">=96", ">96", - "<128", "<=128", "128", ">=128", ">128", - "129", - "<160", "<=160", "160", ">=160", ">160", - "<256", "<=256", "256", ">=256", ">256", - "257", - "<320", "<=320", "320", ">=320", ">320", - "<512", "<=512", "512", ">=512", ">512", - "513", - "<1024", "<=1024", "1024", ">=1024", ">1024", - "1025") + ops <- c("<", "<=", "", ">=", ">") + lvls <- c(c(t(sapply(ops, function(x) paste0(x, "0.00", 1:9)))), + unique(c(t(sapply(ops, function(x) paste0(x, sort(as.double(paste0("0.0", + sort(c(1:99, 125, 128, 256, 512, 625)))))))))), + unique(c(t(sapply(ops, function(x) paste0(x, sort(as.double(paste0("0.", + c(1:99, 125, 128, 256, 512))))))))), + c(t(sapply(ops, function(x) paste0(x, sort(c(1:9, 1.5)))))), + c(t(sapply(ops, function(x) paste0(x, c(10:98)[9:98 %% 2 == TRUE])))), + c(t(sapply(ops, function(x) paste0(x, sort(c(2 ^ c(7:10), 80 * c(2:12)))))))) na_before <- x[is.na(x) | x == ""] %>% length() x[!x %in% lvls] <- NA diff --git a/R/misc.R b/R/misc.R index 4bd874c3..8a275ec8 100755 --- a/R/misc.R +++ b/R/misc.R @@ -127,45 +127,3 @@ class_integrity_check <- function(value, type, check_vector) { } value } - - - - -# Percentages ------------------------------------------------------------- -# Can all be removed when clean 1.2.0 is on CRAN - -getdecimalplaces <- function(x, minimum = 0, maximum = 3) { - if (maximum < minimum) { - maximum <- minimum - } - if (minimum > maximum) { - minimum <- maximum - } - max_places <- max(unlist(lapply(strsplit(sub("0+$", "", - as.character(x * 100)), ".", fixed = TRUE), - function(y) ifelse(length(y) == 2, nchar(y[2]), 0))), na.rm = TRUE) - max(min(max_places, - maximum, na.rm = TRUE), - minimum, na.rm = TRUE) -} - -round2 <- function(x, digits = 0, force_zero = TRUE) { - # https://stackoverflow.com/a/12688836/4575331 - val <- (trunc((abs(x) * 10 ^ digits) + 0.5) / 10 ^ digits) * sign(x) - if (digits > 0 & force_zero == TRUE) { - val[val != as.integer(val) & !is.na(val)] <- paste0(val[val != as.integer(val) & !is.na(val)], - strrep("0", max(0, digits - nchar(gsub(".*[.](.*)$", "\\1", val[val != as.integer(val) & !is.na(val)]))))) - } - val -} - -percentage <- function(x, digits = NULL, ...) { - if (is.null(digits)) { - digits <- getdecimalplaces(x, minimum = 0, maximum = 1) - } - # round right: percentage(0.4455) should return "44.6%", not "44.5%" - x <- as.numeric(round2(x, digits = digits + 2)) - x_formatted <- format(as.double(x) * 100, scientific = FALSE, digits = digits, nsmall = digits, ...) - x_formatted[!is.na(x)] <- paste0(x_formatted[!is.na(x)], "%") - x_formatted -} diff --git a/R/mo.R b/R/mo.R index d6eff413..5d64def4 100755 --- a/R/mo.R +++ b/R/mo.R @@ -267,7 +267,7 @@ is.mo <- function(x) { #' @importFrom dplyr %>% pull left_join n_distinct progress_estimated filter distinct #' @importFrom data.table data.table as.data.table setkey #' @importFrom crayon magenta red blue silver italic -# @importFrom clean percentage +#' @importFrom cleaner percentage # param property a column name of AMR::microorganisms # param initial_search logical - is FALSE when coming from uncertain tries, which uses exec_as.mo internally too # param dyslexia_mode logical - also check for characters that resemble others @@ -1774,7 +1774,7 @@ pillar_shaft.mo <- function(x, ...) { #' @exportMethod summary.mo #' @importFrom dplyr n_distinct -#' @importFrom clean freq top_freq +#' @importFrom cleaner freq top_freq #' @export #' @noRd summary.mo <- function(object, ...) { diff --git a/R/rsi.R b/R/rsi.R index 3748a3b6..89f3d95f 100755 --- a/R/rsi.R +++ b/R/rsi.R @@ -73,8 +73,6 @@ #' #' plot(rsi_data) # for percentages #' barplot(rsi_data) # for frequencies -#' -#' library(clean) #' freq(rsi_data) # frequency table with informative header #' #' # using dplyr's mutate diff --git a/R/rsi_calc.R b/R/rsi_calc.R index 6f631bc1..8f6c2df7 100755 --- a/R/rsi_calc.R +++ b/R/rsi_calc.R @@ -39,7 +39,7 @@ dots2vars <- function(...) { } #' @importFrom dplyr %>% pull all_vars any_vars filter_all funs mutate_all -# @importFrom clean percentage +#' @importFrom cleaner percentage rsi_calc <- function(..., ab_result, minimum = 0, diff --git a/data-raw/reproduction_of_antibiotics.R b/data-raw/reproduction_of_antibiotics.R index c7812506..75bd702a 100644 --- a/data-raw/reproduction_of_antibiotics.R +++ b/data-raw/reproduction_of_antibiotics.R @@ -308,7 +308,7 @@ antibiotics[which(antibiotics$ab == "CTX"), "abbreviations"][[1]] <- list(c(anti antibiotics[which(antibiotics$ab == "GEH"), "abbreviations"][[1]] <- list(c("gehl", "gentamicin high", "genta high")) antibiotics[which(antibiotics$ab == "STH"), "abbreviations"][[1]] <- list(c("sthl", "streptomycin high", "strepto high")) # add imi to imipenem -antibiotics[which(antibiotics$ab == "IPM"), "abbreviations"][[1]] <- list(c("imip", "imi")) +antibiotics[which(antibiotics$ab == "IPM"), "abbreviations"][[1]] <- list(c("imip", "imi", "imp")) ## new ATC codes # ceftaroline diff --git a/data/antibiotics.rda b/data/antibiotics.rda index d2fc0e81139fe258c14369334dad3e0455137a38..5174e2822cb7b7d90b4d17dfd3507b5405468f98 100755 GIT binary patch delta 34630 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 q*9&nx!pCVj`2kg28eBwGqXZRFL AMR (for R) - 0.8.0.9007 + 0.8.0.9008 diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index 235bfeb6..d9a871a9 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -84,7 +84,7 @@ AMR (for R) - 0.8.0.9007 + 0.8.0.9008 diff --git a/docs/articles/index.html b/docs/articles/index.html index 1e29a142..463a45d8 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -84,7 +84,7 @@ AMR (for R) - 0.8.0.9007 + 0.8.0.9008 diff --git a/docs/authors.html b/docs/authors.html index f90b0c5f..965cb58c 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -84,7 +84,7 @@ AMR (for R) - 0.8.0.9007 + 0.8.0.9008 diff --git a/docs/index.html b/docs/index.html index 12572cdd..2c98ae4d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -45,7 +45,7 @@ AMR (for R) - 0.8.0.9007 + 0.8.0.9008 diff --git a/docs/news/index.html b/docs/news/index.html index 98c6ec10..0b35e58b 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -84,7 +84,7 @@ AMR (for R) - 0.8.0.9007 + 0.8.0.9008 @@ -231,16 +231,20 @@ -
+

-AMR 0.8.0.9007 Unreleased +AMR 0.8.0.9008 Unreleased

-

Last updated: 30-Oct-2019

+

Last updated: 03-Nov-2019

New

    -
  • Support for a new MDRO guideline: Magiorakos AP, Srinivasan A et al. “Multidrug-resistant, extensively drug-resistant and pandrug-resistant bacteria: an international expert proposal for interim standard definitions for acquired resistance.” Clinical Microbiology and Infection (2012). This is now the new default guideline for the mdro() function. +
  • Support for a new MDRO guideline: Magiorakos AP, Srinivasan A et al. “Multidrug-resistant, extensively drug-resistant and pandrug-resistant bacteria: an international expert proposal for interim standard definitions for acquired resistance.” Clinical Microbiology and Infection (2012). +
      +
    • This is now the new default guideline for the mdro() function
    • +
    • The new Verbose mode (mdro(...., verbose = TRUE)) returns an informative data set where the reason for MDRO determination is given for every isolate
    • +
@@ -257,6 +261,14 @@
  • Fix for automatically determining columns with antibiotic results in mdro() and eucast_rules()
  • Added ATC codes for ceftaroline, ceftobiprole and faropenem and fixed two typos in the antibiotics data set
  • +
  • More robust way of determining valid MIC values
  • + +
    +
    +

    +Other

    +
      +
    • Change dependency on clean to cleaner, as this package was renamed accordingly upon CRAN request
    @@ -286,7 +298,7 @@ For WHONET users, this means that all records/isolates with organism code #> Warning message: #> invalid microorganism code, NA generated This is important, because a value like "testvalue" could never be understood by e.g. mo_name(), although the class would suggest a valid microbial code. -
  • Function freq() has moved to a new package, clean (CRAN link), since creating frequency tables actually does not fit the scope of this package. The freq() function still works, since it is re-exported from the clean package (which will be installed automatically upon updating this AMR package).
  • +
  • Function freq() has moved to a new package, clean (CRAN link), since creating frequency tables actually does not fit the scope of this package. The freq() function still works, since it is re-exported from the clean package (which will be installed automatically upon updating this AMR package).
  • Renamed data set septic_patients to example_isolates

  • @@ -401,9 +413,9 @@ Since this is a major change, usage of the old also_single_tested w
  • Added more MIC factor levels (as.mic())
  • -
    +

    -Other

    +Other
    • Added Prof. Dr. Casper Albers as doctoral advisor and added Dr. Judith Fonville, Eric Hazenberg, Dr. Bart Meijer, Dr. Dennis Souverein and Annick Lenglet as contributors
    • Cleaned the coding style of every single syntax line in this package with the help of the lintr package
    • @@ -484,9 +496,9 @@ Since this is a major change, usage of the old also_single_tested w
    -
    +

    -Other

    +Other
    • Fixed a note thrown by CRAN tests
    @@ -543,7 +555,7 @@ Please age() function gained a new parameter exact to determine ages with decimals
  • Removed deprecated functions guess_mo(), guess_atc(), EUCAST_rules(), interpretive_reading(), rsi()
  • -
  • Frequency tables (freq()): +
  • Frequency tables (freq()):
  • @@ -567,7 +579,7 @@ Please age_groups(), to let groups of fives and tens end with 100+ instead of 120+ -
  • Fix for freq() for when all values are NA +
  • Fix for freq() for when all values are NA
  • Fix for first_isolate() for when dates are missing
  • Improved speed of guess_ab_col() @@ -580,9 +592,9 @@ Please mo_shortname() where species would not be determined correctly

  • -
    +

    -Other

    +Other -
  • Frequency tables (freq() function): +
  • Frequency tables (freq() function):
  • + freq(mo_genus(mo))
  • Header info is now available as a list, with the header function
  • The parameter header is now set to TRUE at default, even for markdown
  • @@ -828,9 +840,9 @@ Using as.mo(..., allow_uncertain = 3)if using different lengths of pattern and x in %like%, it will now return the call
    -
    +

    -Other

    +Other
    • Updated licence text to emphasise GPL 2.0 and that this is an R package.
    @@ -892,18 +904,18 @@ Using as.mo(..., allow_uncertain = 3)Using portion_* functions now throws a warning when total available isolate is below parameter minimum
  • Functions as.mo, as.rsi, as.mic, as.atc and freq will not set package name as attribute anymore
  • -
  • Frequency tables - freq(): +
  • Frequency tables - freq():
  • Support for (un)selecting columns:

    septic_patients %>% 
    -  freq(hospital_id) %>% 
    +  freq(hospital_id) %>% 
       select(-count, -cum_count) # only get item, percent, cum_percent
  • Check for hms::is.hms @@ -953,9 +965,9 @@ Using as.mo(..., allow_uncertain = 3)

    Percentages will now will rounded more logically (e.g. in freq function)

  • -
    +

    -Other

    +Other
    • New dependency on package crayon, to support formatted text in the console
    • Dependency tidyr is now mandatory (went to Import field) since portion_df and count_df rely on it
    • @@ -1082,17 +1094,17 @@ Using as.mo(..., allow_uncertain = 3)

      Support for types (classes) list and matrix for freq

      my_matrix = with(septic_patients, matrix(c(age, gender), ncol = 2))
      -freq(my_matrix)
      +freq(my_matrix)

    For lists, subsetting is possible:

    my_list = list(age = septic_patients$age, gender = septic_patients$gender)
    -my_list %>% freq(age)
    -my_list %>% freq(gender)
    +my_list %>% freq(age) +my_list %>% freq(gender)
    -
    +

    -Other

    +Other
    • More unit tests to ensure better integrity of functions
    @@ -1160,13 +1172,13 @@ Using as.mo(..., allow_uncertain = 3)
  • A vignette to explain its usage
  • Support for rsi (antimicrobial resistance) to use as input
  • -
  • Support for table to use as input: freq(table(x, y)) +
  • Support for table to use as input: freq(table(x, y))
  • Support for existing functions hist and plot to use a frequency table as input: hist(freq(df$age))
  • Support for as.vector, as.data.frame, as_tibble and format
  • -
  • Support for quasiquotation: freq(mydata, mycolumn) is the same as mydata %>% freq(mycolumn) +
  • Support for quasiquotation: freq(mydata, mycolumn) is the same as mydata %>% freq(mycolumn)
  • Function top_freq function to return the top/below n items as vector
  • Header of frequency tables now also show Mean Absolute Deviaton (MAD) and Interquartile Range (IQR)
  • @@ -1219,9 +1231,9 @@ Using as.mo(..., allow_uncertain = 3)Other small fixes
    -
    +

    -Other

    +Other
    • Added integration tests (check if everything works as expected) for all releases of R 3.1 and higher
    -
    +

    -Other

    +Other
    • Expanded README.md with more examples
    • Added ORCID of authors to DESCRIPTION file
    • @@ -1320,7 +1332,7 @@ Using as.mo(..., allow_uncertain = 3)

      Contents

    @@ -288,9 +288,7 @@ plot(mic_data) barplot(mic_data) - -library(clean) -freq(mic_data) +freq(mic_data)
    @@ -336,9 +336,7 @@ plot(rsi_data) # for percentages barplot(rsi_data) # for frequencies - -library(clean) -freq(rsi_data) # frequency table with informative header +freq(rsi_data) # frequency table with informative header # using dplyr's mutate library(dplyr) diff --git a/docs/reference/catalogue_of_life_version.html b/docs/reference/catalogue_of_life_version.html index 7098082c..c9855855 100644 --- a/docs/reference/catalogue_of_life_version.html +++ b/docs/reference/catalogue_of_life_version.html @@ -85,7 +85,7 @@ AMR (for R) - 0.8.0 + 0.8.0.9008
    @@ -264,9 +264,8 @@ This package contains the complete taxonomic tree of almost all microorganisms (

    Examples

    library(dplyr)
    -library(clean)
    -microorganisms %>% freq(kingdom)
    -microorganisms %>% group_by(kingdom) %>% freq(phylum, nmax = NULL)
    +microorganisms %>% freq(kingdom) +microorganisms %>% group_by(kingdom) %>% freq(phylum, nmax = NULL)
    diff --git a/docs/reference/index.html b/docs/reference/index.html index 5ec7a9eb..e23de94e 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -84,7 +84,7 @@ AMR (for R) - 0.8.0.9007 + 0.8.0.9008 diff --git a/docs/reference/like.html b/docs/reference/like.html index ff179794..99af62db 100644 --- a/docs/reference/like.html +++ b/docs/reference/like.html @@ -85,7 +85,7 @@ AMR (for R) - 0.8.0 + 0.8.0.9008 @@ -304,11 +304,10 @@ # get frequencies of bacteria whose name start with 'Ent' or 'ent' library(dplyr) -library(clean) example_isolates %>% left_join_microorganisms() %>% filter(genus %like% '^ent') %>% - freq(genus, species) + freq(genus, species) @@ -238,7 +238,7 @@
    mdro(x, guideline = NULL, col_mo = NULL, info = TRUE,
    -  verbose = FALSE, ...)
    +  verbose = FALSE, pct_required_classes = 0.5, ...)
     
     brmo(x, guideline = "BRMO", ...)
     
    @@ -255,7 +255,7 @@
         
         
           x
    -      

    table with antibiotic columns, like e.g. AMX and AMC

    +

    data with antibiotic columns, like e.g. AMX and AMC

    guideline @@ -273,10 +273,18 @@ verbose

    print additional info: missing antibiotic columns per parameter

    + + pct_required_classes +

    minimal required percentage of antimicrobial classes that must be available per isolate, rounded down. For example, with the default guideline, 17 antimicrobial classes must be available for S. aureus. Setting this pct_required_classes argument to 0.5 (default) means that for every S. aureus isolate at least 8 different classes must be available. Any lower number of available classes will return NA for that isolate.

    + ...

    column name of an antibiotic, see section Antibiotics

    + + verbose +

    a logical to turn Verbose mode on and off (default is off). In Verbose mode, the function does not return the MDRO results, but instead returns a data set in logbook form with extensive info about which isolates would be MDRO-positive, or why they are not.

    +

    Source

    @@ -294,7 +302,8 @@

    Details

    -

    Currently supported guidelines are (case-insensitive):

      +

      For the pct_required_classes argument, values above 1 will be divided by 100. This is to support both fractions (0.75 or 3/4) and percentages (75). +Currently supported guidelines are (case-insensitive):

      • guideline = "CMI2012": Magiorakos AP, Srinivasan A et al. "Multidrug-resistant, extensively drug-resistant and pandrug-resistant bacteria: an international expert proposal for interim standard definitions for acquired resistance." Clinical Microbiology and Infection (2012) (link)

      • guideline = "EUCAST": The European international guideline - EUCAST Expert Rules Version 3.1 "Intrinsic Resistance and Exceptional Phenotypes Tables" (link)

      • guideline = "TB": The international guideline for multi-drug resistant tuberculosis - World Health Organization "Companion handbook to the WHO guidelines for the programmatic management of drug-resistant tuberculosis" (link)

      • @@ -399,18 +408,18 @@ example_isolates %>% mdro() %>% - freq() + freq() # \donttest{ example_isolates %>% - mutate(EUCAST = mdro(.), + mutate(EUCAST = eucast_exceptional_phenotypes(.), BRMO = brmo(.), MRGN = mrgn(.)) example_isolates %>% rename(PIP = TZP) %>% # no piperacillin, so take piperacillin/tazobactam mrgn() %>% # check German guideline - freq() # check frequencies + freq() # check frequencies # }
    diff --git a/docs/reference/mo_property.html b/docs/reference/mo_property.html index 97deaab8..055ae38b 100644 --- a/docs/reference/mo_property.html +++ b/docs/reference/mo_property.html @@ -85,7 +85,7 @@ AMR (for R) - 0.8.0.9007 + 0.8.0.9008 diff --git a/docs/reference/reexports.html b/docs/reference/reexports.html index 90791d69..985e135f 100644 --- a/docs/reference/reexports.html +++ b/docs/reference/reexports.html @@ -54,7 +54,7 @@ @@ -90,7 +90,7 @@ below to see their documentation. AMR (for R) - 0.8.0 + 0.8.0.9008 @@ -242,7 +242,7 @@ below to see their documentation.

    These objects are imported from other packages. Follow the links below to see their documentation.

    -
    clean

    freq

    +
    cleaner

    freq

    diff --git a/man/as.mic.Rd b/man/as.mic.Rd index b46617e9..25a09b47 100755 --- a/man/as.mic.Rd +++ b/man/as.mic.Rd @@ -47,8 +47,6 @@ as.rsi(x = as.mic(4), plot(mic_data) barplot(mic_data) - -library(clean) freq(mic_data) } \seealso{ diff --git a/man/as.rsi.Rd b/man/as.rsi.Rd index 6c1458ec..90faf7e4 100755 --- a/man/as.rsi.Rd +++ b/man/as.rsi.Rd @@ -90,8 +90,6 @@ as.rsi(x = as.mic(4), plot(rsi_data) # for percentages barplot(rsi_data) # for frequencies - -library(clean) freq(rsi_data) # frequency table with informative header # using dplyr's mutate diff --git a/man/catalogue_of_life_version.Rd b/man/catalogue_of_life_version.Rd index 26bffce6..a24d5806 100644 --- a/man/catalogue_of_life_version.Rd +++ b/man/catalogue_of_life_version.Rd @@ -30,7 +30,6 @@ On our website \url{https://msberends.gitlab.io/AMR} you can find \href{https:// \examples{ library(dplyr) -library(clean) microorganisms \%>\% freq(kingdom) microorganisms \%>\% group_by(kingdom) \%>\% freq(phylum, nmax = NULL) } diff --git a/man/like.Rd b/man/like.Rd index 4d4169ff..35e15b7e 100755 --- a/man/like.Rd +++ b/man/like.Rd @@ -62,7 +62,6 @@ a \%like\% b # get frequencies of bacteria whose name start with 'Ent' or 'ent' library(dplyr) -library(clean) example_isolates \%>\% left_join_microorganisms() \%>\% filter(genus \%like\% '^ent') \%>\% diff --git a/man/mdro.Rd b/man/mdro.Rd index 7c839bb8..63acaf1c 100644 --- a/man/mdro.Rd +++ b/man/mdro.Rd @@ -13,7 +13,7 @@ Please see Details for the list of publications used for this function. } \usage{ mdro(x, guideline = NULL, col_mo = NULL, info = TRUE, - verbose = FALSE, ...) + verbose = FALSE, pct_required_classes = 0.5, ...) brmo(x, guideline = "BRMO", ...) @@ -26,7 +26,7 @@ mdr_cmi2012(x, guideline = "CMI2012", ...) eucast_exceptional_phenotypes(x, guideline = "EUCAST", ...) } \arguments{ -\item{x}{table with antibiotic columns, like e.g. \code{AMX} and \code{AMC}} +\item{x}{data with antibiotic columns, like e.g. \code{AMX} and \code{AMC}} \item{guideline}{a specific guideline to follow. When left empty, the publication by Magiorakos \emph{et al.} (2012, Clinical Microbiology and Infection) will be followed, see Details.} @@ -36,7 +36,11 @@ eucast_exceptional_phenotypes(x, guideline = "EUCAST", ...) \item{verbose}{print additional info: missing antibiotic columns per parameter} +\item{pct_required_classes}{minimal required percentage of antimicrobial classes that must be available per isolate, rounded down. For example, with the default guideline, 17 antimicrobial classes must be available for \emph{S. aureus}. Setting this \code{pct_required_classes} argument to \code{0.5} (default) means that for every \emph{S. aureus} isolate at least 8 different classes must be available. Any lower number of available classes will return \code{NA} for that isolate.} + \item{...}{column name of an antibiotic, see section Antibiotics} + +\item{verbose}{a logical to turn Verbose mode on and off (default is off). In Verbose mode, the function does not return the MDRO results, but instead returns a data set in logbook form with extensive info about which isolates would be MDRO-positive, or why they are not.} } \value{ \itemize{ @@ -50,6 +54,7 @@ eucast_exceptional_phenotypes(x, guideline = "EUCAST", ...) Determine which isolates are multidrug-resistant organisms (MDRO) according to (country-specific) guidelines. } \details{ +For the \code{pct_required_classes} argument, values above 1 will be divided by 100. This is to support both fractions (\code{0.75} or \code{3/4}) and percentages (\code{75}). Currently supported guidelines are (case-insensitive): \itemize{ \item{\code{guideline = "CMI2012"}: Magiorakos AP, Srinivasan A \emph{et al.} "Multidrug-resistant, extensively drug-resistant and pandrug-resistant bacteria: an international expert proposal for interim standard definitions for acquired resistance." Clinical Microbiology and Infection (2012) (\href{https://www.clinicalmicrobiologyandinfection.com/article/S1198-743X(14)61632-3/fulltext}{link})} @@ -156,13 +161,13 @@ On our website \url{https://msberends.gitlab.io/AMR} you can find \href{https:// \examples{ library(dplyr) -example_isolates \%>\% - mdro() \%>\% +example_isolates \%>\% + mdro() \%>\% freq() \donttest{ example_isolates \%>\% - mutate(EUCAST = mdro(.), + mutate(EUCAST = eucast_exceptional_phenotypes(.), BRMO = brmo(.), MRGN = mrgn(.)) diff --git a/man/reexports.Rd b/man/reexports.Rd index 211ecdd9..4f14eecb 100644 --- a/man/reexports.Rd +++ b/man/reexports.Rd @@ -11,6 +11,6 @@ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ - \item{clean}{\code{\link[clean]{freq}}} + \item{cleaner}{\code{\link[cleaner]{freq}}} }} diff --git a/tests/testthat/test-freq.R b/tests/testthat/test-freq.R index 5dd39359..db032e7b 100755 --- a/tests/testthat/test-freq.R +++ b/tests/testthat/test-freq.R @@ -22,7 +22,7 @@ context("freq.R") test_that("frequency table works", { - library(clean) + library(cleaner) # mo expect_true(is.freq(freq(example_isolates$mo))) # for this to work, the output of mo_gramstain() is to be expected as follows: diff --git a/tests/testthat/test-mdro.R b/tests/testthat/test-mdro.R index a117f67d..268162a8 100755 --- a/tests/testthat/test-mdro.R +++ b/tests/testthat/test-mdro.R @@ -133,6 +133,7 @@ test_that("mdro works", { "S. aureus", "R", "R", "I", "I", "I", "I", "I", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R" ) expect_equal(as.integer(mdro(stau)), c(1:4)) + expect_s3_class(mdro(stau, verbose = TRUE), "data.frame") ente <- tribble( ~mo, ~GEH, ~STH, ~IPM, ~MEM, ~DOR, ~CIP, ~LVX, ~MFX, ~VAN, ~TEC, ~TGC, ~DAP, ~LNZ, ~AMP, ~QDA, ~DOX, ~MNO, @@ -142,6 +143,7 @@ test_that("mdro works", { "Enterococcus", "R", "R", "I", "I", "I", "I", "I", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R" ) expect_equal(as.integer(mdro(ente)), c(1:4)) + expect_s3_class(mdro(ente, verbose = TRUE), "data.frame") entero <- tribble( ~mo, ~GEN, ~TOB, ~AMK, ~NET, ~CPT, ~TCC, ~TZP, ~ETP, ~IPM, ~MEM, ~DOR, ~CZO, ~CXM, ~CTX, ~CAZ, ~FEP, ~FOX, ~CTT, ~CIP, ~SXT, ~TGC, ~ATM, ~AMP, ~AMC, ~SAM, ~CHL, ~FOS, ~COL, ~TCY, ~DOX, ~MNO, @@ -151,6 +153,7 @@ test_that("mdro works", { "E. coli", "R", "R", "I", "I", "I", "I", "I", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R" ) expect_equal(as.integer(mdro(entero)), c(1:4)) + expect_s3_class(mdro(entero, verbose = TRUE), "data.frame") pseud <- tribble( ~mo, ~GEN, ~TOB, ~AMK, ~NET, ~IPM, ~MEM, ~DOR, ~CAZ, ~FEP, ~CIP, ~LVX, ~TCC, ~TZP, ~ATM, ~FOS, ~COL, ~PLB, @@ -160,6 +163,7 @@ test_that("mdro works", { "P. aeruginosa", "R", "R", "I", "I", "I", "I", "I", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R" ) expect_equal(as.integer(mdro(pseud)), c(1:4)) + expect_s3_class(mdro(pseud, verbose = TRUE), "data.frame") acin <- tribble( ~mo, ~GEN, ~TOB, ~AMK, ~NET, ~IPM, ~MEM, ~DOR, ~CIP, ~LVX, ~TZP, ~TCC, ~CTX, ~CRO, ~CAZ, ~FEP, ~SXT, ~SAM, ~COL, ~PLB, ~TCY, ~DOX, ~MNO, @@ -169,5 +173,6 @@ test_that("mdro works", { "A. baumannii", "R", "R", "I", "I", "I", "I", "I", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R", "R" ) expect_equal(as.integer(mdro(acin)), c(1:4)) + expect_s3_class(mdro(acin, verbose = TRUE), "data.frame") })