From 65c6702b21f9d51f222cadc45a583c40ff37f40d Mon Sep 17 00:00:00 2001 From: "Matthijs S. Berends" Date: Thu, 27 Jun 2019 11:57:45 +0200 Subject: [PATCH] (v0.7.1.9004) atc class removal --- DESCRIPTION | 4 +- NAMESPACE | 15 ----- NEWS.md | 9 ++- R/ab_property.R | 4 +- R/atc.R | 85 ------------------------ R/count.R | 22 +++---- R/data.R | 4 +- R/deprecated.R | 69 +------------------- R/eucast_rules.R | 2 +- R/ggplot_rsi.R | 57 ++++++---------- R/globals.R | 60 +++-------------- R/guess_ab_col.R | 97 ++++++++++++++++++++++++++++ R/misc.R | 90 -------------------------- R/mo.R | 39 +++++++++-- R/mo_property.R | 51 ++++----------- R/portion.R | 11 +++- R/rsi_calc.R | 21 +++++- R/sysdata.rda | Bin 7365 -> 7414 bytes data-raw/translations.tsv | 65 ++++++++++--------- data/antibiotics.rda | Bin 34942 -> 34942 bytes docs/LICENSE-text.html | 2 +- docs/articles/index.html | 2 +- docs/authors.html | 2 +- docs/extra.js | 5 +- docs/index.html | 4 +- docs/news/index.html | 74 ++++++++++++--------- docs/reference/AMR-deprecated.html | 18 +----- docs/reference/WHONET.html | 4 +- docs/reference/count.html | 8 +-- docs/reference/ggplot_rsi.html | 25 +++---- docs/reference/index.html | 10 +-- docs/reference/mo_property.html | 4 +- docs/reference/portion.html | 13 +++- docs/reference/septic_patients.html | 4 +- docs/sitemap.xml | 3 - man/AMR-deprecated.Rd | 25 +------ man/WHONET.Rd | 2 +- man/as.atc.Rd | 55 ---------------- man/count.Rd | 6 +- man/ggplot_rsi.Rd | 21 +++--- man/mo_property.Rd | 2 +- man/portion.Rd | 11 +++- man/septic_patients.Rd | 2 +- pkgdown/extra.js | 5 +- tests/testthat/test-ab.R | 8 --- tests/testthat/test-atc.R | 39 ----------- tests/testthat/test-deprecated.R | 22 +++---- tests/testthat/test-ggplot_rsi.R | 15 ++--- tests/testthat/test-guess_ab_col.R | 3 +- 49 files changed, 393 insertions(+), 706 deletions(-) delete mode 100755 R/atc.R delete mode 100644 man/as.atc.Rd delete mode 100755 tests/testthat/test-atc.R diff --git a/DESCRIPTION b/DESCRIPTION index 89f14c3a..8cc41304 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 0.7.1.9003 -Date: 2019-06-23 +Version: 0.7.1.9004 +Date: 2019-06-27 Title: Antimicrobial Resistance Analysis Authors@R: c( person( diff --git a/NAMESPACE b/NAMESPACE index c1329d57..6963dd4b 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,7 +1,6 @@ # Generated by roxygen2: do not edit by hand S3method(as.data.frame,ab) -S3method(as.data.frame,atc) S3method(as.data.frame,freq) S3method(as.data.frame,mo) S3method(as.double,mic) @@ -29,7 +28,6 @@ S3method(plot,mic) S3method(plot,resistance_predict) S3method(plot,rsi) S3method(print,ab) -S3method(print,atc) S3method(print,catalogue_of_life_version) S3method(print,disk) S3method(print,freq) @@ -40,7 +38,6 @@ S3method(print,mo_renamed) S3method(print,mo_uncertainties) S3method(print,rsi) S3method(pull,ab) -S3method(pull,atc) S3method(pull,mo) S3method(select,freq) S3method(skewness,data.frame) @@ -58,11 +55,9 @@ export(ab_ddd) export(ab_group) export(ab_info) export(ab_name) -export(ab_official) export(ab_property) export(ab_synonyms) export(ab_tradenames) -export(abname) export(age) export(age_groups) export(anti_join_microorganisms) @@ -72,14 +67,9 @@ export(as.disk) export(as.mic) export(as.mo) export(as.rsi) -export(atc_name) -export(atc_official) export(atc_online_ddd) export(atc_online_groups) export(atc_online_property) -export(atc_property) -export(atc_tradenames) -export(atc_trivial_nl) export(availability) export(brmo) export(catalogue_of_life_version) @@ -121,7 +111,6 @@ export(guess_ab_col) export(header) export(inner_join_microorganisms) export(is.ab) -export(is.atc) export(is.disk) export(is.mic) export(is.mo) @@ -169,7 +158,6 @@ export(portion_R) export(portion_S) export(portion_SI) export(portion_df) -export(ratio) export(read.4D) export(resistance_predict) export(right_join_microorganisms) @@ -185,7 +173,6 @@ export(skewness) export(theme_rsi) export(top_freq) exportMethods(as.data.frame.ab) -exportMethods(as.data.frame.atc) exportMethods(as.data.frame.freq) exportMethods(as.data.frame.mo) exportMethods(as.double.mic) @@ -209,7 +196,6 @@ exportMethods(plot.freq) exportMethods(plot.mic) exportMethods(plot.rsi) exportMethods(print.ab) -exportMethods(print.atc) exportMethods(print.catalogue_of_life_version) exportMethods(print.disk) exportMethods(print.freq) @@ -220,7 +206,6 @@ exportMethods(print.mo_renamed) exportMethods(print.mo_uncertainties) exportMethods(print.rsi) exportMethods(pull.ab) -exportMethods(pull.atc) exportMethods(pull.mo) exportMethods(scale_type.ab) exportMethods(scale_type.mo) diff --git a/NEWS.md b/NEWS.md index 8492fcf7..48bdda46 100755 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,11 @@ -# AMR 0.7.1.9003 +# AMR 0.7.1.9004 -(no code changes yet) +### Changed +* Removed class `atc` - using `as.atc()` is now deprecated in favour of `ab_atc()` and this will return a character, not the `atc` class anymore +* Removed deprecated functions `abname()`, `ab_official()`, `atc_name()`, `atc_official()`, `atc_property()`, `atc_tradenames()`, `atc_trivial_nl()` +* Fix and speed improvement for `mo_shortname()` +* Fix for `as.mo()` where misspelled input would not be understood +* Fix for `also_single_tested` parameter in `count_*` functions # AMR 0.7.1 diff --git a/R/ab_property.R b/R/ab_property.R index 58d064a1..15246f17 100644 --- a/R/ab_property.R +++ b/R/ab_property.R @@ -150,7 +150,7 @@ ab_ddd <- function(x, administration = "oral", units = FALSE, ...) { ab_info <- function(x, language = get_locale(), ...) { x <- AMR::as.ab(x, ...) base::list(ab = as.character(x), - atc = as.character(ab_atc(x)), + atc = ab_atc(x), cid = ab_cid(x), name = ab_name(x, language = language), group = ab_group(x, language = language), @@ -192,7 +192,7 @@ ab_validate <- function(x, property, ...) { left_join(AMR::antibiotics, by = "ab") %>% pull(property) } - if (property %in% c("ab", "atc")) { + if (property == "ab") { return(structure(x, class = property)) } else if (property == "cid") { return(as.integer(x)) diff --git a/R/atc.R b/R/atc.R deleted file mode 100755 index 3cdaaa48..00000000 --- a/R/atc.R +++ /dev/null @@ -1,85 +0,0 @@ -# ==================================================================== # -# TITLE # -# Antimicrobial Resistance (AMR) Analysis # -# # -# SOURCE # -# https://gitlab.com/msberends/AMR # -# # -# LICENCE # -# (c) 2019 Berends MS (m.s.berends@umcg.nl), Luz CF (c.f.luz@umcg.nl) # -# # -# This R package is free software; you can freely use and distribute # -# it for both personal and commercial purposes under the terms of the # -# GNU General Public License version 2.0 (GNU GPL-2), as published by # -# the Free Software Foundation. # -# # -# This R package was created for academic research and was publicly # -# released in the hope that it will be useful, but it comes WITHOUT # -# ANY WARRANTY OR LIABILITY. # -# Visit our website for more info: https://msberends.gitlab.io/AMR. # -# ==================================================================== # - -#' Transform to ATC code -#' -#' Use this function to determine the ATC code of one or more antibiotics. The data set \code{\link{antibiotics}} will be searched for abbreviations, official names and trade names. -#' @param x character vector to determine \code{ATC} code -#' @rdname as.atc -#' @aliases atc -#' @keywords atc -#' @inheritSection WHOCC WHOCC -#' @export -#' @importFrom dplyr %>% filter slice pull -#' @details Use the \code{\link{ab_property}} functions to get properties based on the returned ATC code, see Examples. -#' -#' In the ATC classification system, the active substances are classified in a hierarchy with five different levels. The system has fourteen main anatomical/pharmacological groups or 1st levels. Each ATC main group is divided into 2nd levels which could be either pharmacological or therapeutic groups. The 3rd and 4th levels are chemical, pharmacological or therapeutic subgroups and the 5th level is the chemical substance. The 2nd, 3rd and 4th levels are often used to identify pharmacological subgroups when that is considered more appropriate than therapeutic or chemical subgroups. -#' Source: \url{https://www.whocc.no/atc/structure_and_principles/} -#' @return Character (vector) with class \code{"atc"}. Unknown values will return \code{NA}. -#' @seealso \code{\link{antibiotics}} for the dataframe that is being used to determine ATCs. -#' @inheritSection AMR Read more on our website! -#' @examples -#' # These examples all return "J01FA01", the ATC code of Erythromycin: -#' as.atc("J01FA01") -#' as.atc("Erythromycin") -#' as.atc("eryt") -#' as.atc(" eryt 123") -#' as.atc("ERYT") -#' as.atc("ERY") -as.atc <- function(x) { - ab_atc(x) -} - -#' @rdname as.atc -#' @export -is.atc <- function(x) { - identical(class(x), "atc") -} - -#' @exportMethod print.atc -#' @export -#' @noRd -print.atc <- function(x, ...) { - cat("Class 'atc'\n") - print.default(as.character(x), quote = FALSE) -} - -#' @exportMethod as.data.frame.atc -#' @export -#' @noRd -as.data.frame.atc <- function (x, ...) { - # same as as.data.frame.character but with removed stringsAsFactors - nm <- paste(deparse(substitute(x), width.cutoff = 500L), - collapse = " ") - if (!"nm" %in% names(list(...))) { - as.data.frame.vector(x, ..., nm = nm) - } else { - as.data.frame.vector(x, ...) - } -} - -#' @exportMethod pull.atc -#' @export -#' @importFrom dplyr pull -#' @noRd -pull.atc <- function(.data, ...) { - pull(as.data.frame(.data), ...) -} diff --git a/R/count.R b/R/count.R index 9fd8a69b..641e31c2 100755 --- a/R/count.R +++ b/R/count.R @@ -105,7 +105,7 @@ count_R <- function(..., also_single_tested = FALSE) { include_I = FALSE, minimum = 0, as_percent = FALSE, - also_single_tested = FALSE, + also_single_tested = also_single_tested, only_count = TRUE) } @@ -117,7 +117,7 @@ count_IR <- function(..., also_single_tested = FALSE) { include_I = TRUE, minimum = 0, as_percent = FALSE, - also_single_tested = FALSE, + also_single_tested = also_single_tested, only_count = TRUE) } @@ -129,7 +129,7 @@ count_I <- function(..., also_single_tested = FALSE) { include_I = FALSE, minimum = 0, as_percent = FALSE, - also_single_tested = FALSE, + also_single_tested = also_single_tested, only_count = TRUE) } @@ -141,7 +141,7 @@ count_SI <- function(..., also_single_tested = FALSE) { include_I = TRUE, minimum = 0, as_percent = FALSE, - also_single_tested = FALSE, + also_single_tested = also_single_tested, only_count = TRUE) } @@ -153,26 +153,24 @@ count_S <- function(..., also_single_tested = FALSE) { include_I = FALSE, minimum = 0, as_percent = FALSE, - also_single_tested = FALSE, + also_single_tested = also_single_tested, only_count = TRUE) } #' @rdname count #' @export -count_all <- function(...) { +count_all <- function(..., also_single_tested = FALSE) { + res_SI <- count_SI(..., also_single_tested = also_single_tested) # only print warnings once, if needed - count_S(...) + suppressWarnings(count_IR(...)) + res_R <- suppressWarnings(count_R(..., also_single_tested = also_single_tested)) + res_SI + res_R } #' @rdname count #' @export -n_rsi <- function(...) { - # only print warnings once, if needed - count_S(...) + suppressWarnings(count_IR(...)) -} +n_rsi<- count_all #' @rdname count -#' @importFrom dplyr %>% select_if bind_rows summarise_if mutate group_vars select everything #' @export count_df <- function(data, translate_ab = "name", diff --git a/R/data.R b/R/data.R index fc6bd1f9..adf3e19c 100755 --- a/R/data.R +++ b/R/data.R @@ -137,7 +137,7 @@ catalogue_of_life <- list( #' \item{\code{gender}}{gender of the patient} #' \item{\code{patient_id}}{ID of the patient, first 10 characters of an SHA hash containing irretrievable information} #' \item{\code{mo}}{ID of microorganism created with \code{\link{as.mo}}, see also \code{\link{microorganisms}}} -#' \item{\code{peni:rifa}}{40 different antibiotics with class \code{rsi} (see \code{\link{as.rsi}}); these column names occur in \code{\link{antibiotics}} data set and can be translated with \code{\link{abname}}} +#' \item{\code{peni:rifa}}{40 different antibiotics with class \code{rsi} (see \code{\link{as.rsi}}); these column names occur in \code{\link{antibiotics}} data set and can be translated with \code{\link{ab_name}}} #' } #' @inheritSection AMR Read more on our website! "septic_patients" @@ -172,7 +172,7 @@ catalogue_of_life <- list( #' \item{\code{Inducible clindamycin resistance}}{Clindamycin can be induced?} #' \item{\code{Comment}}{Other comments} #' \item{\code{Date of data entry}}{Date this data was entered in WHONET} -#' \item{\code{AMP_ND10:CIP_EE}}{27 different antibiotics. You can lookup the abbreviatons in the \code{\link{antibiotics}} data set, or use e.g. \code{\link{atc_name}("AMP")} to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using \code{\link{as.rsi}}.} +#' \item{\code{AMP_ND10:CIP_EE}}{27 different antibiotics. You can lookup the abbreviatons in the \code{\link{antibiotics}} data set, or use e.g. \code{\link{ab_name}("AMP")} to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using \code{\link{as.rsi}}.} #' } #' @inheritSection AMR Read more on our website! "WHONET" diff --git a/R/deprecated.R b/R/deprecated.R index 44d6b6e4..1096aede 100755 --- a/R/deprecated.R +++ b/R/deprecated.R @@ -27,71 +27,8 @@ #' @keywords internal #' @name AMR-deprecated #' @rdname AMR-deprecated -ratio <- function(x, ratio) { - .Deprecated(package = "AMR") - - if (!all(is.numeric(x))) { - stop('`x` must be a vector of numeric values.') - } - if (length(ratio) == 1) { - if (ratio %like% '^([0-9]+([.][0-9]+)?[-,:])+[0-9]+([.][0-9]+)?$') { - # support for "1:2:1", "1-2-1", "1,2,1" and even "1.75:2:1.5" - ratio <- ratio %>% strsplit("[-,:]") %>% unlist() %>% as.double() - } else { - stop('Invalid `ratio`: ', ratio, '.') - } - } - if (length(x) != 1 & length(x) != length(ratio)) { - stop('`x` and `ratio` must be of same size.') - } - sum(x, na.rm = TRUE) * (ratio / sum(ratio, na.rm = TRUE)) +as.atc <- function(x) { + .Deprecated("ab_atc", package = "AMR") + ab_atc(x) } -#' @rdname AMR-deprecated -#' @export -abname <- function(...) { - .Deprecated("ab_name", package = "AMR") - ab_name(...) -} - -#' @rdname AMR-deprecated -#' @export -atc_property <- function(...) { - .Deprecated("ab_property", package = "AMR") - ab_property(...) -} - -#' @rdname AMR-deprecated -#' @export -atc_official <- function(...) { - .Deprecated("ab_name", package = "AMR") - ab_name(...) -} - -#' @rdname AMR-deprecated -#' @export -ab_official <- function(...) { - .Deprecated("ab_name", package = "AMR") - ab_name(...) -} - -#' @rdname AMR-deprecated -#' @export -atc_name <- function(...) { - .Deprecated("ab_name", package = "AMR") - ab_name(...) -} - -#' @rdname AMR-deprecated -#' @export -atc_trivial_nl <- function(...) { - .Deprecated("ab_name", package = "AMR") - ab_name(..., language = "nl") -} - -#' @rdname AMR-deprecated -#' @export -atc_tradenames <- function(...) { - .Deprecated("ab_tradenames", package = "AMR") - ab_tradenames(...) -} diff --git a/R/eucast_rules.R b/R/eucast_rules.R index e6bb0a49..e237556a 100755 --- a/R/eucast_rules.R +++ b/R/eucast_rules.R @@ -392,7 +392,7 @@ eucast_rules <- function(x, x_original[rows, cols] <<- to, warning = function(w) { if (w$message %like% 'invalid factor level') { - warning('Value "', to, '" could not be applied to column(s) `', paste(cols, collapse = '`, `'), '` because this value is not an existing factor level.', call. = FALSE) + warning('Value "', to, '" could not be applied to column(s) `', paste(cols, collapse = '`, `'), '` because this value is not an existing factor level. You can use as.rsi() to fix this.', call. = FALSE) } else { warning(w$message, call. = FALSE) } diff --git a/R/ggplot_rsi.R b/R/ggplot_rsi.R index d678cb2d..40b43ccb 100755 --- a/R/ggplot_rsi.R +++ b/R/ggplot_rsi.R @@ -29,11 +29,10 @@ #' @param breaks numeric vector of positions #' @param limits numeric vector of length two providing limits of the scale, use \code{NA} to refer to the existing minimum or maximum #' @param facet variable to split plots by, either \code{"interpretation"} (default) or \code{"antibiotic"} or a grouping variable -#' @param fun function to transform \code{data}, either \code{\link{count_df}} (default) or \code{\link{portion_df}} #' @inheritParams portion #' @param nrow (when using \code{facet}) number of rows #' @param colours a named vector with colours for the bars. The names must be one or more of: S, SI, I, IR, R or be \code{FALSE} to use default \code{ggplot2} colours. -#' @param datalabels show datalabels using \code{labels_rsi_count}, will only be shown when \code{fun = count_df} +#' @param datalabels show datalabels using \code{labels_rsi_count} #' @param datalabels.size size of the datalabels #' @param datalabels.colour colour of the datalabels #' @param title text to show as title of the plot @@ -45,7 +44,7 @@ #' @details At default, the names of antibiotics will be shown on the plots using \code{\link{ab_name}}. This can be set with the \code{translate_ab} parameter. See \code{\link{count_df}}. #' #' \strong{The functions}\cr -#' \code{geom_rsi} will take any variable from the data that has an \code{rsi} class (created with \code{\link{as.rsi}}) using \code{fun} (\code{\link{count_df}} at default, can also be \code{\link{portion_df}}) and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. +#' \code{geom_rsi} will take any variable from the data that has an \code{rsi} class (created with \code{\link{as.rsi}}) using \code{\link{rsi_df}} and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. #' #' \code{facet_rsi} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2]{facet_wrap}}. #' @@ -87,7 +86,7 @@ #' # get only portions and no counts: #' septic_patients %>% #' select(AMX, NIT, FOS, TMP, CIP) %>% -#' ggplot_rsi(fun = portion_df) +#' ggplot_rsi(datalabels = FALSE) #' #' # add other ggplot2 parameters as you like: #' septic_patients %>% @@ -171,7 +170,6 @@ ggplot_rsi <- function(data, combine_SI = TRUE, combine_IR = FALSE, language = get_locale(), - fun = count_df, nrow = NULL, colours = c(S = "#61a8ff", SI = "#61a8ff", @@ -190,11 +188,6 @@ ggplot_rsi <- function(data, stopifnot_installed_package("ggplot2") - fun_name <- deparse(substitute(fun)) - if (!fun_name %in% c("portion_df", "count_df")) { - stop("`fun` must be portion_df or count_df") - } - x <- x[1] facet <- facet[1] @@ -223,7 +216,7 @@ ggplot_rsi <- function(data, p <- ggplot2::ggplot(data = data) + geom_rsi(position = position, x = x, fill = fill, translate_ab = translate_ab, - fun = fun, combine_SI = combine_SI, combine_IR = combine_IR, ...) + + combine_SI = combine_SI, combine_IR = combine_IR, ...) + theme_rsi() if (fill == "interpretation") { @@ -235,13 +228,12 @@ ggplot_rsi <- function(data, p <- p + scale_rsi_colours(colours = colours) } - if (fun_name == "portion_df" - | (fun_name == "count_df" & identical(position, "fill"))) { + if (identical(position, "fill")) { # portions, so use y scale with percentage p <- p + scale_y_percent(breaks = breaks, limits = limits) } - if (fun_name == "count_df" & datalabels == TRUE) { + if (datalabels == TRUE) { p <- p + labels_rsi_count(position = position, x = x, translate_ab = translate_ab, @@ -273,7 +265,6 @@ geom_rsi <- function(position = NULL, language = get_locale(), combine_SI = TRUE, combine_IR = FALSE, - fun = count_df, ...) { stopifnot_installed_package("ggplot2") @@ -282,19 +273,9 @@ geom_rsi <- function(position = NULL, stop("`position` is invalid. Did you accidentally use '%>%' instead of '+'?", call. = FALSE) } - fun_name <- deparse(substitute(fun)) - if (!fun_name %in% c("portion_df", "count_df", "fun")) { - stop("`fun` must be portion_df or count_df") - } y <- "value" - if (identical(fun, count_df)) { - if (missing(position) | is.null(position)) { - position <- "fill" - } - } else { - if (missing(position) | is.null(position)) { - position <- "stack" - } + if (missing(position) | is.null(position)) { + position <- "fill" } if (identical(position, "fill")) { @@ -321,11 +302,11 @@ geom_rsi <- function(position = NULL, ggplot2::layer(geom = "bar", stat = "identity", position = position, mapping = ggplot2::aes_string(x = x, y = y, fill = fill), params = list(...), data = function(x) { - fun(data = x, - translate_ab = translate_ab, - language = language, - combine_SI = combine_SI, - combine_IR = combine_IR) + AMR::rsi_df(data = x, + translate_ab = translate_ab, + language = language, + combine_SI = combine_SI, + combine_IR = combine_IR) }) } @@ -431,14 +412,12 @@ labels_rsi_count <- function(position = NULL, colour = datalabels.colour, lineheight = 0.75, data = function(x) { - # labels are only shown when function is count_df, - # so no need parameterise it here - count_df(data = x, - translate_ab = translate_ab, - combine_SI = combine_SI, - combine_IR = combine_IR) %>% + rsi_df(data = x, + translate_ab = translate_ab, + combine_SI = combine_SI, + combine_IR = combine_IR) %>% group_by_at(x_name) %>% mutate(lbl = paste0(percent(value / sum(value, na.rm = TRUE), force_zero = TRUE), - "\n(n=", value, ")")) + "\n(n=", isolates, ")")) }) } diff --git a/R/globals.R b/R/globals.R index 1cfbe387..baf90fdd 100755 --- a/R/globals.R +++ b/R/globals.R @@ -23,106 +23,66 @@ globalVariables(c(".", "..property", "ab", "abbreviations", - "mdr", - "mono_count", - "second", - "xdr", "antibiotic", - "Antibiotic", - "antibiotics", - "atc", - "authors", - "Becker", "CNS_CPS", - "cnt", "col_id", "count", "count.x", - "count.y", - "cum_count", - "cum_percent", "date_lab", "diff.percent", - "fctlvl", - "First name", + "First", "first_isolate_row_index", - "Freq", "fullname", "fullname_lower", "genus", "gramstain", "index", "input", - "Interpretation", "interpretation", + "isolates", "item", "key_ab", "key_ab_lag", "key_ab_other", "kingdom", - "labs", - "Lancefield", "lang", - "Last name", - "lbl", + "Last", "lookup", + "mdr", "median", - "mic", "microorganisms", - "microorganisms.codes", - "microorganisms.old", - "microorganisms.oldDT", - "microorganisms.prevDT", - "microorganisms.unprevDT", - "microorganismsDT", + "missing_names", "mo", - "mo.old", + "mono_count", "more_than_episode_ago", - "MPM", - "n", + "name", + "name", "name", "new", "observations", "observed", - "official", "old", "other_pat_or_mo", - "package_v", - "Pasted", "patient_id", "pattern", - "phylum", "plural", "prevalence", - "prevalent", - "property", - "psae", "R", "real_first_isolate", "ref", - "reference.rule", - "reference.rule_group", - "rsi", "rule_group", "rule_name", "S", "se_max", "se_min", - "septic_patients", + "second", "Sex", - "shortname", "species", "species_id", "subspecies", "synonyms", - "trade_name", - "trans", - "transmute", - "tsn", - "tsn_new", "txt", "value", - "Value", - "x", + "xdr", "y", "year")) diff --git a/R/guess_ab_col.R b/R/guess_ab_col.R index 6ce53715..148bea8f 100755 --- a/R/guess_ab_col.R +++ b/R/guess_ab_col.R @@ -104,3 +104,100 @@ guess_ab_col <- function(x = NULL, search_string = NULL, verbose = FALSE) { return(ab_result) } } + + +#' @importFrom crayon blue bold +#' @importFrom dplyr %>% mutate arrange pull +get_column_abx <- function(x, + soft_dependencies = NULL, + hard_dependencies = NULL, + verbose = FALSE, + ...) { + + # determine from given data set + df_trans <- data.frame(colnames = colnames(x), + abcode = suppressWarnings(as.ab(colnames(x)))) + df_trans <- df_trans[!is.na(df_trans$abcode),] + x <- as.character(df_trans$colnames) + names(x) <- df_trans$abcode + + # add from self-defined dots (...): + # get_column_abx(septic_patients %>% rename(thisone = AMX), amox = "thisone") + dots <- list(...) + if (length(dots) > 0) { + newnames <- suppressWarnings(as.ab(names(dots))) + if (any(is.na(newnames))) { + warning("Invalid antibiotic reference(s): ", toString(names(dots)[is.na(newnames)]), + call. = FALSE, immediate. = TRUE) + } + # turn all NULLs to NAs + dots <- unlist(lapply(dots, function(x) if (is.null(x)) NA else x)) + names(dots) <- newnames + dots <- dots[!is.na(names(dots))] + # merge, but overwrite automatically determined ones by 'dots' + x <- c(x[!x %in% dots & !names(x) %in% names(dots)], dots) + # delete NAs, this will make e.g. eucast_rules(... TMP = NULL) work to prevent TMP from being used + x <- x[!is.na(x)] + } + + # sort on name + x <- x[sort(names(x))] + dupes <- x[base::duplicated(x)] + + if (verbose == TRUE) { + for (i in 1:length(x)) { + if (x[i] %in% dupes) { + message(red(paste0("NOTE: Using column `", bold(x[i]), "` as input for `", names(x)[i], + "` (", ab_name(names(x)[i], language = "en", tolower = TRUE), ") [DUPLICATED USE]."))) + } else { + message(blue(paste0("NOTE: Using column `", bold(x[i]), "` as input for `", names(x)[i], + "` (", ab_name(names(x)[i], language = "en", tolower = TRUE), ")."))) + } + } + } + + if (n_distinct(x) != length(x)) { + msg_txt <- paste("Column(s)", paste0("`", dupes, "`", collapse = " and "), "used for more than one antibiotic.") + if (verbose == FALSE) { + msg_txt <- paste(msg_txt, "Use verbose = TRUE to see which antibiotics are used by which columns.") + } + stop(msg_txt, call. = FALSE) + } + + if (!is.null(hard_dependencies)) { + if (!all(hard_dependencies %in% names(x))) { + # missing a hard dependency will return NA and consequently the data will not be analysed + missing <- hard_dependencies[!hard_dependencies %in% names(x)] + generate_warning_abs_missing(missing, any = FALSE) + return(NA) + } + } + if (!is.null(soft_dependencies)) { + if (!all(soft_dependencies %in% names(x))) { + # missing a soft dependency may lower the reliability + missing <- soft_dependencies[!soft_dependencies %in% names(x)] + missing_txt <- data.frame(missing = missing, + missing_names = AMR::ab_name(missing, tolower = TRUE), + stringsAsFactors = FALSE) %>% + mutate(txt = paste0(bold(missing), " (", missing_names, ")")) %>% + arrange(missing_names) %>% + pull(txt) + message(blue('NOTE: Reliability might be improved if these antimicrobial results would be available too:', + paste(missing_txt, collapse = ", "))) + } + } + x +} + +generate_warning_abs_missing <- function(missing, any = FALSE) { + missing <- paste0(missing, " (", ab_name(missing, tolower = TRUE), ")") + if (any == TRUE) { + any_txt <- c(" any of", "is") + } else { + any_txt <- c("", "are") + } + warning(paste0("Introducing NAs since", any_txt[1], " these antimicrobials ", any_txt[2], " required: ", + paste(missing, collapse = ", ")), + immediate. = TRUE, + call. = FALSE) +} diff --git a/R/misc.R b/R/misc.R index 3e5f150c..babb054c 100755 --- a/R/misc.R +++ b/R/misc.R @@ -154,96 +154,6 @@ search_type_in_df <- function(x, type) { found } -#' @importFrom crayon blue bold -get_column_abx <- function(x, - soft_dependencies = NULL, - hard_dependencies = NULL, - verbose = FALSE, - ...) { - - # determine from given data set - df_trans <- data.frame(colnames = colnames(x), - abcode = suppressWarnings(as.ab(colnames(x)))) - df_trans <- df_trans[!is.na(df_trans$abcode),] - x <- as.character(df_trans$colnames) - names(x) <- df_trans$abcode - - # add from self-defined dots (...): - # get_column_abx(septic_patients %>% rename(thisone = AMX), amox = "thisone") - dots <- list(...) - if (length(dots) > 0) { - newnames <- suppressWarnings(as.ab(names(dots))) - if (any(is.na(newnames))) { - warning("Invalid antibiotic reference(s): ", toString(names(dots)[is.na(newnames)]), - call. = FALSE, immediate. = TRUE) - } - # turn all NULLs to NAs - dots <- unlist(lapply(dots, function(x) if (is.null(x)) NA else x)) - names(dots) <- newnames - dots <- dots[!is.na(names(dots))] - # merge, but overwrite automatically determined ones by 'dots' - x <- c(x[!x %in% dots & !names(x) %in% names(dots)], dots) - # delete NAs, this will make eucast_rules(... TMP = NULL) work to prevent TMP from being used - x <- x[!is.na(x)] - } - - # sort on name - x <- x[sort(names(x))] - duplies <- x[base::duplicated(x)] - - if (verbose == TRUE) { - for (i in 1:length(x)) { - if (x[i] %in% duplies) { - message(red(paste0("NOTE: Using column `", bold(x[i]), "` as input for `", names(x)[i], - "` (", ab_name(names(x)[i], language = "en", tolower = TRUE), ") [DUPLICATED USE]."))) - } else { - message(blue(paste0("NOTE: Using column `", bold(x[i]), "` as input for `", names(x)[i], - "` (", ab_name(names(x)[i], language = "en", tolower = TRUE), ")."))) - } - } - } - - if (n_distinct(x) != length(x)) { - msg_txt <- paste("Column(s)", paste0("`", duplies, "`", collapse = " and "), "used for more than one antibiotic.") - if (verbose == FALSE) { - msg_txt <- paste(msg_txt, "Use verbose = TRUE to see which antibiotics are used by which columns.") - } - stop(msg_txt, call. = FALSE) - } - - if (!is.null(hard_dependencies)) { - if (!all(hard_dependencies %in% names(x))) { - # missing a hard dependency will return NA and consequently the data will not be analysed - missing <- hard_dependencies[!hard_dependencies %in% names(x)] - generate_warning_abs_missing(missing, any = FALSE) - return(NA) - } - } - if (!is.null(soft_dependencies)) { - if (!all(soft_dependencies %in% names(x))) { - # missing a soft dependency may lower the reliability - missing <- soft_dependencies[!soft_dependencies %in% names(x)] - missing <- paste0(bold(missing), " (", ab_name(missing, tolower = TRUE), ")") - message(blue('NOTE: Reliability might be improved if these antimicrobial results would be available too:', paste(missing, collapse = ", "))) - } - } - x -} - -generate_warning_abs_missing <- function(missing, any = FALSE) { - missing <- paste0(missing, " (", ab_name(missing, tolower = TRUE), ")") - if (any == TRUE) { - any_txt <- c(" any of", "is") - } else { - any_txt <- c("", "are") - } - warning(paste0("Introducing NAs since", any_txt[1], " these antimicrobials ", any_txt[2], " required: ", - paste(missing, collapse = ", ")), - immediate. = TRUE, - call. = FALSE) -} - - stopifnot_installed_package <- function(package) { # no "utils::installed.packages()" since it requires non-staged install since R 3.6.0 # https://developer.r-project.org/Blog/public/2019/02/14/staged-install/index.html diff --git a/R/mo.R b/R/mo.R index dd6ee2f3..b1f5fbf3 100755 --- a/R/mo.R +++ b/R/mo.R @@ -486,7 +486,7 @@ exec_as.mo <- function(x, # remove genus as first word x <- gsub("^Genus ", "", x) # allow characters that resemble others - if (initial_search == FALSE) { + if (uncertainty_level >= 2) { x <- tolower(x) x <- gsub("[iy]+", "[iy]+", x) x <- gsub("(c|k|q|qu|s|z|x|ks)+", "(c|k|q|qu|s|z|x|ks)+", x) @@ -494,9 +494,13 @@ exec_as.mo <- function(x, x <- gsub("(th|t)+", "(th|t)+", x) x <- gsub("a+", "a+", x) x <- gsub("u+", "u+", x) - # allow any ending of -um, -us, -ium, -ius and -a (needs perl for the negative backward lookup): - x <- gsub("(um|u\\[sz\\]\\+|\\[iy\\]\\+um|\\[iy\\]\\+u\\[sz\\]\\+|a\\+)(?![a-z[])", - "(um|us|ium|ius|a)", x, ignore.case = TRUE, perl = TRUE) + # allow any ending of -um, -us, -ium, -icum, -ius, -icus, -ica and -a (needs perl for the negative backward lookup): + x <- gsub("(u\\+\\(c\\|k\\|q\\|qu\\+\\|s\\|z\\|x\\|ks\\)\\+)(?![a-z[])", + "(u[s|m]|[iy][ck]?u[ms]|[iy]?[ck]?a)", x, ignore.case = TRUE, perl = TRUE) + x <- gsub("(\\[iy\\]\\+\\(c\\|k\\|q\\|qu\\+\\|s\\|z\\|x\\|ks\\)\\+a\\+)(?![a-z[])", + "(u[s|m]|[iy][ck]?u[ms]|[iy]?[ck]?a)", x, ignore.case = TRUE, perl = TRUE) + x <- gsub("(\\[iy\\]\\+u\\+m)(?![a-z[])", + "(u[s|m]|[iy][ck]?u[ms]|[iy]?[ck]?a)", x, ignore.case = TRUE, perl = TRUE) x <- gsub("e+", "e+", x, ignore.case = TRUE) x <- gsub("o+", "o+", x, ignore.case = TRUE) x <- gsub("(.)\\1+", "\\1+", x) @@ -1078,8 +1082,33 @@ exec_as.mo <- function(x, return(found[1L]) } - # (5) try to strip off one element from end and check the remains ---- + # (5a) try to strip off half an element from end and check the remains ---- x_strip <- a.x_backup %>% strsplit(" ") %>% unlist() + if (length(x_strip) > 1) { + for (i in 1:(length(x_strip) - 1)) { + lastword <- x_strip[length(x_strip) - i + 1] + lastword_half <- substr(lastword, 1, as.integer(nchar(lastword) / 2)) + # remove last half of the second term + x_strip_collapsed <- paste(c(x_strip[1:(length(x_strip) - i)], lastword_half), collapse = " ") + if (nchar(x_strip_collapsed) >= 4) { + found <- suppressMessages(suppressWarnings(exec_as.mo(x_strip_collapsed, initial_search = FALSE, allow_uncertain = FALSE))) + if (!empty_result(found)) { + found_result <- found + found <- microorganismsDT[mo == found, ..property][[1]] + uncertainties <<- rbind(uncertainties, + data.frame(uncertainty = 2, + input = a.x_backup, + fullname = microorganismsDT[mo == found_result[1L], fullname][[1]], + mo = found_result[1L])) + if (initial_search == TRUE) { + set_mo_history(a.x_backup, get_mo_code(found[1L], property), 2, force = force_mo_history) + } + return(found[1L]) + } + } + } + } + # (5b) try to strip off one element from end and check the remains ---- if (length(x_strip) > 1) { for (i in 1:(length(x_strip) - 1)) { x_strip_collapsed <- paste(x_strip[1:(length(x_strip) - i)], collapse = " ") diff --git a/R/mo_property.R b/R/mo_property.R index f9a06003..4dfac1fd 100755 --- a/R/mo_property.R +++ b/R/mo_property.R @@ -111,7 +111,7 @@ #' mo_fullname("S. pyo") # "Streptococcus pyogenes" #' mo_fullname("S. pyo", Lancefield = TRUE) # "Streptococcus group A" #' mo_shortname("S. pyo") # "S. pyogenes" -#' mo_shortname("S. pyo", Lancefield = TRUE) # "GAS" ('Group A streptococci') +#' mo_shortname("S. pyo", Lancefield = TRUE) # "GAS" (='Group A Streptococci') #' #' #' # language support for German, Dutch, Spanish, Portuguese, Italian and French @@ -148,44 +148,17 @@ mo_fullname <- mo_name #' @importFrom dplyr %>% mutate pull #' @export mo_shortname <- function(x, language = get_locale(), ...) { - dots <- list(...) - Becker <- dots$Becker - if (is.null(Becker)) { - Becker <- FALSE - } - Lancefield <- dots$Lancefield - if (is.null(Lancefield)) { - Lancefield <- FALSE - } + x.mo <- as.mo(x, ...) + # get first char of genus and complete species in English + shortnames <- paste0(substr(mo_genus(x.mo, language = NULL), 1, 1), ". ", mo_species(x.mo, language = NULL)) - # get result without transformations - res1 <- AMR::as.mo(x, Becker = FALSE, Lancefield = FALSE, reference_df = dots$reference_df) - # and result with transformations - res2 <- suppressWarnings(AMR::as.mo(res1, ...)) - res2_fullname <- mo_fullname(res2, language = language) - res2_fullname[res2_fullname %like% " \\(CoNS\\)"] <- "CoNS" - res2_fullname[res2_fullname %like% " \\(CoPS\\)"] <- "CoPS" - res2_fullname[res2_fullname %like% " \\(KNS\\)"] <- "KNS" - res2_fullname[res2_fullname %like% " \\(KPS\\)"] <- "KPS" - res2_fullname[res2_fullname %like% " \\(CNS\\)"] <- "CNS" - res2_fullname[res2_fullname %like% " \\(CPS\\)"] <- "CPS" - res2_fullname[res2_fullname %like% " \\(SCN\\)"] <- "SCN" - res2_fullname <- gsub("Streptococcus (group|Gruppe|gruppe|groep|grupo|gruppo|groupe) (.)", - "G\\2S", - res2_fullname) # turn "Streptococcus group A" and "Streptococcus grupo A" to "GAS" - res2_fullname_vector <- res2_fullname[res2_fullname == mo_fullname(res1)] - res2_fullname[res2_fullname == mo_fullname(res1)] <- paste0(substr(mo_genus(res2_fullname_vector), 1, 1), - ". ", - suppressWarnings(mo_species(res2_fullname_vector))) - if (sum(res1 == res2, na.rm = TRUE) > 0) { - res1[res1 == res2] <- paste0(substr(mo_genus(res1[res1 == res2]), 1, 1), - ". ", - suppressWarnings(mo_species(res1[res1 == res2]))) - } - res1[res1 != res2] <- res2_fullname - result <- as.character(res1) + # exceptions for Staphylococci + shortnames[shortnames == "S. coagulase-negative" ] <- "CoNS" + shortnames[shortnames == "S. coagulase-positive" ] <- "CoPS" + # exceptions for Streptococci + shortnames[shortnames %like% "S. group [ABCDFGHK]"] <- paste0("G", gsub("S. group ([ABCDFGHK])", "\\1", shortnames[shortnames %like% "S. group [ABCDFGHK]"]), "S") - translate_AMR(result, language = language, only_unknown = FALSE) + translate_AMR(shortnames, language = language, only_unknown = FALSE) } #' @rdname mo_property @@ -246,7 +219,7 @@ mo_type <- function(x, language = get_locale(), ...) { #' @export mo_gramstain <- function(x, language = get_locale(), ...) { x.mo <- as.mo(x, ...) - x.phylum <- mo_phylum(x.mo, language = "en") + x.phylum <- mo_phylum(x.mo, language = NULL) # DETERMINE GRAM STAIN FOR BACTERIA # Source: https://itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=956097 # It says this: @@ -259,7 +232,7 @@ mo_gramstain <- function(x, language = get_locale(), ...) { # Phylum Tenericutes (Murray, 1984) x <- NA_character_ # make all bacteria Gram negative - x[mo_kingdom(x.mo, language = "en") == "Bacteria"] <- "Gram-negative" + x[mo_kingdom(x.mo, language = NULL) == "Bacteria"] <- "Gram-negative" # overwrite these phyla with Gram positive x[x.phylum %in% c("Actinobacteria", "Chloroflexi", diff --git a/R/portion.R b/R/portion.R index 3474b52a..18e2d00c 100755 --- a/R/portion.R +++ b/R/portion.R @@ -27,7 +27,7 @@ #' @param ... one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with \code{\link{as.rsi}} if needed. Use multiple columns to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See Examples. #' @param minimum the minimum allowed number of available (tested) isolates. Any isolate count lower than \code{minimum} will return \code{NA} with a warning. The default number of \code{30} isolates is advised by the Clinical and Laboratory Standards Institute (CLSI) as best practice, see Source. #' @param as_percent a logical to indicate whether the output must be returned as a hundred fold with \% sign (a character). A value of \code{0.123456} will then be returned as \code{"12.3\%"}. -#' @param also_single_tested a logical to indicate whether (in combination therapies) also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of \code{portion_S} and R in case of \code{portion_R}). \strong{This would lead to selection bias in almost all cases.} +#' @param also_single_tested a logical to indicate whether for combination therapies also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of \code{portion_S} and R in case of \code{portion_R}). \strong{This could lead to selection bias.} #' @param data a \code{data.frame} containing columns with class \code{rsi} (see \code{\link{as.rsi}}) #' @param translate_ab a column name of the \code{\link{antibiotics}} data set to translate the antibiotic abbreviations to, using \code{\link{ab_property}} #' @inheritParams ab_property @@ -112,6 +112,15 @@ #' septic_patients %>% portion_S(AMC, GEN) # S = 92.3% #' septic_patients %>% count_all(AMC, GEN) # n = 1798 #' +#' # Using `also_single_tested` can be useful ... +#' septic_patients %>% +#' portion_S(AMC, GEN, +#' also_single_tested = TRUE) # S = 92.6% +#' # ... but can also lead to selection bias - the data only has 2,000 rows: +#' septic_patients %>% +#' count_all(AMC, GEN, +#' also_single_tested = TRUE) # n = 2555 +#' #' #' septic_patients %>% #' group_by(hospital_id) %>% diff --git a/R/rsi_calc.R b/R/rsi_calc.R index fd648eb9..19960479 100755 --- a/R/rsi_calc.R +++ b/R/rsi_calc.R @@ -19,6 +19,23 @@ # Visit our website for more info: https://msberends.gitlab.io/AMR. # # ==================================================================== # +#' @importFrom rlang enquos as_label +dots2vars <- function(...) { + paste( + unlist( + lapply(enquos(...), + function(x) { + l <- as_label(x) + if (l != ".") { + l + } else { + character(0) + } + }) + ), + collapse = ", ") +} + #' @importFrom dplyr %>% pull all_vars any_vars filter_all funs mutate_all rsi_calc <- function(..., type, @@ -28,6 +45,8 @@ rsi_calc <- function(..., also_single_tested, only_count) { + data_vars <- dots2vars(...) + if (!is.logical(include_I)) { stop('`include_I` must be logical', call. = FALSE) } @@ -138,7 +157,7 @@ rsi_calc <- function(..., } if (total < minimum) { - warning("Introducing NA: only ", total, " results available (minimum set to ", minimum, ").", call. = FALSE) + warning("Introducing NA: only ", total, " results available for ", data_vars, " (minimum set to ", minimum, ").", call. = FALSE) result <- NA } else { result <- found / total diff --git a/R/sysdata.rda b/R/sysdata.rda index 44b572534e6c2737363efb026d7a5ba080d3009e..43047d60c17405c15d16c6771a12754466287ac2 100644 GIT binary patch literal 7414 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 literal 7365 zcmV;$96IAdT4*^jL0KkKS($FP5CAv_fBgUd|Ns8~{CmIu|9`*#|MWlvAOLLo3IGTI z014nF{s*5gJKK@%ZkcBAMLS>t>^;|Yj=C``-KehK*=fakJE&|Ixko*{*_CMYJJ{Dj z=;?!GT_|*0EG>}KhIV^2KppHI92M9DuX&GNT2)i6(2_!E34t;xu&1FXlPJjbC#mW& zsp#6L>X_8YrkXT8OrEEy=p$(jq&* z8Vvvd001-yktvE(^(p!?n^gTw)jv~HBTp%{KUCVEl^Sg$)bz>+ln+FDk4OO8k5ke- z)i$T7^#*_*pot*@0svDc5s(27MLbbGPfTPqnrQ*#gG1CbY3Q1Ik3?w542O@(2)-Ks z+KDC722U)8%7}+2Vw6w~vH%ILB5vnG0M$?R zYYM8mH+kU< z1z{092SOfd5uO`_YxSy7CHPXTh_w*fAyGom3W5?Q0A@-JpvfTM6Mrwt`X>bP-$H9^ zE7pbDf-g_HOwEP?g9MbZ_H6RN0nyW;e@zAxHP9@Q4$K;{VFYA>$>BX+ z#gG#h&=&k=5|JclgRv(vb4QP%yO=&msUVj;>VU{*|V)o#0036TV2`GIEHL>Fl$4Evrx}DRgf%*i!dO7&1Th`ydi*0 zl6JbVh6!U;Vo7j&!0HY73`P|&bQ~i*aFTJr@zXupIx|S}%*Ar-=DNyn+1SYNz8@19 zNMb0Vcy&ZuXgLjstZq56;!PtqruL{tF2eR8q&LtGiWjvrotHkilBncl7pW4=ErQrJ!p*_cw2?) z*4p6m_Ky;8z5wu(T?^Gz?P|dW(CTfsW$}9cF6#(hH>OQuH0#@Hp_pqrh+u=q4mCtt z8B18y&XqAR{E`aClfI@3(rd3~(X9{^&vuwuBSEXC5OcJ+YTo<{Fq9!B?+M<3dPv{n zxEk_ZwCsUWK&AV`R^3dkrz0?4RH3KAd^ zBM1Qq3nIv%q0WM#`CFLo?T-~zK7TZO~| zq56TspCgvMgO!6dv8MJJ1>54~;t5cdahV`eMu1`u<`C(Hi$Mm=9|KTcaBb`xrRa*gj<~)>KTMHG*8&l#q)|Ek^^@iKnnp|jieJ3q6Xy;4n|j z2hLaahKn%p2k?Vn4UdKf-xs-H|2feI2OjB|5&j@>C+i28d=3%zk%_~AhsE|PgMs=$ z$$Ve11|E^k!}@@KXLy+j2pHfHnL)wm=Xi7xW_T) zZ&M2L2ZpZ}7{B7L^b6#1;)X93Udyfo3+Qr1$T``)MnL1^WTA{wXbWK&!%+S5c;xbw z-glH}5Nru<`$|1;R;s8+)DVcCgw&7g=cC*4d>#eN@Lv+^ycveARrFn@x?NShe1A6E zF81!s%=f+Q&b9N=s3XT~Z_hQ8YZ!E0HE?~`;G-661;f)5Ft4tufqe;=NhuKIcX*Bs z?DkUZFk^Au5O0hOH=pblfUFVorFBnVGd=&aR?v|E&9!va#FsazndsZMBIY%0A|B~W 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 diff --git a/data-raw/translations.tsv b/data-raw/translations.tsv index 4e83286e..0456fe47 100644 --- a/data-raw/translations.tsv +++ b/data-raw/translations.tsv @@ -14,8 +14,8 @@ de unknown genus unbekannte Gattung FALSE FALSE de unknown species unbekannte Art FALSE FALSE de unknown subspecies unbekannte Unterart FALSE FALSE de unknown rank unbekannter Rang FALSE FALSE -de (CoNS) (KNS) TRUE FALSE -de (CoPS) (KPS) TRUE FALSE +de CoNS KNS TRUE FALSE +de CoPS KPS TRUE FALSE de Gram-negative Gramnegativ FALSE FALSE de Gram-positive Grampositiv FALSE FALSE de Bacteria Bakterien FALSE FALSE @@ -41,8 +41,8 @@ nl unknown genus onbekend geslacht FALSE FALSE nl unknown species onbekende soort FALSE FALSE nl unknown subspecies onbekende ondersoort FALSE FALSE nl unknown rank onbekende rang FALSE FALSE -nl (CoNS) (CNS) TRUE FALSE -nl (CoPS) (CPS) TRUE FALSE +nl CoNS CNS TRUE FALSE +nl CoPS CPS TRUE FALSE nl Gram-negative Gram-negatief FALSE FALSE nl Gram-positive Gram-positief FALSE FALSE nl Bacteria Bacteriën FALSE FALSE @@ -67,8 +67,8 @@ es unknown genus género desconocido FALSE FALSE es unknown species especie desconocida FALSE FALSE es unknown subspecies subespecie desconocida FALSE FALSE es unknown rank rango desconocido FALSE FALSE -es (CoNS) (SCN) TRUE FALSE -es (CoPS) (SCP) TRUE FALSE +es CoNS SCN TRUE FALSE +es CoPS SCP TRUE FALSE es Gram-negative Gram negativo FALSE FALSE es Gram-positive Gram positivo FALSE FALSE es Bacteria Bacterias FALSE FALSE @@ -179,32 +179,33 @@ nl Capreomycin Capreomycine nl Carbenicillin Carbenicilline nl Carindacillin Carindacilline nl Caspofungin Caspofungine -nl Cefacetrile Cefacetril -nl Cefalexin Cefalexine -nl Cefalotin Cefalotine -nl Cefamandole Cefamandol -nl Cefapirin Cefapirine -nl Cefazedone Cefazedon -nl Cefazolin Cefazoline -nl Cefepime Cefepim -nl Cefixime Cefixim -nl Cefmenoxime Cefmenoxim -nl Cefmetazole Cefmetazol -nl Cefodizime Cefodizim -nl Cefonicid Cefonicide -nl Cefoperazone Cefoperazon -nl Cefoperazone/beta-lactamase inhibitor Cefoperazon/enzymremmer -nl Cefotaxime Cefotaxim -nl Cefoxitin Cefoxitine -nl Cefpirome Cefpirom -nl Cefpodoxime Cefpodoxim -nl Cefsulodin Cefsulodine -nl Ceftazidime Ceftazidim -nl Ceftezole Ceftezol -nl Ceftizoxime Ceftizoxim -nl Ceftriaxone Ceftriaxon -nl Cefuroxime Cefuroxim -nl Cefuroxime/metronidazole Cefuroxim/andere antibacteriele middelen +nl Ce(f|ph)acetrile Cefacetril FALSE +nl Ce(f|ph)alexin Cefalexine FALSE FALSE +nl Ce(f|ph)alotin Cefalotine FALSE +nl Ce(f|ph)amandole Cefamandol FALSE +nl Ce(f|ph)apirin Cefapirine FALSE +nl Ce(f|ph)azedone Cefazedon FALSE +nl Ce(f|ph)azolin Cefazoline FALSE +nl Ce(f|ph)epime Cefepim FALSE +nl Ce(f|ph)ixime Cefixim FALSE +nl Ce(f|ph)menoxime Cefmenoxim FALSE +nl Ce(f|ph)metazole Cefmetazol FALSE +nl Ce(f|ph)odizime Cefodizim FALSE +nl Ce(f|ph)onicid Cefonicide FALSE +nl Ce(f|ph)operazone Cefoperazon FALSE +nl Ce(f|ph)operazone/beta-lactamase inhibitor Cefoperazon/enzymremmer FALSE +nl Ce(f|ph)otaxime Cefotaxim FALSE +nl Ce(f|ph)oxitin Cefoxitine FALSE +nl Ce(f|ph)pirome Cefpirom FALSE +nl Ce(f|ph)podoxime Cefpodoxim FALSE +nl Ce(f|ph)radine Cefradine FALSE +nl Ce(f|ph)sulodin Cefsulodine FALSE +nl Ce(f|ph)tazidime Ceftazidim FALSE +nl Ce(f|ph)tezole Ceftezol FALSE +nl Ce(f|ph)tizoxime Ceftizoxim FALSE +nl Ce(f|ph)triaxone Ceftriaxon FALSE +nl Ce(f|ph)uroxime Cefuroxim FALSE +nl Ce(f|ph)uroxime/metronidazole Cefuroxim/andere antibacteriele middelen FALSE nl Chloramphenicol Chlooramfenicol nl Chlortetracycline Chloortetracycline nl Cinoxacin Cinoxacine diff --git a/data/antibiotics.rda b/data/antibiotics.rda index 3cc000503dca3dc0d4f6a93ba790b07d7c8c9d13..8ecf8c51517edd5a5b7412cdff5918dd60e80a5a 100755 GIT binary patch literal 34942 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 literal 34942 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 I0(=9bKyYuef&c&j diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index 0c7b7107..370609a0 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -78,7 +78,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004 diff --git a/docs/articles/index.html b/docs/articles/index.html index 85228423..ff3cfa46 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -78,7 +78,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004 diff --git a/docs/authors.html b/docs/authors.html index 5ff48dac..c79f7acc 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -78,7 +78,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004 diff --git a/docs/extra.js b/docs/extra.js index 63f504a9..d2ce07dc 100644 --- a/docs/extra.js +++ b/docs/extra.js @@ -31,10 +31,9 @@ $('head').append('(function(t,e,s,o){var n,a,c;t.SMCX=t.SMCX||[],e.getElementById(o)||(n=e.getElementsByTagName(s),a=n[n.length-1],c=e.createElement(s),c.type="text/javascript",c.async=!0,c.id=o,c.src=["https:"===location.protocol?"https://":"http://","widget.surveymonkey.com/collect/website/js/tRaiETqnLgj758hTBazgd_2BrwaGaWbg59AiLjNGdPaaJiBHKqgXKIw46VauwBvZ67.js"].join(""),a.parentNode.insertBefore(c,a))})(window,document,"script","smcx-sdk");'); - + // $('body').append(''); // add link to survey at home sidebar - $('.template-home #sidebar .list-unstyled:first').append('
  • Please fill in our survey at
    https://www.surveymonkey.com/r/AMR_for_R
  • '); + // $('.template-home #sidebar .list-unstyled:first').append('
  • Please fill in our survey at
    https://www.surveymonkey.com/r/AMR_for_R
  • '); // remove version label from header diff --git a/docs/index.html b/docs/index.html index fa6e8812..d1b07f56 100644 --- a/docs/index.html +++ b/docs/index.html @@ -42,7 +42,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004 @@ -314,7 +314,7 @@

    It cleanses existing data by providing new classes for microoganisms, antibiotics and antimicrobial results (both S/I/R and MIC). By installing this package, you teach R everything about microbiology that is needed for analysis. These functions all use intelligent rules to guess results that you would expect:

    • Use as.mo() to get a microbial ID. The IDs are human readable for the trained eye - the ID of Klebsiella pneumoniae is “B_KLBSL_PNE” (B stands for Bacteria) and the ID of S. aureus is “B_STPHY_AUR”. The function takes almost any text as input that looks like the name or code of a microorganism like “E. coli”, “esco” or “esccol” and tries to find expected results using intelligent rules combined with the included Catalogue of Life data set. It only takes milliseconds to find results, please see our benchmarks. Moreover, it can group Staphylococci into coagulase negative and positive (CoNS and CoPS, see source) and can categorise Streptococci into Lancefield groups (like beta-haemolytic Streptococcus Group B, source).
    • -
    • Use as.ab() to get an antibiotic ID. Like microbial IDs, these IDs are also human readable based on those used by EARS-Net. For example, the ID of amoxicillin is AMX and the ID of gentamicin is GEN. The as.ab() function also uses intelligent rules to find results like accepting misspelling, trade names and abbrevations used in many laboratory systems. For instance, the values “Furabid”, “Furadantin”, “nitro” all return the ID of Nitrofurantoine. To accomplish this, the package contains a database with most LIS codes, official names, trade names, DDDs and categories of antibiotics. The function as.atc() will return the ATC code of an antibiotic as defined by the WHO.
    • +
    • Use as.ab() to get an antibiotic ID. Like microbial IDs, these IDs are also human readable based on those used by EARS-Net. For example, the ID of amoxicillin is AMX and the ID of gentamicin is GEN. The as.ab() function also uses intelligent rules to find results like accepting misspelling, trade names and abbrevations used in many laboratory systems. For instance, the values “Furabid”, “Furadantin”, “nitro” all return the ID of Nitrofurantoine. To accomplish this, the package contains a database with most LIS codes, official names, trade names, DDDs and categories of antibiotics. The function as.atc() will return the ATC code of an antibiotic as defined by the WHO.
    • Use as.rsi() to get antibiotic interpretations based on raw MIC values (in mg/L) or disk diffusion values (in mm), or transform existing values to valid antimicrobial results. It produces just S, I or R based on your input and warns about invalid values. Even values like “<=0.002; S” (combined MIC/RSI) will result in “S”.
    • Use as.mic() to cleanse your MIC values. It produces a so-called factor (called ordinal in SPSS) with valid MIC values as levels. A value like “<=0.002; S” (combined MIC/RSI) will result in “<=0.002”.
    diff --git a/docs/news/index.html b/docs/news/index.html index 5dbe1e7a..139669cb 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -78,7 +78,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004 @@ -232,11 +232,23 @@ -
    +

    -AMR 0.7.1.9003 Unreleased +AMR 0.7.1.9004 Unreleased

    -

    (no code changes yet)

    +
    +

    +Changed

    +
      +
    • Removed class atc - using as.atc() is now deprecated in favour of ab_atc() and this will return a character, not the atc class anymore
    • +
    • Removed deprecated functions abname(), ab_official(), atc_name(), atc_official(), atc_property(), atc_tradenames(), atc_trivial_nl() +
    • +
    • Fix and speed improvement for mo_shortname() +
    • +
    • Fix for as.mo() where misspelled input would not be understood
    • +
    • Fix for also_single_tested parameter in count_* functions
    • +
    +

    @@ -284,9 +296,9 @@
  • Function mo_synonyms() to get all previously accepted taxonomic names of a microorganism

  • -
    +

    -Changed

    +Changed
    • Column names of output count_df() and portion_df() are now lowercase
    • Fixed bug in translation of microorganism names
    • @@ -333,9 +345,9 @@
    • Added guidelines of the WHO to determine multi-drug resistance (MDR) for TB (mdr_tb()) and added a new vignette about MDR. Read this tutorial here on our website.
    -
    +

    -Changed

    +Changed
    -
    +

    -Changed

    +Changed
    • Function eucast_rules():
        @@ -543,7 +555,7 @@ These functions use as.atc()
      • Removed columns atc_group1_nl and atc_group2_nl from the antibiotics data set
      • Functions atc_ddd() and atc_groups() have been renamed atc_online_ddd() and atc_online_groups(). The old functions are deprecated and will be removed in a future version.
      • Function guess_mo() is now deprecated in favour of as.mo() and will be removed in future versions
      • -
      • Function guess_atc() is now deprecated in favour of as.atc() and will be removed in future versions
      • +
      • Function guess_atc() is now deprecated in favour of as.atc() and will be removed in future versions
      • Improvements for as.mo():
        • @@ -681,9 +693,9 @@ Using as.mo(..., allow_uncertain = 3)Functions mo_authors and mo_year to get specific values about the scientific reference of a taxonomic entry
    -
    +

    -Changed

    +Changed
    • Functions MDRO, BRMO, MRGN and EUCAST_exceptional_phenotypes were renamed to mdro, brmo, mrgn and eucast_exceptional_phenotypes
    • @@ -865,14 +877,14 @@ Using as.mo(..., allow_uncertain = 3)

      Renamed septic_patients$sex to septic_patients$gender

    -
    +

    -Changed

    +Changed
    -
    +

    -Changed

    +Changed
    • Improvements for forecasting with resistance_predict and added more examples
    • More antibiotics added as parameters for EUCAST rules
    • @@ -1034,7 +1046,7 @@ Using as.mo(..., allow_uncertain = 3)
    • Now possible to coerce MIC values with a space between operator and value, i.e. as.mic("<= 0.002") now works
    • Classes rsi and mic do not add the attribute package.version anymore
    • -
    • Added "groups" option for atc_property(..., property). It will return a vector of the ATC hierarchy as defined by the WHO. The new function atc_groups is a convenient wrapper around this.
    • +
    • Added "groups" option for atc_property(..., property). It will return a vector of the ATC hierarchy as defined by the WHO. The new function atc_groups is a convenient wrapper around this.
    • Build-in host check for atc_property as it requires the host set by url to be responsive
    • Improved first_isolate algorithm to exclude isolates where bacteria ID or genus is unavailable
    • Fix for warning hybrid evaluation forced for row_number (924b62) from the dplyr package v0.7.5 and above
    • @@ -1088,9 +1100,9 @@ Using as.mo(..., allow_uncertain = 3)New print format for tibbles and data.tables
    -
    +

    -Changed

    +Changed
    • Fixed rsi class for vectors that contain only invalid antimicrobial interpretations
    • Renamed dataset ablist to antibiotics @@ -1147,7 +1159,7 @@ Using as.mo(..., allow_uncertain = 3)

      Contents

    @@ -241,21 +241,7 @@
    -
    ratio(x, ratio)
    -
    -abname(...)
    -
    -atc_property(...)
    -
    -atc_official(...)
    -
    -ab_official(...)
    -
    -atc_name(...)
    -
    -atc_trivial_nl(...)
    -
    -atc_tradenames(...)
    +
    as.atc(x)

    Read more on our website!

    diff --git a/docs/reference/WHONET.html b/docs/reference/WHONET.html index b0daef68..d9d01156 100644 --- a/docs/reference/WHONET.html +++ b/docs/reference/WHONET.html @@ -80,7 +80,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004
    @@ -271,7 +271,7 @@
    Inducible clindamycin resistance

    Clindamycin can be induced?

    Comment

    Other comments

    Date of data entry

    Date this data was entered in WHONET

    -
    AMP_ND10:CIP_EE

    27 different antibiotics. You can lookup the abbreviatons in the antibiotics data set, or use e.g. atc_name("AMP") to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using as.rsi.

    +
    AMP_ND10:CIP_EE

    27 different antibiotics. You can lookup the abbreviatons in the antibiotics data set, or use e.g. ab_name("AMP") to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using as.rsi.

    Read more on our website!

    diff --git a/docs/reference/count.html b/docs/reference/count.html index 6b507f81..2b1f50a1 100644 --- a/docs/reference/count.html +++ b/docs/reference/count.html @@ -81,7 +81,7 @@ count_R and count_IR can be used to count resistant isolates, count_S and count_ AMR (for R) - 0.7.1.9003 + 0.7.1.9004
    @@ -253,9 +253,9 @@ count_R and count_IR can be used to count resistant isolates, count_S and count_ count_S(..., also_single_tested = FALSE) -count_all(...) +count_all(..., also_single_tested = FALSE) -n_rsi(...) +n_rsi(..., also_single_tested = FALSE) count_df(data, translate_ab = "name", language = get_locale(), combine_SI = TRUE, combine_IR = FALSE) @@ -269,7 +269,7 @@ count_R and count_IR can be used to count resistant isolates, count_S and count_ also_single_tested -

    a logical to indicate whether (in combination therapies) also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of portion_S and R in case of portion_R). This would lead to selection bias in almost all cases.

    +

    a logical to indicate whether for combination therapies also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of portion_S and R in case of portion_R). This could lead to selection bias.

    data diff --git a/docs/reference/ggplot_rsi.html b/docs/reference/ggplot_rsi.html index b0d45e51..eeb3c741 100644 --- a/docs/reference/ggplot_rsi.html +++ b/docs/reference/ggplot_rsi.html @@ -80,7 +80,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004
    @@ -244,17 +244,16 @@
    ggplot_rsi(data, position = NULL, x = "antibiotic",
       fill = "interpretation", facet = NULL, breaks = seq(0, 1, 0.1),
       limits = NULL, translate_ab = "name", combine_SI = TRUE,
    -  combine_IR = FALSE, language = get_locale(), fun = count_df,
    -  nrow = NULL, colours = c(S = "#61a8ff", SI = "#61a8ff", I =
    -  "#61f7ff", IR = "#ff6961", R = "#ff6961"), datalabels = TRUE,
    -  datalabels.size = 2.5, datalabels.colour = "gray15", title = NULL,
    -  subtitle = NULL, caption = NULL, x.title = NULL, y.title = NULL,
    -  ...)
    +  combine_IR = FALSE, language = get_locale(), nrow = NULL,
    +  colours = c(S = "#61a8ff", SI = "#61a8ff", I = "#61f7ff", IR =
    +  "#ff6961", R = "#ff6961"), datalabels = TRUE, datalabels.size = 2.5,
    +  datalabels.colour = "gray15", title = NULL, subtitle = NULL,
    +  caption = NULL, x.title = NULL, y.title = NULL, ...)
     
     geom_rsi(position = NULL, x = c("antibiotic", "interpretation"),
       fill = "interpretation", translate_ab = "name",
       language = get_locale(), combine_SI = TRUE, combine_IR = FALSE,
    -  fun = count_df, ...)
    +  ...)
     
     facet_rsi(facet = c("interpretation", "antibiotic"), nrow = NULL)
     
    @@ -316,10 +315,6 @@
           language
           

    language of the returned text, defaults to system language (see get_locale) and can also be set with getOption("AMR_locale"). Use language = NULL or language = "" to prevent translation.

    - - fun -

    function to transform data, either count_df (default) or portion_df

    - nrow

    (when using facet) number of rows

    @@ -330,7 +325,7 @@ datalabels -

    show datalabels using labels_rsi_count, will only be shown when fun = count_df

    +

    show datalabels using labels_rsi_count

    datalabels.size @@ -370,7 +365,7 @@

    At default, the names of antibiotics will be shown on the plots using ab_name. This can be set with the translate_ab parameter. See count_df.

    The functions
    -geom_rsi will take any variable from the data that has an rsi class (created with as.rsi) using fun (count_df at default, can also be portion_df) and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis.

    +geom_rsi will take any variable from the data that has an rsi class (created with as.rsi) using rsi_df and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis.

    facet_rsi creates 2d plots (at default based on S/I/R) using facet_wrap.

    scale_y_percent transforms the y axis to a 0 to 100% range using scale_continuous.

    scale_rsi_colours sets colours to the bars: pastel blue for S, pastel turquoise for I and pastel red for R, using scale_brewer.

    @@ -410,7 +405,7 @@ # get only portions and no counts: septic_patients %>% select(AMX, NIT, FOS, TMP, CIP) %>% - ggplot_rsi(fun = portion_df) + ggplot_rsi(datalabels = FALSE) # add other ggplot2 parameters as you like: septic_patients %>% diff --git a/docs/reference/index.html b/docs/reference/index.html index 39ea7893..2ed5fc35 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -78,7 +78,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004
    @@ -286,12 +286,6 @@

    Transform to antibiotic ID

    - -

    as.atc() is.atc()

    - -

    Transform to ATC code

    - -

    as.disk() is.disk()

    @@ -569,7 +563,7 @@ -

    ratio() abname() atc_property() atc_official() ab_official() atc_name() atc_trivial_nl() atc_tradenames()

    +

    as.atc()

    Deprecated functions

    diff --git a/docs/reference/mo_property.html b/docs/reference/mo_property.html index 9ef2c60b..3b82969a 100644 --- a/docs/reference/mo_property.html +++ b/docs/reference/mo_property.html @@ -80,7 +80,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004
    @@ -417,7 +417,7 @@ This package contains the complete taxonomic tree of almost all microorganisms ( mo_fullname("S. pyo") # "Streptococcus pyogenes" mo_fullname("S. pyo", Lancefield = TRUE) # "Streptococcus group A" mo_shortname("S. pyo") # "S. pyogenes" -mo_shortname("S. pyo", Lancefield = TRUE) # "GAS" ('Group A streptococci') +mo_shortname("S. pyo", Lancefield = TRUE) # "GAS" (='Group A Streptococci') # language support for German, Dutch, Spanish, Portuguese, Italian and French diff --git a/docs/reference/portion.html b/docs/reference/portion.html index 9ee65afa..58144382 100644 --- a/docs/reference/portion.html +++ b/docs/reference/portion.html @@ -81,7 +81,7 @@ portion_R and portion_IR can be used to calculate resistance, portion_S and port AMR (for R) - 0.7.1.9003 + 0.7.1.9004
    @@ -283,7 +283,7 @@ portion_R and portion_IR can be used to calculate resistance, portion_S and port also_single_tested -

    a logical to indicate whether (in combination therapies) also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of portion_S and R in case of portion_R). This would lead to selection bias in almost all cases.

    +

    a logical to indicate whether for combination therapies also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of portion_S and R in case of portion_R). This could lead to selection bias.

    data @@ -403,6 +403,15 @@ portion_R and portion_IR can be used to calculate resistance, portion_S and port septic_patients %>% portion_S(AMC, GEN) # S = 92.3% septic_patients %>% count_all(AMC, GEN) # n = 1798 +# Using `also_single_tested` can be useful ... +septic_patients %>% + portion_S(AMC, GEN, + also_single_tested = TRUE) # S = 92.6% +# ... but can also lead to selection bias - the data only has 2,000 rows: +septic_patients %>% + count_all(AMC, GEN, + also_single_tested = TRUE) # n = 2555 + septic_patients %>% group_by(hospital_id) %>% diff --git a/docs/reference/septic_patients.html b/docs/reference/septic_patients.html index 324e72e2..410350bb 100644 --- a/docs/reference/septic_patients.html +++ b/docs/reference/septic_patients.html @@ -80,7 +80,7 @@ AMR (for R) - 0.7.1.9003 + 0.7.1.9004
    @@ -255,7 +255,7 @@
    gender

    gender of the patient

    patient_id

    ID of the patient, first 10 characters of an SHA hash containing irretrievable information

    mo

    ID of microorganism created with as.mo, see also microorganisms

    -
    peni:rifa

    40 different antibiotics with class rsi (see as.rsi); these column names occur in antibiotics data set and can be translated with abname

    +
    peni:rifa

    40 different antibiotics with class rsi (see as.rsi); these column names occur in antibiotics data set and can be translated with ab_name

    Read more on our website!

    diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 1d3f5d05..67b4672e 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -30,9 +30,6 @@ https://msberends.gitlab.io/AMR/reference/as.ab.html - - https://msberends.gitlab.io/AMR/reference/as.atc.html - https://msberends.gitlab.io/AMR/reference/as.disk.html diff --git a/man/AMR-deprecated.Rd b/man/AMR-deprecated.Rd index 160df844..4cd84531 100644 --- a/man/AMR-deprecated.Rd +++ b/man/AMR-deprecated.Rd @@ -2,31 +2,10 @@ % Please edit documentation in R/deprecated.R \name{AMR-deprecated} \alias{AMR-deprecated} -\alias{ratio} -\alias{abname} -\alias{atc_property} -\alias{atc_official} -\alias{ab_official} -\alias{atc_name} -\alias{atc_trivial_nl} -\alias{atc_tradenames} +\alias{as.atc} \title{Deprecated functions} \usage{ -ratio(x, ratio) - -abname(...) - -atc_property(...) - -atc_official(...) - -ab_official(...) - -atc_name(...) - -atc_trivial_nl(...) - -atc_tradenames(...) +as.atc(x) } \description{ These functions are so-called '\link{Deprecated}'. They will be removed in a future release. Using the functions will give a warning with the name of the function it has been replaced by (if there is one). diff --git a/man/WHONET.Rd b/man/WHONET.Rd index 0be5644c..03561b75 100644 --- a/man/WHONET.Rd +++ b/man/WHONET.Rd @@ -31,7 +31,7 @@ \item{\code{Inducible clindamycin resistance}}{Clindamycin can be induced?} \item{\code{Comment}}{Other comments} \item{\code{Date of data entry}}{Date this data was entered in WHONET} - \item{\code{AMP_ND10:CIP_EE}}{27 different antibiotics. You can lookup the abbreviatons in the \code{\link{antibiotics}} data set, or use e.g. \code{\link{atc_name}("AMP")} to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using \code{\link{as.rsi}}.} + \item{\code{AMP_ND10:CIP_EE}}{27 different antibiotics. You can lookup the abbreviatons in the \code{\link{antibiotics}} data set, or use e.g. \code{\link{ab_name}("AMP")} to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using \code{\link{as.rsi}}.} }} \usage{ WHONET diff --git a/man/as.atc.Rd b/man/as.atc.Rd deleted file mode 100644 index 1d628475..00000000 --- a/man/as.atc.Rd +++ /dev/null @@ -1,55 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/atc.R -\name{as.atc} -\alias{as.atc} -\alias{atc} -\alias{is.atc} -\title{Transform to ATC code} -\usage{ -as.atc(x) - -is.atc(x) -} -\arguments{ -\item{x}{character vector to determine \code{ATC} code} -} -\value{ -Character (vector) with class \code{"atc"}. Unknown values will return \code{NA}. -} -\description{ -Use this function to determine the ATC code of one or more antibiotics. The data set \code{\link{antibiotics}} will be searched for abbreviations, official names and trade names. -} -\details{ -Use the \code{\link{ab_property}} functions to get properties based on the returned ATC code, see Examples. - -In the ATC classification system, the active substances are classified in a hierarchy with five different levels. The system has fourteen main anatomical/pharmacological groups or 1st levels. Each ATC main group is divided into 2nd levels which could be either pharmacological or therapeutic groups. The 3rd and 4th levels are chemical, pharmacological or therapeutic subgroups and the 5th level is the chemical substance. The 2nd, 3rd and 4th levels are often used to identify pharmacological subgroups when that is considered more appropriate than therapeutic or chemical subgroups. - Source: \url{https://www.whocc.no/atc/structure_and_principles/} -} -\section{WHOCC}{ - -\if{html}{\figure{logo_who.png}{options: height=60px style=margin-bottom:5px} \cr} -This package contains \strong{all ~450 antimicrobial drugs} and their Anatomical Therapeutic Chemical (ATC) codes, ATC groups and Defined Daily Dose (DDD) from the World Health Organization Collaborating Centre for Drug Statistics Methodology (WHOCC, \url{https://www.whocc.no}) and the Pharmaceuticals Community Register of the European Commission (\url{http://ec.europa.eu/health/documents/community-register/html/atc.htm}). - -These have become the gold standard for international drug utilisation monitoring and research. - -The WHOCC is located in Oslo at the Norwegian Institute of Public Health and funded by the Norwegian government. The European Commission is the executive of the European Union and promotes its general interest. -} - -\section{Read more on our website!}{ - -On our website \url{https://msberends.gitlab.io/AMR} you can find \href{https://msberends.gitlab.io/AMR/articles/AMR.html}{a tutorial} about how to conduct AMR analysis, the \href{https://msberends.gitlab.io/AMR/reference}{complete documentation of all functions} (which reads a lot easier than here in R) and \href{https://msberends.gitlab.io/AMR/articles/WHONET.html}{an example analysis using WHONET data}. -} - -\examples{ -# These examples all return "J01FA01", the ATC code of Erythromycin: -as.atc("J01FA01") -as.atc("Erythromycin") -as.atc("eryt") -as.atc(" eryt 123") -as.atc("ERYT") -as.atc("ERY") -} -\seealso{ -\code{\link{antibiotics}} for the dataframe that is being used to determine ATCs. -} -\keyword{atc} diff --git a/man/count.Rd b/man/count.Rd index 0dc75372..906e365d 100644 --- a/man/count.Rd +++ b/man/count.Rd @@ -25,9 +25,9 @@ count_SI(..., also_single_tested = FALSE) count_S(..., also_single_tested = FALSE) -count_all(...) +count_all(..., also_single_tested = FALSE) -n_rsi(...) +n_rsi(..., also_single_tested = FALSE) count_df(data, translate_ab = "name", language = get_locale(), combine_SI = TRUE, combine_IR = FALSE) @@ -35,7 +35,7 @@ count_df(data, translate_ab = "name", language = get_locale(), \arguments{ \item{...}{one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with \code{\link{as.rsi}} if needed.} -\item{also_single_tested}{a logical to indicate whether (in combination therapies) also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of \code{portion_S} and R in case of \code{portion_R}). \strong{This would lead to selection bias in almost all cases.}} +\item{also_single_tested}{a logical to indicate whether for combination therapies also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of \code{portion_S} and R in case of \code{portion_R}). \strong{This could lead to selection bias.}} \item{data}{a \code{data.frame} containing columns with class \code{rsi} (see \code{\link{as.rsi}})} diff --git a/man/ggplot_rsi.Rd b/man/ggplot_rsi.Rd index d87e21b6..73e8522f 100644 --- a/man/ggplot_rsi.Rd +++ b/man/ggplot_rsi.Rd @@ -13,17 +13,16 @@ ggplot_rsi(data, position = NULL, x = "antibiotic", fill = "interpretation", facet = NULL, breaks = seq(0, 1, 0.1), limits = NULL, translate_ab = "name", combine_SI = TRUE, - combine_IR = FALSE, language = get_locale(), fun = count_df, - nrow = NULL, colours = c(S = "#61a8ff", SI = "#61a8ff", I = - "#61f7ff", IR = "#ff6961", R = "#ff6961"), datalabels = TRUE, - datalabels.size = 2.5, datalabels.colour = "gray15", title = NULL, - subtitle = NULL, caption = NULL, x.title = NULL, y.title = NULL, - ...) + combine_IR = FALSE, language = get_locale(), nrow = NULL, + colours = c(S = "#61a8ff", SI = "#61a8ff", I = "#61f7ff", IR = + "#ff6961", R = "#ff6961"), datalabels = TRUE, datalabels.size = 2.5, + datalabels.colour = "gray15", title = NULL, subtitle = NULL, + caption = NULL, x.title = NULL, y.title = NULL, ...) geom_rsi(position = NULL, x = c("antibiotic", "interpretation"), fill = "interpretation", translate_ab = "name", language = get_locale(), combine_SI = TRUE, combine_IR = FALSE, - fun = count_df, ...) + ...) facet_rsi(facet = c("interpretation", "antibiotic"), nrow = NULL) @@ -61,13 +60,11 @@ labels_rsi_count(position = NULL, x = "antibiotic", \item{language}{language of the returned text, defaults to system language (see \code{\link{get_locale}}) and can also be set with \code{\link{getOption}("AMR_locale")}. Use \code{language = NULL} or \code{language = ""} to prevent translation.} -\item{fun}{function to transform \code{data}, either \code{\link{count_df}} (default) or \code{\link{portion_df}}} - \item{nrow}{(when using \code{facet}) number of rows} \item{colours}{a named vector with colours for the bars. The names must be one or more of: S, SI, I, IR, R or be \code{FALSE} to use default \code{ggplot2} colours.} -\item{datalabels}{show datalabels using \code{labels_rsi_count}, will only be shown when \code{fun = count_df}} +\item{datalabels}{show datalabels using \code{labels_rsi_count}} \item{datalabels.size}{size of the datalabels} @@ -92,7 +89,7 @@ Use these functions to create bar plots for antimicrobial resistance analysis. A At default, the names of antibiotics will be shown on the plots using \code{\link{ab_name}}. This can be set with the \code{translate_ab} parameter. See \code{\link{count_df}}. \strong{The functions}\cr -\code{geom_rsi} will take any variable from the data that has an \code{rsi} class (created with \code{\link{as.rsi}}) using \code{fun} (\code{\link{count_df}} at default, can also be \code{\link{portion_df}}) and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. +\code{geom_rsi} will take any variable from the data that has an \code{rsi} class (created with \code{\link{as.rsi}}) using \code{\link{rsi_df}} and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. \code{facet_rsi} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2]{facet_wrap}}. @@ -136,7 +133,7 @@ septic_patients \%>\% # get only portions and no counts: septic_patients \%>\% select(AMX, NIT, FOS, TMP, CIP) \%>\% - ggplot_rsi(fun = portion_df) + ggplot_rsi(datalabels = FALSE) # add other ggplot2 parameters as you like: septic_patients \%>\% diff --git a/man/mo_property.Rd b/man/mo_property.Rd index 7b8195a6..a134a06b 100644 --- a/man/mo_property.Rd +++ b/man/mo_property.Rd @@ -188,7 +188,7 @@ mo_shortname("S. epi", Becker = TRUE) # "CoNS" mo_fullname("S. pyo") # "Streptococcus pyogenes" mo_fullname("S. pyo", Lancefield = TRUE) # "Streptococcus group A" mo_shortname("S. pyo") # "S. pyogenes" -mo_shortname("S. pyo", Lancefield = TRUE) # "GAS" ('Group A streptococci') +mo_shortname("S. pyo", Lancefield = TRUE) # "GAS" (='Group A Streptococci') # language support for German, Dutch, Spanish, Portuguese, Italian and French diff --git a/man/portion.Rd b/man/portion.Rd index 208f0100..8c4cf253 100644 --- a/man/portion.Rd +++ b/man/portion.Rd @@ -46,7 +46,7 @@ rsi_df(data, translate_ab = "name", language = get_locale(), \item{as_percent}{a logical to indicate whether the output must be returned as a hundred fold with \% sign (a character). A value of \code{0.123456} will then be returned as \code{"12.3\%"}.} -\item{also_single_tested}{a logical to indicate whether (in combination therapies) also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of \code{portion_S} and R in case of \code{portion_R}). \strong{This would lead to selection bias in almost all cases.}} +\item{also_single_tested}{a logical to indicate whether for combination therapies also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of \code{portion_S} and R in case of \code{portion_R}). \strong{This could lead to selection bias.}} \item{data}{a \code{data.frame} containing columns with class \code{rsi} (see \code{\link{as.rsi}})} @@ -155,6 +155,15 @@ septic_patients \%>\% count_all(GEN) # n = 1855 septic_patients \%>\% portion_S(AMC, GEN) # S = 92.3\% septic_patients \%>\% count_all(AMC, GEN) # n = 1798 +# Using `also_single_tested` can be useful ... +septic_patients \%>\% + portion_S(AMC, GEN, + also_single_tested = TRUE) # S = 92.6\% +# ... but can also lead to selection bias - the data only has 2,000 rows: +septic_patients \%>\% + count_all(AMC, GEN, + also_single_tested = TRUE) # n = 2555 + septic_patients \%>\% group_by(hospital_id) \%>\% diff --git a/man/septic_patients.Rd b/man/septic_patients.Rd index 486adc1e..1a2824c8 100755 --- a/man/septic_patients.Rd +++ b/man/septic_patients.Rd @@ -15,7 +15,7 @@ \item{\code{gender}}{gender of the patient} \item{\code{patient_id}}{ID of the patient, first 10 characters of an SHA hash containing irretrievable information} \item{\code{mo}}{ID of microorganism created with \code{\link{as.mo}}, see also \code{\link{microorganisms}}} - \item{\code{peni:rifa}}{40 different antibiotics with class \code{rsi} (see \code{\link{as.rsi}}); these column names occur in \code{\link{antibiotics}} data set and can be translated with \code{\link{abname}}} + \item{\code{peni:rifa}}{40 different antibiotics with class \code{rsi} (see \code{\link{as.rsi}}); these column names occur in \code{\link{antibiotics}} data set and can be translated with \code{\link{ab_name}}} }} \usage{ septic_patients diff --git a/pkgdown/extra.js b/pkgdown/extra.js index 63f504a9..d2ce07dc 100644 --- a/pkgdown/extra.js +++ b/pkgdown/extra.js @@ -31,10 +31,9 @@ $('head').append('(function(t,e,s,o){var n,a,c;t.SMCX=t.SMCX||[],e.getElementById(o)||(n=e.getElementsByTagName(s),a=n[n.length-1],c=e.createElement(s),c.type="text/javascript",c.async=!0,c.id=o,c.src=["https:"===location.protocol?"https://":"http://","widget.surveymonkey.com/collect/website/js/tRaiETqnLgj758hTBazgd_2BrwaGaWbg59AiLjNGdPaaJiBHKqgXKIw46VauwBvZ67.js"].join(""),a.parentNode.insertBefore(c,a))})(window,document,"script","smcx-sdk");'); - + // $('body').append(''); // add link to survey at home sidebar - $('.template-home #sidebar .list-unstyled:first').append('
  • Please fill in our survey at
    https://www.surveymonkey.com/r/AMR_for_R
  • '); + // $('.template-home #sidebar .list-unstyled:first').append('
  • Please fill in our survey at
    https://www.surveymonkey.com/r/AMR_for_R
  • '); // remove version label from header diff --git a/tests/testthat/test-ab.R b/tests/testthat/test-ab.R index d028e393..4b6de2c1 100755 --- a/tests/testthat/test-ab.R +++ b/tests/testthat/test-ab.R @@ -48,14 +48,6 @@ test_that("as.ab works", { expect_identical(class(pull(antibiotics, ab)), "ab") - # first 5 chars of official name - expect_equal(as.character(as.atc(c("nitro", "cipro"))), - c("J01XE01", "J01MA02")) - - # EARS-Net - expect_equal(as.character(as.atc("AMX")), - "J01CA04") - expect_equal(as.character(as.ab("Phloxapen")), "FLC") diff --git a/tests/testthat/test-atc.R b/tests/testthat/test-atc.R deleted file mode 100755 index c8eee86a..00000000 --- a/tests/testthat/test-atc.R +++ /dev/null @@ -1,39 +0,0 @@ -# ==================================================================== # -# TITLE # -# Antimicrobial Resistance (AMR) Analysis # -# # -# SOURCE # -# https://gitlab.com/msberends/AMR # -# # -# LICENCE # -# (c) 2019 Berends MS (m.s.berends@umcg.nl), Luz CF (c.f.luz@umcg.nl) # -# # -# This R package is free software; you can freely use and distribute # -# it for both personal and commercial purposes under the terms of the # -# GNU General Public License version 2.0 (GNU GPL-2), as published by # -# the Free Software Foundation. # -# # -# This R package was created for academic research and was publicly # -# released in the hope that it will be useful, but it comes WITHOUT # -# ANY WARRANTY OR LIABILITY. # -# Visit our website for more info: https://msberends.gitlab.io/AMR. # -# ==================================================================== # - -context("ab.R") - -test_that("as.atc works", { - expect_identical(class(as.atc("amox")), "atc") - expect_true(is.atc(as.atc("amox"))) - expect_output(print(as.atc("amox"))) - expect_output(print(data.frame(a = as.atc("amox")))) - - expect_identical(class(pull(antibiotics, atc)), "atc") - - expect_warning(as.atc("Z00ZZ00")) # not yet availatcle in data set - expect_warning(as.atc("UNKNOWN")) - - expect_output(print(as.atc("amox"))) - - - -}) diff --git a/tests/testthat/test-deprecated.R b/tests/testthat/test-deprecated.R index c14a9fc4..78aa3654 100644 --- a/tests/testthat/test-deprecated.R +++ b/tests/testthat/test-deprecated.R @@ -23,18 +23,16 @@ context("deprecated.R") test_that("deprecated functions work", { - expect_error(suppressWarnings(ratio("A"))) - expect_error(suppressWarnings(ratio(1, ratio = "abc"))) - expect_error(suppressWarnings(ratio(c(1, 2), ratio = c(1, 2, 3)))) - expect_warning(ratio(c(772, 1611, 737), ratio = "1:2:1")) - expect_identical(suppressWarnings(ratio(c(772, 1611, 737), ratio = "1:2:1")), c(780, 1560, 780)) - expect_identical(suppressWarnings(ratio(c(1752, 1895), ratio = c(1, 1))), c(1823.5, 1823.5)) + # first 5 chars of official name + expect_equal(suppressWarnings(as.character(as.atc(c("nitro", "cipro")))), + c("J01XE01", "J01MA02")) - expect_warning(atc_property("amox")) - expect_warning(atc_official("amox")) - expect_warning(ab_official("amox")) - expect_warning(atc_name("amox")) - expect_warning(atc_trivial_nl("amox")) - expect_warning(atc_tradenames("amox")) + # EARS-Net + expect_equal(suppressWarnings(as.character(as.atc("AMX"))), + "J01CA04") + expect_equal(suppressWarnings(guess_ab_col(data.frame(AMP_ND10 = "R", + AMC_ED20 = "S"), + as.atc("augmentin"))), + "AMC_ED20") }) diff --git a/tests/testthat/test-ggplot_rsi.R b/tests/testthat/test-ggplot_rsi.R index ce5a8a9e..5ba24817 100644 --- a/tests/testthat/test-ggplot_rsi.R +++ b/tests/testthat/test-ggplot_rsi.R @@ -36,32 +36,31 @@ test_that("ggplot_rsi works", { summarise_all(portion_IR) %>% as.double() ) + print(septic_patients %>% select(AMC, CIP) %>% ggplot_rsi(x = "interpretation", facet = "antibiotic")) + print(septic_patients %>% select(AMC, CIP) %>% ggplot_rsi(x = "antibiotic", facet = "interpretation")) + expect_equal( - (septic_patients %>% select(AMC, CIP) %>% ggplot_rsi(x = "Interpretation", facet = "Antibiotic"))$data %>% + (septic_patients %>% select(AMC, CIP) %>% ggplot_rsi(x = "interpretation", facet = "antibiotic"))$data %>% summarise_all(portion_IR) %>% as.double(), septic_patients %>% select(AMC, CIP) %>% summarise_all(portion_IR) %>% as.double() ) expect_equal( - (septic_patients %>% select(AMC, CIP) %>% ggplot_rsi(x = "Antibiotic", facet = "Interpretation"))$data %>% + (septic_patients %>% select(AMC, CIP) %>% ggplot_rsi(x = "antibiotic", facet = "interpretation"))$data %>% summarise_all(portion_IR) %>% as.double(), septic_patients %>% select(AMC, CIP) %>% summarise_all(portion_IR) %>% as.double() ) expect_equal( - (septic_patients %>% select(AMC, CIP) %>% ggplot_rsi(x = "Antibiotic", - facet = "Interpretation", - fun = count_df))$data %>% + (septic_patients %>% select(AMC, CIP) %>% ggplot_rsi(x = "antibiotic", + facet = "interpretation"))$data %>% summarise_all(count_IR) %>% as.double(), septic_patients %>% select(AMC, CIP) %>% summarise_all(count_IR) %>% as.double() ) - expect_error(ggplot_rsi(septic_patients, fun = "invalid")) - expect_error(geom_rsi(septic_patients, fun = "invalid")) - # support for scale_type ab and mo expect_equal(class((data.frame(mo = as.mo(c("e. coli", "s aureus")), n = c(40, 100)) %>% diff --git a/tests/testthat/test-guess_ab_col.R b/tests/testthat/test-guess_ab_col.R index c74ff070..197de51b 100644 --- a/tests/testthat/test-guess_ab_col.R +++ b/tests/testthat/test-guess_ab_col.R @@ -40,6 +40,5 @@ test_that("guess_ab_col works", { "AMP_ND10") expect_equal(guess_ab_col(df, "J01CR02"), "AMC_ED20") - expect_equal(guess_ab_col(df, as.atc("augmentin")), - "AMC_ED20") + })