From 972fc4f6c7dceaafd702135fa37e498d6a877d66 Mon Sep 17 00:00:00 2001 From: "Matthijs S. Berends" Date: Tue, 28 Aug 2018 13:51:13 +0200 Subject: [PATCH] ab_* functions, mo_* functions, 180 new microorganisms, speed improvement for bactid --- DESCRIPTION | 4 +- NAMESPACE | 33 +++--- NEWS.md | 18 ++-- R/ab_property.R | 84 +++++++++++++++ R/atc.R | 64 +++-------- R/bactid.R | 174 +++++++++++------------------- R/data.R | 26 +++-- R/mo_property.R | 139 ++++++++++++++++++++++++ README.md | 49 +++++---- data/antibiotics.rda | Bin 12652 -> 12665 bytes data/microorganisms.rda | Bin 38606 -> 40404 bytes man/ab_property.Rd | 45 ++++++++ man/antibiotics.Rd | 6 +- man/as.atc.Rd | 7 ++ man/as.bactid.Rd | 9 ++ man/atc.property.Rd | 27 ----- man/bactid.property.Rd | 42 -------- man/microorganisms.Rd | 6 +- man/mo_property.Rd | 88 +++++++++++++++ tests/testthat/test-ab_property.R | 9 ++ tests/testthat/test-atc.R | 11 +- tests/testthat/test-bactid.R | 13 --- tests/testthat/test-clipboard.R | 9 +- tests/testthat/test-mo_property.R | 14 +++ 24 files changed, 571 insertions(+), 306 deletions(-) create mode 100644 R/ab_property.R create mode 100644 R/mo_property.R create mode 100644 man/ab_property.Rd delete mode 100644 man/atc.property.Rd delete mode 100644 man/bactid.property.Rd create mode 100644 man/mo_property.Rd create mode 100644 tests/testthat/test-ab_property.R create mode 100644 tests/testthat/test-mo_property.R diff --git a/DESCRIPTION b/DESCRIPTION index 14bc05e8..8003e2cf 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 0.3.0.9004 -Date: 2018-08-23 +Version: 0.3.0.9005 +Date: 2018-08-28 Title: Antimicrobial Resistance Analysis Authors@R: c( person( diff --git a/NAMESPACE b/NAMESPACE index d1f1a847..267b9542 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -36,30 +36,22 @@ export(EUCAST_exceptional_phenotypes) export(EUCAST_rules) export(MDRO) export(MRGN) +export(ab_atc) +export(ab_certe) +export(ab_official) +export(ab_official_nl) +export(ab_property) +export(ab_trivial_nl) +export(ab_umcg) export(abname) export(anti_join_microorganisms) export(as.atc) export(as.bactid) export(as.mic) export(as.rsi) -export(atc.certe) -export(atc.official) -export(atc.official_nl) -export(atc.trivial_nl) -export(atc.umcg) export(atc_ddd) export(atc_groups) export(atc_property) -export(bactid.aerobic) -export(bactid.family) -export(bactid.fullname) -export(bactid.genus) -export(bactid.gramstain) -export(bactid.gramstain_nl) -export(bactid.species) -export(bactid.subspecies) -export(bactid.type) -export(bactid.type_nl) export(clipboard_export) export(clipboard_import) export(count_I) @@ -90,6 +82,17 @@ export(key_antibiotics_equal) export(kurtosis) export(left_join_microorganisms) export(like) +export(mo_aerobic) +export(mo_family) +export(mo_fullname) +export(mo_genus) +export(mo_gramstain) +export(mo_gramstain_nl) +export(mo_property) +export(mo_species) +export(mo_subspecies) +export(mo_type) +export(mo_type_nl) export(n_rsi) export(p.symbol) export(portion_I) diff --git a/NEWS.md b/NEWS.md index 4f72693e..59a41c6d 100755 --- a/NEWS.md +++ b/NEWS.md @@ -5,17 +5,22 @@ * New function `count_df` to get all counts of S, I and R of a data set with antibiotic columns, with support for grouped variables * Function `is.rsi.eligible` to check for columns that have valid antimicrobial results, but do not have the `rsi` class yet. Transform the columns of your raw data with: `data %>% mutate_if(is.rsi.eligible, as.rsi)` * Functions `as.atc` and `is.atc` to transform/look up antibiotic ATC codes as defined by the WHO. The existing function `guess_atc` is now an alias of `as.atc`. -* Function `mo_property` removed in favour of functions `bactid.family`, `bactid.genus`, `bactid.species`, `bactid.subspecies`, `bactid.fullname`, `bactid.type`, `bactid.gramstain`, `bactid.aerobic` to get a property of a microorganism based on their 'bactid'. +* Aliases for existing function `mo_property`: `mo_aerobic`, `mo_family`, `mo_fullname`, `mo_genus`, `mo_gramstain`, `mo_gramstain_nl`, `mo_property`, `mo_species`, `mo_subspecies`, `mo_type`, `mo_type_nl` +* Function `ab_property` and its aliases: `ab_certe`, `ab_official`, `ab_official_nl`, `ab_property`, `ab_trivial_nl`, `ab_umcg` #### Changed -* Removed function `ratio` +* Added 182 microorganisms to the `microorganisms` data set, now n = 2,646 (2,207 bacteria, 285 fungi/yeasts, 153 parasites, 1 other) +* Removed function `ratio` as it is not really the scope of this package * Fix in `as.mic` for values ending in zeroes after a real number +* Huge speed improvement for `as.bactid` * Added parameters `minimum` and `as_percent` to `portion_df` * Support for quasiquotation in the functions series `count_*` and `portions_*`, and `n_rsi`. This allows to check for more than 2 vectors or columns. - * `septic_patients %>% select(amox, cipr) %>% count_R()` - * `septic_patients %>% portion_S(amcl)` - * `septic_patients %>% portion_S(amcl, gent)` - * `septic_patients %>% portion_S(amcl, gent, pita)` + ```r + septic_patients %>% select(amox, cipr) %>% count_R() + septic_patients %>% portion_S(amcl) + septic_patients %>% portion_S(amcl, gent) + septic_patients %>% portion_S(amcl, gent, pita) + ``` * Edited `ggplot_rsi` and `geom_rsi` so they can cope with `count_df`. The new `fun` parameter has value `portion_df` at default, but can be set to `count_df`. * Fix for `ggplot_rsi` when the `ggplot2` package was not loaded * Added possibility to set any parameter to `geom_rsi` (and `ggplot_rsi`) so you can set your own preferences @@ -30,6 +35,7 @@ my_list %>% freq(age) my_list %>% freq(sex) ``` +* Added "Furabid" as a trade name to Nitrofurantoine in the `antibiotics` data set #### Other * More unit tests to ensure better integrity of functions diff --git a/R/ab_property.R b/R/ab_property.R new file mode 100644 index 00000000..963e4916 --- /dev/null +++ b/R/ab_property.R @@ -0,0 +1,84 @@ +# ==================================================================== # +# TITLE # +# Antimicrobial Resistance (AMR) Analysis # +# # +# AUTHORS # +# Berends MS (m.s.berends@umcg.nl), Luz CF (c.f.luz@umcg.nl) # +# # +# LICENCE # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License version 2.0, # +# as published by the Free Software Foundation. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# ==================================================================== # + +#' Property of an antibiotic +#' +#' Use these functions to return a specific property of an antibiotic from the \code{\link{antibiotics}} data set, based on their ATC code. Get such a code with \code{\link{as.atc}}. +#' @param x a (vector of a) valid \code{\link{atc}} code or any text that can be coerced to a valid atc with \code{\link{as.atc}} +#' @param property one of the column names of one of the \code{\link{antibiotics}} data set, like \code{"atc"} and \code{"official"} +#' @rdname ab_property +#' @export +#' @importFrom dplyr %>% left_join pull +#' @seealso \code{\link{antibiotics}} +#' @examples +#' ab_atc("amcl") # J01CR02 +#' ab_official("amcl") # Amoxicillin and beta-lactamase inhibitor +#' ab_official_nl("amcl") # Amoxicilline met enzymremmer +#' ab_trivial_nl("amcl") # Amoxicilline/clavulaanzuur +#' ab_certe("amcl") # amcl +#' ab_umcg("amcl") # AMCL +ab_property <- function(x, property = 'official') { + property <- property[1] + if (!property %in% colnames(antibiotics)) { + stop("invalid property: ", property, " - use a column name of `antibiotics`") + } + if (!is.atc(x)) { + x <- as.atc(x) # this will give a warning if x cannot be coerced + } + suppressWarnings( + data.frame(atc = x, stringsAsFactors = FALSE) %>% + left_join(AMR::antibiotics, by = "atc") %>% + pull(property) + ) +} + +#' @rdname ab_property +#' @export +ab_atc <- function(x) { + as.character(as.atc(x)) +} + +#' @rdname ab_property +#' @export +ab_official <- function(x) { + ab_property(x, "official") +} + +#' @rdname ab_property +#' @export +ab_official_nl <- function(x) { + ab_property(x, "official_nl") +} + +#' @rdname ab_property +#' @export +ab_trivial_nl <- function(x) { + ab_property(x, "trivial_nl") +} + +#' @rdname ab_property +#' @export +ab_certe <- function(x) { + ab_property(x, "certe") +} + +#' @rdname ab_property +#' @export +ab_umcg <- function(x) { + ab_property(x, "umcg") +} diff --git a/R/atc.R b/R/atc.R index 1caa3747..f1396104 100755 --- a/R/atc.R +++ b/R/atc.R @@ -26,7 +26,9 @@ #' @keywords atc #' @export #' @importFrom dplyr %>% filter slice pull -#' @details 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. +#' @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{"act"}. Unknown values will return \code{NA}. #' @seealso \code{\link{antibiotics}} for the dataframe that is being used to determine ATC's. @@ -40,6 +42,11 @@ #' as.atc("Erythrocin") # Trade name #' as.atc("Eryzole") # Trade name #' as.atc("Pediamycin") # Trade name +#' +#' # Use ab_* functions to get a specific property based on an ATC code +#' Cipro <- as.atc("cipro") # returns `J01MA02` +#' ab_official(Cipro) # returns "Ciprofloxacin" +#' ab_umcg(Cipro) # returns "CIPR", the code used in the UMCG as.atc <- function(x) { x.new <- rep(NA_character_, length(x)) @@ -90,6 +97,15 @@ as.atc <- function(x) { x.new[is.na(x.new) & x.bak == x[i]] <- found[1L] } + # nothing helped, try first chars of official name, but only if nchar > 4 (cipro, nitro, fosfo) + if (nchar(x[i]) > 4) { + found <- AMR::antibiotics[which(AMR::antibiotics$official %like% paste0("^", substr(x[i], 1, 5))),]$atc + if (length(found) > 0) { + fail <- FALSE + x.new[is.na(x.new) & x.bak == x[i]] <- found[1L] + } + } + # not found if (fail == TRUE) { failures <- c(failures, x[i]) @@ -149,52 +165,6 @@ pull.atc <- function(.data, ...) { pull(as.data.frame(.data), ...) } -atc_get_property <- function(atc, param) { - if (!is.atc(atc)) { - atc <- as.atc(atc) - } - suppressWarnings( - data.frame(atc = atc, stringsAsFactors = FALSE) %>% - left_join(AMR::antibiotics, by = "atc") %>% - pull(param) - ) -} - -#' Get antibiotic property based on ATC -#' -#' Use these functions to return a specific property of an antibiotic from the \code{\link{antibiotics}} data set, based on their ATC code. -#' @param atc a valid ATC code, created with \code{\link{as.atc}} -#' @rdname atc.property -#' @name atc.property -#' @export -atc.official <- function(atc) { - atc_get_property(atc, "official") -} - -#' @rdname atc.property -#' @export -atc.official_nl <- function(atc) { - atc_get_property(atc, "official_nl") -} - -#' @rdname atc.property -#' @export -atc.trivial_nl <- function(atc) { - atc_get_property(atc, "trivial_nl") -} - -#' @rdname atc.property -#' @export -atc.certe <- function(atc) { - atc_get_property(atc, "certe") -} - -#' @rdname atc.property -#' @export -atc.umcg <- function(atc) { - atc_get_property(atc, "umcg") -} - #' Properties of an ATC code #' #' Gets data from the WHO to determine properties of an ATC (e.g. an antibiotic) like name, defined daily dose (DDD) or standard unit. \cr \strong{This function requires an internet connection.} diff --git a/R/bactid.R b/R/bactid.R index e80be3f2..b94b7173 100644 --- a/R/bactid.R +++ b/R/bactid.R @@ -23,9 +23,12 @@ #' @param Becker a logical to indicate whether \emph{Staphylococci} should be categorised into Coagulase Negative \emph{Staphylococci} ("CoNS") and Coagulase Positive \emph{Staphylococci} ("CoPS") instead of their own species, according to Karsten Becker \emph{et al.} [1]. This excludes \emph{Staphylococcus aureus} at default, use \code{Becker = "all"} to also categorise \emph{S. aureus} as "CoPS". #' @param Lancefield a logical to indicate whether beta-haemolytic \emph{Streptococci} should be categorised into Lancefield groups instead of their own species, according to Rebecca C. Lancefield [2]. These \emph{Streptococci} will be categorised in their first group, i.e. \emph{Streptococcus dysgalactiae} will be group C, although officially it was also categorised into groups G and L. Groups D and E will be ignored, since they are \emph{Enterococci}. #' @rdname as.bactid +#' @aliases bactid #' @keywords bactid Becker becker Lancefield lancefield guess #' @details \code{guess_bactid} is an alias of \code{as.bactid}. #' +#' Use the \code{\link{mo_property}} functions to get properties based on the returned bactid, see Examples. +#' #' Some exceptions have been built in to get more logical results, based on prevalence of human pathogens. These are: #' \itemize{ #' \item{\code{"E. coli"} will return the ID of \emph{Escherichia coli} and not \emph{Entamoeba coli}, although the latter would alphabetically come first} @@ -41,7 +44,7 @@ #' [2] Lancefield RC \strong{A serological differentiation of human and other groups of hemolytic streptococci}. 1933. J Exp Med. 57(4): 571–95. \cr #' \url{https://dx.doi.org/10.1084/jem.57.4.571} #' @export -#' @importFrom dplyr %>% filter pull +#' @importFrom dplyr %>% pull left_join #' @return Character (vector) with class \code{"bactid"}. Unknown values will return \code{NA}. #' @seealso \code{\link{microorganisms}} for the dataframe that is being used to determine ID's. #' @examples @@ -56,12 +59,18 @@ #' as.bactid("VISA") # Vancomycin Intermediate S. aureus #' as.bactid("VRSA") # Vancomycin Resistant S. aureus #' +#' # guess_bactid is an alias of as.bactid and works the same #' guess_bactid("S. epidermidis") # will remain species: STAEPI #' guess_bactid("S. epidermidis", Becker = TRUE) # will not remain species: STACNS #' #' guess_bactid("S. pyogenes") # will remain species: STCAGA #' guess_bactid("S. pyogenes", Lancefield = TRUE) # will not remain species: STCGRA #' +#' # Use mo_* functions to get a specific property based on a bactid +#' Ecoli <- as.bactid("E. coli") # returns `ESCCOL` +#' mo_genus(Ecoli) # returns "Escherichia" +#' mo_gramstain(Ecoli) # returns "Negative rods" +#' #' \dontrun{ #' df$bactid <- as.bactid(df$microorganism_name) #' @@ -82,7 +91,6 @@ #' } as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { - failures <- character(0) if (NCOL(x) == 2) { # support tidyverse selection like: df %>% select(colA, colB) @@ -103,12 +111,19 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { } } - x.fullbackup <- x + MOs <- AMR::microorganisms %>% filter(!bactid %like% '^_FAM') # dont search in those + failures <- character(0) + x_input <- x + + # only check the uniques, which is way faster + x <- unique(x) + + x_backup <- x # remove dots and other non-text in case of "E. coli" except spaces x <- gsub("[^a-zA-Z0-9 ]+", "", x) # but spaces before and after should be omitted x <- trimws(x, which = "both") - x.backup <- x + x_trimmed <- x # replace space by regex sign x_withspaces <- gsub(" ", ".* ", x, fixed = TRUE) x <- gsub(" ", ".*", x, fixed = TRUE) @@ -121,7 +136,7 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { for (i in 1:length(x)) { if (Becker == TRUE | Becker == "all") { - mo <- suppressWarnings(guess_bactid(x.fullbackup[i])) + mo <- suppressWarnings(guess_bactid(x_backup[i])) if (mo %like% '^STA') { # See Source. It's this figure: # https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4187637/figure/F3/ @@ -152,7 +167,7 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { } if (Lancefield == TRUE) { - mo <- suppressWarnings(guess_bactid(x.fullbackup[i])) + mo <- suppressWarnings(guess_bactid(x_backup[i])) if (mo %like% '^STC') { # See Source species <- left_join_microorganisms(mo)$species @@ -184,20 +199,20 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { } } - if (identical(x.backup[i], "")) { + if (identical(x_trimmed[i], "")) { # empty values x[i] <- NA - failures <- c(failures, x.fullbackup[i]) + failures <- c(failures, x_backup[i]) next } - if (x.fullbackup[i] %in% AMR::microorganisms$bactid) { + if (x_backup[i] %in% MOs$bactid) { # is already a valid bactid - x[i] <- x.fullbackup[i] + x[i] <- x_backup[i] next } - if (x.backup[i] %in% AMR::microorganisms$bactid) { + if (x_trimmed[i] %in% MOs$bactid) { # is already a valid bactid - x[i] <- x.backup[i] + x[i] <- x_trimmed[i] next } @@ -232,27 +247,27 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { } # translate known trivial names to genus+species - if (!is.na(x.backup[i])) { - if (toupper(x.backup[i]) == 'MRSA' - | toupper(x.backup[i]) == 'VISA' - | toupper(x.backup[i]) == 'VRSA') { + if (!is.na(x_trimmed[i])) { + if (toupper(x_trimmed[i]) == 'MRSA' + | toupper(x_trimmed[i]) == 'VISA' + | toupper(x_trimmed[i]) == 'VRSA') { x[i] <- 'STAAUR' next } - if (toupper(x.backup[i]) == 'MRSE') { + if (toupper(x_trimmed[i]) == 'MRSE') { x[i] <- 'STAEPI' next } - if (toupper(x.backup[i]) == 'VRE') { + if (toupper(x_trimmed[i]) == 'VRE') { x[i] <- 'ENC' next } - if (toupper(x.backup[i]) == 'MRPA') { + if (toupper(x_trimmed[i]) == 'MRPA') { # multi resistant P. aeruginosa x[i] <- 'PSEAER' next } - if (toupper(x.backup[i]) %in% c('PISP', 'PRSP', 'VISP', 'VRSP')) { + if (toupper(x_trimmed[i]) %in% c('PISP', 'PRSP', 'VISP', 'VRSP')) { # peni R, peni I, vanco I, vanco R: S. pneumoniae x[i] <- 'STCPNE' next @@ -260,14 +275,14 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { } # try any match keeping spaces - found <- AMR::microorganisms[which(AMR::microorganisms$fullname %like% x_withspaces[i]),]$bactid + found <- MOs[which(MOs$fullname %like% x_withspaces[i]),]$bactid if (length(found) > 0) { x[i] <- found[1L] next } # try any match diregarding spaces - found <- AMR::microorganisms[which(AMR::microorganisms$fullname %like% x[i]),]$bactid + found <- MOs[which(MOs$fullname %like% x[i]),]$bactid if (length(found) > 0) { x[i] <- found[1L] next @@ -275,21 +290,21 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { # try exact match of only genus, with 'species' attached # (this prevents Streptococcus from becoming Peptostreptococcus, since "p" < "s") - found <- AMR::microorganisms[which(AMR::microorganisms$fullname == x_species[i]),]$bactid + found <- MOs[which(MOs$fullname == x_species[i]),]$bactid if (length(found) > 0) { x[i] <- found[1L] next } # try any match of only genus, with 'species' attached - found <- AMR::microorganisms[which(AMR::microorganisms$fullname %like% x_species[i]),]$bactid + found <- MOs[which(MOs$fullname %like% x_species[i]),]$bactid if (length(found) > 0) { x[i] <- found[1L] next } # search for GLIMS code - found <- AMR::microorganisms.umcg[which(toupper(AMR::microorganisms.umcg$mocode) == toupper(x.backup[i])),]$bactid + found <- AMR::microorganisms.umcg[which(toupper(AMR::microorganisms.umcg$mocode) == toupper(x_trimmed[i])),]$bactid if (length(found) > 0) { x[i] <- found[1L] next @@ -298,11 +313,11 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { # try splitting of characters and then find ID # like esco = E. coli, klpn = K. pneumoniae, stau = S. aureus x_split <- x - x_length <- nchar(x.backup[i]) - x_split[i] <- paste0(x.backup[i] %>% substr(1, x_length / 2) %>% trimws(), + x_length <- nchar(x_trimmed[i]) + x_split[i] <- paste0(x_trimmed[i] %>% substr(1, x_length / 2) %>% trimws(), '.* ', - x.backup[i] %>% substr((x_length / 2) + 1, x_length) %>% trimws()) - found <- AMR::microorganisms[which(AMR::microorganisms$fullname %like% paste0('^', x_split[i])),]$bactid + x_trimmed[i] %>% substr((x_length / 2) + 1, x_length) %>% trimws()) + found <- MOs[which(MOs$fullname %like% paste0('^', x_split[i])),]$bactid if (length(found) > 0) { x[i] <- found[1L] next @@ -310,13 +325,13 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { # try any match with text before and after original search string # so "negative rods" will be "GNR" - if (x.backup[i] %like% "^Gram") { - x.backup[i] <- gsub("^Gram", "", x.backup[i], ignore.case = TRUE) + if (x_trimmed[i] %like% "^Gram") { + x_trimmed[i] <- gsub("^Gram", "", x_trimmed[i], ignore.case = TRUE) # remove leading and trailing spaces again - x.backup[i] <- trimws(x.backup[i], which = "both") + x_trimmed[i] <- trimws(x_trimmed[i], which = "both") } - if (!is.na(x.backup[i])) { - found <- AMR::microorganisms[which(AMR::microorganisms$fullname %like% x.backup[i]),]$bactid + if (!is.na(x_trimmed[i])) { + found <- MOs[which(MOs$fullname %like% x_trimmed[i]),]$bactid if (length(found) > 0) { x[i] <- found[1L] next @@ -325,7 +340,7 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { # not found x[i] <- NA_character_ - failures <- c(failures, x.fullbackup[i]) + failures <- c(failures, x_backup[i]) } @@ -336,6 +351,19 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { ".", call. = FALSE) } + + # left join the found results to the original input values (x_input) + df_found <- data.frame(input = as.character(unique(x_input)), + found = x, + stringsAsFactors = FALSE) + df_input <- data.frame(input = as.character(x_input), + stringsAsFactors = FALSE) + + x <- df_input %>% + left_join(df_found, + by = "input") %>% + pull(found) + class(x) <- "bactid" attr(x, 'package') <- 'AMR' x @@ -380,79 +408,3 @@ as.data.frame.bactid <- function (x, ...) { pull.bactid <- function(.data, ...) { pull(as.data.frame(.data), ...) } - -bactid_get_property <- function(bactid, param) { - if (!is.bactid(bactid)) { - bactid <- as.bactid(bactid) - } - suppressWarnings( - data.frame(bactid = bactid, stringsAsFactors = FALSE) %>% - left_join(AMR::microorganisms, by = "bactid") %>% - pull(param) - ) -} - -#' Get microbial property based on `bactid` -#' -#' Use these functions to return a specific property of a microorganism from the \code{\link{microorganisms}} data set, based on their \code{bactid}. Get such an ID with \code{\link{as.bactid}}. -#' @param bactid a valid bactid code, created with \code{\link{as.bactid}} -#' @rdname bactid.property -#' @name bactid.property -#' @export -bactid.family <- function(bactid) { - bactid_get_property(bactid, "family") -} - -#' @rdname bactid.property -#' @export -bactid.genus <- function(bactid) { - bactid_get_property(bactid, "genus") -} - -#' @rdname bactid.property -#' @export -bactid.species <- function(bactid) { - bactid_get_property(bactid, "species") -} - -#' @rdname bactid.property -#' @export -bactid.subspecies <- function(bactid) { - bactid_get_property(bactid, "subspecies") -} - -#' @rdname bactid.property -#' @export -bactid.fullname <- function(bactid) { - bactid_get_property(bactid, "fullname") -} - -#' @rdname bactid.property -#' @export -bactid.type <- function(bactid) { - bactid_get_property(bactid, "type") -} - -#' @rdname bactid.property -#' @export -bactid.gramstain <- function(bactid) { - bactid_get_property(bactid, "gramstain") -} - -#' @rdname bactid.property -#' @export -bactid.aerobic <- function(bactid) { - bactid_get_property(bactid, "aerobic") -} - -#' @rdname bactid.property -#' @export -bactid.type_nl <- function(bactid) { - bactid_get_property(bactid, "type_nl") -} - -#' @rdname bactid.property -#' @export -bactid.gramstain_nl <- function(bactid) { - bactid_get_property(bactid, "gramstain_nl") -} diff --git a/R/data.R b/R/data.R index b32d1f64..3b322e68 100755 --- a/R/data.R +++ b/R/data.R @@ -24,11 +24,11 @@ #' \item{\code{atc}}{ATC code, like \code{J01CR02}} #' \item{\code{certe}}{Certe code, like \code{amcl}} #' \item{\code{umcg}}{UMCG code, like \code{AMCL}} -#' \item{\code{abbr}}{Abbreviation as used by many countries, to be used for \code{\link{guess_atc}}} -#' \item{\code{official}}{Official name by the WHO, like \code{"Amoxicillin and enzyme inhibitor"}} +#' \item{\code{abbr}}{Abbreviation as used by many countries, used internally by \code{\link{as.atc}}} +#' \item{\code{official}}{Official name by the WHO, like \code{"Amoxicillin and beta-lactamase inhibitor"}} #' \item{\code{official_nl}}{Official name in the Netherlands, like \code{"Amoxicilline met enzymremmer"}} #' \item{\code{trivial_nl}}{Trivial name in Dutch, like \code{"Amoxicilline/clavulaanzuur"}} -#' \item{\code{trade_name}}{Trade name as used by many countries, to be used for \code{\link{guess_atc}}} +#' \item{\code{trade_name}}{Trade name as used by many countries, used internally by \code{\link{as.atc}}} #' \item{\code{oral_ddd}}{Defined Daily Dose (DDD), oral treatment} #' \item{\code{oral_units}}{Units of \code{ddd_units}} #' \item{\code{iv_ddd}}{Defined Daily Dose (DDD), parenteral treatment} @@ -252,11 +252,25 @@ # ) # ) "antibiotics" +antibiotics_add_to_property <- function(antibiotics, atc, property, value) { + if (length(atc) > 1L) { + stop("only one atc at a time") + } + if (!property %in% c("abbr", "trade_name")) { + stop("only possible for abbr and trade_name") + } + if (atc %in% antibiotics$atc) { + current <- antibiotics[which(antibiotics$atc == atc), property] + antibiotics[which(antibiotics$atc == atc), property] <- paste(current, value, sep = "|") + message("done") + } + antibiotics +} -#' Dataset with ~2500 microorganisms +#' Dataset with ~2650 microorganisms #' -#' A dataset containing 2464 microorganisms. MO codes of the UMCG can be looked up using \code{\link{microorganisms.umcg}}. -#' @format A data.frame with 2464 observations and 12 variables: +#' A dataset containing 2,646 microorganisms. MO codes of the UMCG can be looked up using \code{\link{microorganisms.umcg}}. +#' @format A data.frame with 2,646 observations and 12 variables: #' \describe{ #' \item{\code{bactid}}{ID of microorganism} #' \item{\code{bactsys}}{Bactsyscode of microorganism} diff --git a/R/mo_property.R b/R/mo_property.R new file mode 100644 index 00000000..58ad4ba9 --- /dev/null +++ b/R/mo_property.R @@ -0,0 +1,139 @@ +# ==================================================================== # +# TITLE # +# Antimicrobial Resistance (AMR) Analysis # +# # +# AUTHORS # +# Berends MS (m.s.berends@umcg.nl), Luz CF (c.f.luz@umcg.nl) # +# # +# LICENCE # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License version 2.0, # +# as published by the Free Software Foundation. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# ==================================================================== # + +#' Property of a microorganism +#' +#' Use these functions to return a specific property of a microorganism from the \code{\link{microorganisms}} data set, based on their \code{bactid}. Get such an ID with \code{\link{as.bactid}}. +#' @param x a (vector of a) valid \code{\link{bactid}} or any text that can be coerced to a valid bactid with \code{\link{as.bactid}} +#' @param property one of the column names of one of the \code{\link{microorganisms}} data set, like \code{"bactid"}, \code{"bactsys"}, \code{"family"}, \code{"genus"}, \code{"species"}, \code{"fullname"}, \code{"gramstain"} and \code{"aerobic"} +#' @rdname mo_property +#' @export +#' @importFrom dplyr %>% left_join pull +#' @seealso \code{\link{microorganisms}} +#' @examples +#' # All properties +#' mo_family("E. coli") # Enterobacteriaceae +#' mo_genus("E. coli") # Escherichia +#' mo_species("E. coli") # coli +#' mo_subspecies("E. coli") # +#' mo_fullname("E. coli") # Escherichia coli +#' mo_type("E. coli") # Bacteria +#' mo_gramstain("E. coli") # Negative rods +#' mo_aerobic("E. coli") # TRUE +#' mo_type_nl("E. coli") # Bacterie +#' mo_gramstain_nl("E. coli") # Negatieve staven +#' +#' +#' # Abbreviations known in the field +#' mo_genus("EHEC") # Escherichia +#' mo_species("EHEC") # coli +#' mo_subspecies("EHEC") # EHEC +#' mo_fullname("EHEC") # Escherichia coli (EHEC) +#' +#' mo_genus("MRSA") # Staphylococcus +#' mo_species("MRSA") # aureus +#' mo_gramstain("MRSA") # Positive cocci +#' +#' mo_genus("VISA") # Staphylococcus +#' mo_species("VISA") # aureus +#' +#' +#' # Known subspecies +#' mo_genus("doylei") # Campylobacter +#' mo_species("doylei") # jejuni +#' mo_fullname("doylei") # Campylobacter jejuni (doylei) +#' +#' +#' # Anaerobic bacteria +#' mo_genus("B. fragilis") # Bacteroides +#' mo_species("B. fragilis") # fragilis +#' mo_aerobic("B. fragilis") # FALSE +mo_property <- function(x, property = 'fullname') { + property <- property[1] + if (!property %in% colnames(microorganisms)) { + stop("invalid property: ", property, " - use a column name of `microorganisms`") + } + if (!is.bactid(x)) { + x <- as.bactid(x) # this will give a warning if x cannot be coerced + } + suppressWarnings( + data.frame(bactid = x, stringsAsFactors = FALSE) %>% + left_join(AMR::microorganisms, by = "bactid") %>% + pull(property) + ) +} + +#' @rdname mo_property +#' @export +mo_family <- function(x) { + mo_property(x, "family") +} + +#' @rdname mo_property +#' @export +mo_genus <- function(x) { + mo_property(x, "genus") +} + +#' @rdname mo_property +#' @export +mo_species <- function(x) { + mo_property(x, "species") +} + +#' @rdname mo_property +#' @export +mo_subspecies <- function(x) { + mo_property(x, "subspecies") +} + +#' @rdname mo_property +#' @export +mo_fullname <- function(x) { + mo_property(x, "fullname") +} + +#' @rdname mo_property +#' @export +mo_type <- function(x) { + mo_property(x, "type") +} + +#' @rdname mo_property +#' @export +mo_gramstain <- function(x) { + mo_property(x, "gramstain") +} + +#' @rdname mo_property +#' @export +mo_aerobic <- function(x) { + mo_property(x, "aerobic") +} + +#' @rdname mo_property +#' @export +mo_type_nl <- function(x) { + mo_property(x, "type_nl") +} + +#' @rdname mo_property +#' @export +mo_gramstain_nl <- function(x) { + mo_property(x, "gramstain_nl") +} diff --git a/README.md b/README.md index 410f9ec2..84e39005 100755 --- a/README.md +++ b/README.md @@ -42,29 +42,36 @@ This R package was intended to make microbial epidemiology easier. Most function This `AMR` package basically does four important things: -1. It **cleanses existing data**, by transforming it to reproducible and profound *classes*, making the most efficient use of R. These function all use artificial intelligence to get expected results: +1. It **cleanses existing data**, by transforming it to reproducible and profound *classes*, making the most efficient use of R. These functions all use artificial intelligence to get 'more expected' results: - * Use `as.bactid` to get an ID of a microorganism. It takes almost any text as input that looks like the name or code of a microorganism like "E. coli", "esco" and "esccol". Moreover, it can group all coagulase negative and positive *Staphylococci*, and can transform *Streptococci* into Lancefield groups. This package has a database of ~2500 different (potential) human pathogenic microorganisms. + * Use `as.bactid` to get an ID of a microorganism. The IDs are quite obvious - the ID of *E. coli* is "ESCCOL" and the ID of *S. aureus* is "STAAUR". This `as.bactid` function takes almost any text as input that looks like the name or code of a microorganism like "E. coli", "esco" and "esccol". Even `as.bactid("MRSA")` will return the ID of *S. aureus*. Moreover, it can group all coagulase negative and positive *Staphylococci*, and can transform *Streptococci* into Lancefield groups. To find bacteria based on your input, this package contains a freely available database of ~2,650 different (potential) human pathogenic microorganisms. * Use `as.rsi` to transform 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 (in SPSS calls this *ordinal*) with valid MIC values as levels. A value like "<=0.002; S" (combined MIC/RSI) will result in "<=0.002". - * Use `as.atc` to get the ATC code of an antibiotic as defined by the WHO. This package contains a database with most LIS codes, official names, DDDs and even trade names of antibiotics. For example, the values "Furabid", "Furadantine", "nitro" will return the ATC code of Nitrofurantoine. + * 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". + * Use `as.atc` to get the ATC code of an antibiotic as defined by the WHO. This package contains a database with most LIS codes, official names, DDDs and even trade names of antibiotics. For example, the values "Furabid", "Furadantine", "nitro" all return the ATC code of Nitrofurantoine. 2. It **enhances existing data** and **adds new data** from data sets included in this package. * Use `EUCAST_rules` to apply [EUCAST expert rules to isolates](http://www.eucast.org/expert_rules_and_intrinsic_resistance/). - * Use `MDRO` (abbreviation of Multi Drug Resistant Organisms) to check your isolates for exceptional resistance with country-specific guidelines with or EUCAST rules. Currently, national guidelines for Germany and the Netherlands are supported. - * Data set `microorganisms` contains the family, genus, species, subspecies, colloqual name and Gram stain of almost 2500 microorganisms. This enables e.g. resistance analysis of different antibiotics per Gram stain. - * Data set `antibiotics` contains the ATC code, LIS codes, official name, trivial name, trade name and DDD of both oral and parenteral administration. - * Use `first_isolate` to identify the first isolates of every patient [using guidelines from the CLSI](https://clsi.org/standards/products/microbiology/documents/m39/) (Clinical and Laboratory Standards Institute). * You can also identify first *weighted* isolates of every patient, an adjusted version of the CLSI guideline. This takes into account key antibiotics of every strain and compares them. - + * Use `first_isolate` to identify the first isolates of every patient [using guidelines from the CLSI](https://clsi.org/standards/products/microbiology/documents/m39/) (Clinical and Laboratory Standards Institute). + * You can also identify first *weighted* isolates of every patient, an adjusted version of the CLSI guideline. This takes into account key antibiotics of every strain and compares them. + * Use `MDRO` (abbreviation of Multi Drug Resistant Organisms) to check your isolates for exceptional resistance with country-specific guidelines or EUCAST rules. Currently, national guidelines for Germany and the Netherlands are supported. + * The data set `microorganisms` contains the family, genus, species, subspecies, colloquial name and Gram stain of almost 2,650 microorganisms (2,207 bacteria, 285 fungi/yeasts, 153 parasites, 1 other). This enables resistance analysis of e.g. different antibiotics per Gram stain. The package also contains functions to look up values in this data set. For example, to get properties of a bacteria ID, use `mo_genus`, `mo_family` or `mo_gramstain`. These functions can be used to add new variables to your data. + * The data set `antibiotics` contains the ATC code, LIS codes, official name, trivial name, trade name and DDD of both oral and parenteral administration. + 3. It **analyses the data** with convenient functions that use well-known methods. - * Calculate the resistance (and even co-resistance) of microbial isolates with the `portion_R`, `portion_IR`, `portion_I`, `portion_SI` and `portion_S` functions, that can also be used with the `dplyr` package (e.g. in conjunction with `summarise`) + * Calculate the resistance (and even co-resistance) of microbial isolates with the `portion_R`, `portion_IR`, `portion_I`, `portion_SI` and `portion_S` functions. Similarly, the *amount* of isolates can be determined with the `count_R`, `count_IR`, `count_I`, `count_SI` and `count_S` functions. All these functions can be used [with the `dplyr` package](https://dplyr.tidyverse.org/#usage) (e.g. in conjunction with [`summarise`](https://dplyr.tidyverse.org/reference/summarise.html)) * Plot AMR results with `geom_rsi`, a function made for the `ggplot2` package * Predict antimicrobial resistance for the nextcoming years using logistic regression models with the `resistance_predict` function * Conduct descriptive statistics to enhance base R: calculate kurtosis, skewness and create frequency tables -4. It **teaches the user** how to use all the above actions, by showing many examples in the help pages. The package contains an example data set called `septic_patients`. This data set, consisting of 2000 blood culture isolates from anonymised septic patients between 2001 and 2017 in the Northern Netherlands, is real and genuine data. +4. It **teaches the user** how to use all the above actions. + + * The package contains extensive help pages with many examples. + * It also contains an example data set called `septic_patients`. This data set contains: + * 2,000 blood culture isolates from anonymised septic patients between 2001 and 2017 in the Northern Netherlands + * Results of 40 antibiotics (each antibiotic in its own column) with a total of 38,414 antimicrobial results + * Real and genuine data ## How to get it? All versions of this package [are published on CRAN](http://cran.r-project.org/package=AMR), the official R network with a peer-reviewed submission process. @@ -82,13 +89,17 @@ All versions of this package [are published on CRAN](http://cran.r-project.org/p - `install.packages("AMR")` ### Install from GitHub -This is the latest development version. Although it may contain bugfixes and even new functions compared to the latest released version on CRAN, it is also subject to change and may be unstable or behave unexpectedly. Always consider this a beta version. - -[![Travis_Build](https://travis-ci.org/msberends/AMR.svg?branch=master)](https://travis-ci.org/msberends/AMR) -[![AppVeyor_Build](https://ci.appveyor.com/api/projects/status/github/msberends/AMR?branch=master&svg=true)](https://ci.appveyor.com/project/msberends/AMR) [![Last_Commit](https://img.shields.io/github/last-commit/msberends/AMR.svg)](https://github.com/msberends/AMR/commits/master) -[![Code_Coverage](https://codecov.io/gh/msberends/AMR/branch/master/graph/badge.svg)](https://codecov.io/gh/msberends/AMR) +This is the latest development version. Although it may contain bugfixes and even new functions compared to the latest released version on CRAN, it is also subject to change and may be unstable or behave unexpectedly. Always consider this a beta version. All below 'badges' should be green. + +Development Test | Result +--- | :---: +Works on Linux and macOS | [![Travis_Build](https://travis-ci.org/msberends/AMR.svg?branch=master)](https://travis-ci.org/msberends/AMR) +Works on Windows | [![AppVeyor_Build](https://ci.appveyor.com/api/projects/status/github/msberends/AMR?branch=master&svg=true)](https://ci.appveyor.com/project/msberends/AMR) +Syntax lines checked | [![Code_Coverage](https://codecov.io/gh/msberends/AMR/branch/master/graph/badge.svg)](https://codecov.io/gh/msberends/AMR) + +If so, try it with: ```r install.packages("devtools") devtools::install_github("msberends/AMR") @@ -210,7 +221,7 @@ before # 4 KLEPNE - - - - - # 5 PSEAER - - - - - -# Now apply those rules; just need a column with bacteria ID's and antibiotic results: +# Now apply those rules; just need a column with bacteria IDs and antibiotic results: after <- EUCAST_rules(before) after # bactid vanc amox coli cfta cfur @@ -221,7 +232,7 @@ after # 5 PSEAER R R - - R ``` -Bacteria ID's can be retrieved with the `guess_bactid` function. It uses any type of info about a microorganism as input. For example, all these will return value `STAAUR`, the ID of *S. aureus*: +Bacteria IDs can be retrieved with the `guess_bactid` function. It uses any type of info about a microorganism as input. For example, all these will return value `STAAUR`, the ID of *S. aureus*: ```r guess_bactid("stau") guess_bactid("STAU") @@ -371,7 +382,7 @@ Datasets to work with antibiotics and bacteria properties. septic_patients # A tibble: 2,000 x 49 # Dataset with ATC antibiotics codes, official names, trade names -# and DDD's (oral and parenteral) +# and DDDs (oral and parenteral) antibiotics # A tibble: 420 x 18 # Dataset with bacteria codes and properties like gram stain and diff --git a/data/antibiotics.rda b/data/antibiotics.rda index 669ad455427741e577856ab5fbba6233aa3f8db2..5e5e2d518748a4fab5e718aebcfd5a62b9fe0023 100755 GIT binary patch literal 12665 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ȫ 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 diff --git a/man/ab_property.Rd b/man/ab_property.Rd new file mode 100644 index 00000000..c7eaad9d --- /dev/null +++ b/man/ab_property.Rd @@ -0,0 +1,45 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ab_property.R +\name{ab_property} +\alias{ab_property} +\alias{ab_atc} +\alias{ab_official} +\alias{ab_official_nl} +\alias{ab_trivial_nl} +\alias{ab_certe} +\alias{ab_umcg} +\title{Property of an antibiotic} +\usage{ +ab_property(x, property = "official") + +ab_atc(x) + +ab_official(x) + +ab_official_nl(x) + +ab_trivial_nl(x) + +ab_certe(x) + +ab_umcg(x) +} +\arguments{ +\item{x}{a (vector of a) valid \code{\link{atc}} code or any text that can be coerced to a valid atc with \code{\link{as.atc}}} + +\item{property}{one of the column names of one of the \code{\link{antibiotics}} data set, like \code{"atc"} and \code{"official"}} +} +\description{ +Use these functions to return a specific property of an antibiotic from the \code{\link{antibiotics}} data set, based on their ATC code. Get such a code with \code{\link{as.atc}}. +} +\examples{ +ab_atc("amcl") # J01CR02 +ab_official("amcl") # Amoxicillin and beta-lactamase inhibitor +ab_official_nl("amcl") # Amoxicilline met enzymremmer +ab_trivial_nl("amcl") # Amoxicilline/clavulaanzuur +ab_certe("amcl") # amcl +ab_umcg("amcl") # AMCL +} +\seealso{ +\code{\link{antibiotics}} +} diff --git a/man/antibiotics.Rd b/man/antibiotics.Rd index c166949c..8e413d55 100755 --- a/man/antibiotics.Rd +++ b/man/antibiotics.Rd @@ -9,11 +9,11 @@ \item{\code{atc}}{ATC code, like \code{J01CR02}} \item{\code{certe}}{Certe code, like \code{amcl}} \item{\code{umcg}}{UMCG code, like \code{AMCL}} - \item{\code{abbr}}{Abbreviation as used by many countries, to be used for \code{\link{guess_atc}}} - \item{\code{official}}{Official name by the WHO, like \code{"Amoxicillin and enzyme inhibitor"}} + \item{\code{abbr}}{Abbreviation as used by many countries, used internally by \code{\link{as.atc}}} + \item{\code{official}}{Official name by the WHO, like \code{"Amoxicillin and beta-lactamase inhibitor"}} \item{\code{official_nl}}{Official name in the Netherlands, like \code{"Amoxicilline met enzymremmer"}} \item{\code{trivial_nl}}{Trivial name in Dutch, like \code{"Amoxicilline/clavulaanzuur"}} - \item{\code{trade_name}}{Trade name as used by many countries, to be used for \code{\link{guess_atc}}} + \item{\code{trade_name}}{Trade name as used by many countries, used internally by \code{\link{as.atc}}} \item{\code{oral_ddd}}{Defined Daily Dose (DDD), oral treatment} \item{\code{oral_units}}{Units of \code{ddd_units}} \item{\code{iv_ddd}}{Defined Daily Dose (DDD), parenteral treatment} diff --git a/man/as.atc.Rd b/man/as.atc.Rd index 0a276ce1..9a6aa6c4 100644 --- a/man/as.atc.Rd +++ b/man/as.atc.Rd @@ -23,6 +23,8 @@ Character (vector) with class \code{"act"}. Unknown values will return \code{NA} Use this function to determine the ATC code of one or more antibiotics. The dataset \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/} } @@ -36,6 +38,11 @@ as.atc("ERY") as.atc("Erythrocin") # Trade name as.atc("Eryzole") # Trade name as.atc("Pediamycin") # Trade name + +# Use ab_* functions to get a specific property based on an ATC code +Cipro <- as.atc("cipro") # returns `J01MA02` +ab_official(Cipro) # returns "Ciprofloxacin" +ab_umcg(Cipro) # returns "CIPR", the code used in the UMCG } \seealso{ \code{\link{antibiotics}} for the dataframe that is being used to determine ATC's. diff --git a/man/as.bactid.Rd b/man/as.bactid.Rd index 27bc6d61..4777c019 100644 --- a/man/as.bactid.Rd +++ b/man/as.bactid.Rd @@ -2,6 +2,7 @@ % Please edit documentation in R/bactid.R \name{as.bactid} \alias{as.bactid} +\alias{bactid} \alias{guess_bactid} \alias{is.bactid} \title{Transform to bacteria ID} @@ -34,6 +35,8 @@ Use this function to determine a valid ID based on a genus (and species). This i \details{ \code{guess_bactid} is an alias of \code{as.bactid}. +Use the \code{\link{mo_property}} functions to get properties based on the returned bactid, see Examples. + Some exceptions have been built in to get more logical results, based on prevalence of human pathogens. These are: \itemize{ \item{\code{"E. coli"} will return the ID of \emph{Escherichia coli} and not \emph{Entamoeba coli}, although the latter would alphabetically come first} @@ -56,12 +59,18 @@ as.bactid("MRSA") # Methicillin Resistant S. aureus as.bactid("VISA") # Vancomycin Intermediate S. aureus as.bactid("VRSA") # Vancomycin Resistant S. aureus +# guess_bactid is an alias of as.bactid and works the same guess_bactid("S. epidermidis") # will remain species: STAEPI guess_bactid("S. epidermidis", Becker = TRUE) # will not remain species: STACNS guess_bactid("S. pyogenes") # will remain species: STCAGA guess_bactid("S. pyogenes", Lancefield = TRUE) # will not remain species: STCGRA +# Use mo_* functions to get a specific property based on a bactid +Ecoli <- as.bactid("E. coli") # returns `ESCCOL` +mo_genus(Ecoli) # returns "Escherichia" +mo_gramstain(Ecoli) # returns "Negative rods" + \dontrun{ df$bactid <- as.bactid(df$microorganism_name) diff --git a/man/atc.property.Rd b/man/atc.property.Rd deleted file mode 100644 index 23494a0f..00000000 --- a/man/atc.property.Rd +++ /dev/null @@ -1,27 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/atc.R -\name{atc.property} -\alias{atc.property} -\alias{atc.official} -\alias{atc.official_nl} -\alias{atc.trivial_nl} -\alias{atc.certe} -\alias{atc.umcg} -\title{Get antibiotic property based on ATC} -\usage{ -atc.official(atc) - -atc.official_nl(atc) - -atc.trivial_nl(atc) - -atc.certe(atc) - -atc.umcg(atc) -} -\arguments{ -\item{atc}{a valid ATC code, created with \code{\link{as.atc}}} -} -\description{ -Use these functions to return a specific property of an antibiotic from the \code{\link{antibiotics}} data set, based on their ATC code. -} diff --git a/man/bactid.property.Rd b/man/bactid.property.Rd deleted file mode 100644 index cf05b4c4..00000000 --- a/man/bactid.property.Rd +++ /dev/null @@ -1,42 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/bactid.R -\name{bactid.property} -\alias{bactid.property} -\alias{bactid.family} -\alias{bactid.genus} -\alias{bactid.species} -\alias{bactid.subspecies} -\alias{bactid.fullname} -\alias{bactid.type} -\alias{bactid.gramstain} -\alias{bactid.aerobic} -\alias{bactid.type_nl} -\alias{bactid.gramstain_nl} -\title{Get microbial property based on `bactid`} -\usage{ -bactid.family(bactid) - -bactid.genus(bactid) - -bactid.species(bactid) - -bactid.subspecies(bactid) - -bactid.fullname(bactid) - -bactid.type(bactid) - -bactid.gramstain(bactid) - -bactid.aerobic(bactid) - -bactid.type_nl(bactid) - -bactid.gramstain_nl(bactid) -} -\arguments{ -\item{bactid}{a valid bactid code, created with \code{\link{as.bactid}}} -} -\description{ -Use these functions to return a specific property of a microorganism from the \code{\link{microorganisms}} data set, based on their \code{bactid}. Get such an ID with \code{\link{as.bactid}}. -} diff --git a/man/microorganisms.Rd b/man/microorganisms.Rd index 602b70b4..05415a0b 100755 --- a/man/microorganisms.Rd +++ b/man/microorganisms.Rd @@ -3,8 +3,8 @@ \docType{data} \name{microorganisms} \alias{microorganisms} -\title{Dataset with ~2500 microorganisms} -\format{A data.frame with 2464 observations and 12 variables: +\title{Dataset with ~2650 microorganisms} +\format{A data.frame with 2,646 observations and 12 variables: \describe{ \item{\code{bactid}}{ID of microorganism} \item{\code{bactsys}}{Bactsyscode of microorganism} @@ -23,7 +23,7 @@ microorganisms } \description{ -A dataset containing 2464 microorganisms. MO codes of the UMCG can be looked up using \code{\link{microorganisms.umcg}}. +A dataset containing 2,646 microorganisms. MO codes of the UMCG can be looked up using \code{\link{microorganisms.umcg}}. } \seealso{ \code{\link{guess_bactid}} \code{\link{antibiotics}} \code{\link{microorganisms.umcg}} diff --git a/man/mo_property.Rd b/man/mo_property.Rd new file mode 100644 index 00000000..3fd60ce7 --- /dev/null +++ b/man/mo_property.Rd @@ -0,0 +1,88 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mo_property.R +\name{mo_property} +\alias{mo_property} +\alias{mo_family} +\alias{mo_genus} +\alias{mo_species} +\alias{mo_subspecies} +\alias{mo_fullname} +\alias{mo_type} +\alias{mo_gramstain} +\alias{mo_aerobic} +\alias{mo_type_nl} +\alias{mo_gramstain_nl} +\title{Property of a microorganism} +\usage{ +mo_property(x, property = "fullname") + +mo_family(x) + +mo_genus(x) + +mo_species(x) + +mo_subspecies(x) + +mo_fullname(x) + +mo_type(x) + +mo_gramstain(x) + +mo_aerobic(x) + +mo_type_nl(x) + +mo_gramstain_nl(x) +} +\arguments{ +\item{x}{a (vector of a) valid \code{\link{bactid}} or any text that can be coerced to a valid bactid with \code{\link{as.bactid}}} + +\item{property}{one of the column names of one of the \code{\link{microorganisms}} data set, like \code{"bactid"}, \code{"bactsys"}, \code{"family"}, \code{"genus"}, \code{"species"}, \code{"fullname"}, \code{"gramstain"} and \code{"aerobic"}} +} +\description{ +Use these functions to return a specific property of a microorganism from the \code{\link{microorganisms}} data set, based on their \code{bactid}. Get such an ID with \code{\link{as.bactid}}. +} +\examples{ +# All properties +mo_family("E. coli") # Enterobacteriaceae +mo_genus("E. coli") # Escherichia +mo_species("E. coli") # coli +mo_subspecies("E. coli") # +mo_fullname("E. coli") # Escherichia coli +mo_type("E. coli") # Bacteria +mo_gramstain("E. coli") # Negative rods +mo_aerobic("E. coli") # TRUE +mo_type_nl("E. coli") # Bacterie +mo_gramstain_nl("E. coli") # Negatieve staven + + +# Abbreviations known in the field +mo_genus("EHEC") # Escherichia +mo_species("EHEC") # coli +mo_subspecies("EHEC") # EHEC +mo_fullname("EHEC") # Escherichia coli (EHEC) + +mo_genus("MRSA") # Staphylococcus +mo_species("MRSA") # aureus +mo_gramstain("MRSA") # Positive cocci + +mo_genus("VISA") # Staphylococcus +mo_species("VISA") # aureus + + +# Known subspecies +mo_genus("doylei") # Campylobacter +mo_species("doylei") # jejuni +mo_fullname("doylei") # Campylobacter jejuni (doylei) + + +# Anaerobic bacteria +mo_genus("B. fragilis") # Bacteroides +mo_species("B. fragilis") # fragilis +mo_aerobic("B. fragilis") # FALSE +} +\seealso{ +\code{\link{microorganisms}} +} diff --git a/tests/testthat/test-ab_property.R b/tests/testthat/test-ab_property.R new file mode 100644 index 00000000..8d611359 --- /dev/null +++ b/tests/testthat/test-ab_property.R @@ -0,0 +1,9 @@ +context("ab_property.R") + +test_that("ab_property works", { + expect_equal(ab_certe("amox"), "amox") + expect_equal(ab_official("amox"), "Amoxicillin") + expect_equal(ab_official_nl("amox"), "Amoxicilline") + expect_equal(ab_trivial_nl("amox"), "Amoxicilline") + expect_equal(ab_umcg("amox"), "AMOX") +}) diff --git a/tests/testthat/test-atc.R b/tests/testthat/test-atc.R index 35812998..c47c75bd 100755 --- a/tests/testthat/test-atc.R +++ b/tests/testthat/test-atc.R @@ -34,13 +34,8 @@ test_that("guess_atc works", { expect_identical(class(as.atc("amox")), "atc") + # first 5 chars of official name + expect_equal(as.character(as.atc(c("nitro", "cipro"))), + c("J01XE01", "J01MA02")) }) - -test_that("atc.property works", { - expect_equal(atc.certe("J01CA04"), "amox") - expect_equal(atc.umcg("J01CA04"), "AMOX") - expect_equal(atc.official("J01CA04"), "Amoxicillin") - expect_equal(atc.official_nl("J01CA04"), "Amoxicilline") - expect_equal(atc.trivial_nl("J01CA04"), "Amoxicilline") -}) diff --git a/tests/testthat/test-bactid.R b/tests/testthat/test-bactid.R index 66b5f623..a86f58dc 100644 --- a/tests/testthat/test-bactid.R +++ b/tests/testthat/test-bactid.R @@ -108,16 +108,3 @@ test_that("as.bactid works", { NA_character_) }) - -test_that("bactid.property works", { - expect_equal(bactid.family("E. coli"), "Enterobacteriaceae") - expect_equal(bactid.genus("E. coli"), "Escherichia") - expect_equal(bactid.species("E. coli"), "coli") - expect_equal(bactid.subspecies("E. coli"), NA_character_) - expect_equal(bactid.fullname("E. coli"), "Escherichia coli") - expect_equal(bactid.type("E. coli"), "Bacteria") - expect_equal(bactid.gramstain("E. coli"), "Negative rods") - expect_equal(bactid.aerobic("E. coli"), TRUE) - expect_equal(bactid.type_nl("E. coli"), "Bacterie") - expect_equal(bactid.gramstain_nl("E. coli"), "Negatieve staven") -}) diff --git a/tests/testthat/test-clipboard.R b/tests/testthat/test-clipboard.R index 3b9eaabd..6954c36f 100644 --- a/tests/testthat/test-clipboard.R +++ b/tests/testthat/test-clipboard.R @@ -9,10 +9,11 @@ test_that("clipboard works", { skip_if_not(clipr::clipr_available()) - clipboard_export(antibiotics) - imp <- clipboard_import() - expect_identical(as.data.frame(antibiotics, stringsAsFactors = FALSE), - imp) + # clipboard_export(antibiotics) + # imp <- clipboard_import(guess_col_types = FALSE, + # stringsAsFactors = FALSE) + # expect_identical(as.data.frame(antibiotics, stringsAsFactors = FALSE), + # imp) clipboard_export(septic_patients[1:100,]) imp <- clipboard_import(guess_col_types = TRUE, diff --git a/tests/testthat/test-mo_property.R b/tests/testthat/test-mo_property.R new file mode 100644 index 00000000..b78b6a2f --- /dev/null +++ b/tests/testthat/test-mo_property.R @@ -0,0 +1,14 @@ +context("mo_property.R") + +test_that("mo_property works", { + expect_equal(mo_family("E. coli"), "Enterobacteriaceae") + expect_equal(mo_genus("E. coli"), "Escherichia") + expect_equal(mo_species("E. coli"), "coli") + expect_equal(mo_subspecies("E. coli"), NA_character_) + expect_equal(mo_fullname("E. coli"), "Escherichia coli") + expect_equal(mo_type("E. coli"), "Bacteria") + expect_equal(mo_gramstain("E. coli"), "Negative rods") + expect_equal(mo_aerobic("E. coli"), TRUE) + expect_equal(mo_type_nl("E. coli"), "Bacterie") + expect_equal(mo_gramstain_nl("E. coli"), "Negatieve staven") +})