From 5965d3c79440ea0ef282741a111ac8b714c6ee99 Mon Sep 17 00:00:00 2001 From: "Matthijs S. Berends" Date: Fri, 31 Aug 2018 13:36:19 +0200 Subject: [PATCH] replaced bactid by mo --- DESCRIPTION | 4 +- NAMESPACE | 10 ++ NEWS.md | 9 +- R/data.R | 24 +-- R/deprecated.R | 65 +++++++ R/eucast.R | 46 ++--- R/first_isolate.R | 30 ++-- R/freq.R | 4 +- R/ggplot_rsi.R | 8 +- R/join_microorganisms.R | 26 +-- R/key_antibiotics.R | 19 ++- R/mdro.R | 22 ++- R/{bactid.R => mo.R} | 134 +++++++++------ R/mo_property.R | 14 +- R/resistance_predict.R | 6 +- README.md | 34 ++-- data/microorganisms.rda | Bin 40404 -> 40431 bytes data/microorganisms.umcg.rda | Bin 6466 -> 6475 bytes data/septic_patients.rda | Bin 30732 -> 30756 bytes man/AMR-deprecated.Rd | 22 +++ man/EUCAST.Rd | 33 ++-- man/MDRO.Rd | 196 +++++++++++++++++++++- man/{as.bactid.Rd => as.mo.Rd} | 72 ++++---- man/first_isolate.Rd | 16 +- man/freq.Rd | 4 +- man/ggplot_rsi.Rd | 8 +- man/join.Rd | 14 +- man/key_antibiotics.Rd | 13 +- man/microorganisms.Rd | 4 +- man/microorganisms.umcg.Rd | 8 +- man/mo_property.Rd | 6 +- man/resistance_predict.Rd | 6 +- man/septic_patients.Rd | 8 +- tests/testthat/test-bactid.R | 118 ------------- tests/testthat/test-deprecated.R | 24 +++ tests/testthat/test-eucast.R | 16 +- tests/testthat/test-first_isolate.R | 26 +-- tests/testthat/test-freq.R | 8 +- tests/testthat/test-join_microorganisms.R | 6 +- tests/testthat/test-mo.R | 118 +++++++++++++ tests/testthat/test-portion.R | 16 +- 41 files changed, 786 insertions(+), 411 deletions(-) create mode 100644 R/deprecated.R rename R/{bactid.R => mo.R} (81%) create mode 100644 man/AMR-deprecated.Rd rename man/{as.bactid.Rd => as.mo.Rd} (69%) delete mode 100644 tests/testthat/test-bactid.R create mode 100644 tests/testthat/test-deprecated.R create mode 100644 tests/testthat/test-mo.R diff --git a/DESCRIPTION b/DESCRIPTION index 3c5f55ad..25a95240 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 0.3.0.9005 -Date: 2018-08-29 +Version: 0.3.0.9006 +Date: 2018-08-31 Title: Antimicrobial Resistance Analysis Authors@R: c( person( diff --git a/NAMESPACE b/NAMESPACE index 6f5d359c..bf01e726 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,6 +3,7 @@ S3method(as.data.frame,atc) S3method(as.data.frame,bactid) S3method(as.data.frame,frequency_tbl) +S3method(as.data.frame,mo) S3method(as.double,mic) S3method(as.integer,mic) S3method(as.numeric,mic) @@ -22,9 +23,11 @@ S3method(print,atc) S3method(print,bactid) S3method(print,frequency_tbl) S3method(print,mic) +S3method(print,mo) S3method(print,rsi) S3method(pull,atc) S3method(pull,bactid) +S3method(pull,mo) S3method(skewness,data.frame) S3method(skewness,default) S3method(skewness,matrix) @@ -49,6 +52,7 @@ export(anti_join_microorganisms) export(as.atc) export(as.bactid) export(as.mic) +export(as.mo) export(as.rsi) export(atc_ddd) export(atc_groups) @@ -71,11 +75,13 @@ export(geom_rsi) export(ggplot_rsi) export(guess_atc) export(guess_bactid) +export(guess_mo) export(inner_join_microorganisms) export(interpretive_reading) export(is.atc) export(is.bactid) export(is.mic) +export(is.mo) export(is.rsi) export(is.rsi.eligible) export(key_antibiotics) @@ -102,6 +108,7 @@ export(portion_R) export(portion_S) export(portion_SI) export(portion_df) +export(ratio) export(resistance_predict) export(right_join_microorganisms) export(rsi) @@ -115,6 +122,7 @@ export(top_freq) exportMethods(as.data.frame.atc) exportMethods(as.data.frame.bactid) exportMethods(as.data.frame.frequency_tbl) +exportMethods(as.data.frame.mo) exportMethods(as.double.mic) exportMethods(as.integer.mic) exportMethods(as.numeric.mic) @@ -135,9 +143,11 @@ exportMethods(print.atc) exportMethods(print.bactid) exportMethods(print.frequency_tbl) exportMethods(print.mic) +exportMethods(print.mo) exportMethods(print.rsi) exportMethods(pull.atc) exportMethods(pull.bactid) +exportMethods(pull.mo) exportMethods(skewness) exportMethods(skewness.data.frame) exportMethods(skewness.default) diff --git a/NEWS.md b/NEWS.md index 6acab483..f8ae0d5c 100755 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,11 @@ * Functions `count_R`, `count_IR`, `count_I`, `count_SI` and `count_S` to selectively count resistant or susceptible isolates * Extra function `count_df` (which works like `portion_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.mo` and `is.mo` as replacements for `as.bactid` and `is.bactid`. These last two functions are deprecated and will be removed in a future release. +* Renamed all previous references to `bactid` to `mo`, like: + * Column names inputs of `EUCAST_rules`, `first_isolate` and `key_antibiotics` + * Column names of datasets `microorganisms` and `septic_patients` + * All old syntaxes will still work with this version, but will throw warnings * 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`. * 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`, `ab_tradenames` @@ -21,9 +26,9 @@ ab_atc(c("Bactroban", "Amoxil", "Zithromax", "Floxapen")) # [1] "R01AX06" "J01CA04" "J01FA10" "J01CF05" ``` -* Removed function `ratio` as it is not really the scope of this package +* Function `ratio` is now deprecated and will be removed in a future release, as it is not really the scope of this package * Fix for `as.mic` for values ending in zeroes after a real number -* Huge speed improvement for `as.bactid` +* Huge speed improvement for `as.bactid` (now `as.mo`) * 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. ```r diff --git a/R/data.R b/R/data.R index 2193704b..8a480a0f 100755 --- a/R/data.R +++ b/R/data.R @@ -125,7 +125,7 @@ #' 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{mo}}{ID of microorganism} #' \item{\code{bactsys}}{Bactsyscode of microorganism} #' \item{\code{family}}{Family name of microorganism} #' \item{\code{genus}}{Genus name of microorganism, like \code{"Echerichia"}} @@ -140,27 +140,27 @@ #' } # source MOLIS (LIS of Certe) - \url{https://www.certe.nl} # new <- microorganisms %>% filter(genus == "Bacteroides") %>% .[1,] -# new[1, 'bactid'] <- "DIAPNU" +# new[1, 'mo'] <- "DIAPNU" # new[1, 'bactsys'] <- "DIAPNU" # new[1, 'family'] <- "Veillonellaceae" # new[1, 'genus'] <- "Dialister" # new[1, 'species'] <- "pneumosintes" # new[1, 'subspecies'] <- NA # new[1, 'fullname'] <- paste(new[1, 'genus'], new[1, 'species']) -# microorganisms <- microorganisms %>% bind_rows(new) %>% arrange(bactid) -#' @seealso \code{\link{guess_bactid}} \code{\link{antibiotics}} \code{\link{microorganisms.umcg}} +# microorganisms <- microorganisms %>% bind_rows(new) %>% arrange(mo) +#' @seealso \code{\link{guess_mo}} \code{\link{antibiotics}} \code{\link{microorganisms.umcg}} "microorganisms" #' Translation table for UMCG with ~1100 microorganisms #' -#' A dataset containing all bacteria codes of UMCG MMB. These codes can be joined to data with an ID from \code{\link{microorganisms}$bactid} (using \code{\link{left_join_microorganisms}}). GLIMS codes can also be translated to valid \code{bactid}'s with \code{\link{guess_bactid}}. +#' A dataset containing all bacteria codes of UMCG MMB. These codes can be joined to data with an ID from \code{\link{microorganisms}$mo} (using \code{\link{left_join_microorganisms}}). GLIMS codes can also be translated to valid \code{mo}'s with \code{\link{guess_mo}}. #' @format A data.frame with 1090 observations and 2 variables: #' \describe{ -#' \item{\code{mocode}}{Code of microorganism according to UMCG MMB} -#' \item{\code{bactid}}{Code of microorganism in \code{\link{microorganisms}}} +#' \item{\code{umcg}}{Code of microorganism according to UMCG MMB} +#' \item{\code{mo}}{Code of microorganism in \code{\link{microorganisms}}} #' } # source MOLIS (LIS of Certe) - \url{https://www.certe.nl} \cr \cr GLIMS (LIS of UMCG) - \url{https://www.umcg.nl} -#' @seealso \code{\link{guess_bactid}} \code{\link{microorganisms}} +#' @seealso \code{\link{guess_mo}} \code{\link{microorganisms}} "microorganisms.umcg" #' Dataset with 2000 blood culture isolates of septic patients @@ -176,7 +176,7 @@ #' \item{\code{age}}{age of the patient} #' \item{\code{sex}}{sex of the patient} #' \item{\code{patient_id}}{ID of the patient, first 10 characters of an SHA hash containing irretrievable information} -#' \item{\code{bactid}}{ID of microorganism, see \code{\link{microorganisms}}} +#' \item{\code{mo}}{ID of microorganism, see \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}}} #' } # source MOLIS (LIS of Certe) - \url{https://www.certe.nl} @@ -193,7 +193,7 @@ #' #' # Add first isolates to our dataset: #' my_data <- my_data %>% -#' mutate(first_isolates = first_isolate(my_data, "date", "patient_id", "bactid")) +#' mutate(first_isolates = first_isolate(my_data, "date", "patient_id", "mo")) #' #' # -------- # #' # ANALYSIS # @@ -203,7 +203,7 @@ #' # and numbers (n) of E. coli, divided by hospital: #' #' my_data %>% -#' filter(bactid == guess_bactid("E. coli"), +#' filter(mo == guess_mo("E. coli"), #' first_isolates == TRUE) %>% #' group_by(hospital_id) %>% #' summarise(n = n_rsi(amox), @@ -214,7 +214,7 @@ #' # percentages of E. coli, trend over the years: #' #' my_data %>% -#' filter(bactid == guess_bactid("E. coli"), +#' filter(mo == guess_mo("E. coli"), #' first_isolates == TRUE) %>% #' group_by(year = format(date, "%Y")) %>% #' summarise(n = n_rsi(amcl), diff --git a/R/deprecated.R b/R/deprecated.R new file mode 100644 index 00000000..ee0b250e --- /dev/null +++ b/R/deprecated.R @@ -0,0 +1,65 @@ +# ==================================================================== # +# 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. # +# ==================================================================== # + +#' Deprecated functions +#' +#' These functions are \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. +#' @export +#' @keywords internal +#' @name AMR-deprecated +#' @rdname AMR-deprecated +as.bactid <- function(...) { + .Deprecated("as.mo", package = "AMR") + as.mo(...) +} + +#' @rdname AMR-deprecated +#' @export +is.bactid <- function(...) { + .Deprecated(new = "is.mo", package = "AMR") + is.mo(...) +} + +#' @rdname AMR-deprecated +#' @export +guess_bactid <- function(...) { + .Deprecated(new = "guess_mo", package = "AMR") + guess_mo(...) +} + +#' @rdname AMR-deprecated +#' @export +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 %>% base::strsplit("[-,:]") %>% base::unlist() %>% base::as.double() + } else { + stop('Invalid `ratio`: ', ratio, '.') + } + } + if (length(x) != length(ratio)) { + stop('`x` and `ratio` must be of same size.') + } + base::sum(x, na.rm = TRUE) * (ratio / base::sum(ratio, na.rm = TRUE)) +} diff --git a/R/eucast.R b/R/eucast.R index d0aa7c9c..c23ca0fe 100755 --- a/R/eucast.R +++ b/R/eucast.R @@ -20,11 +20,12 @@ #' #' Apply expert rules (like intrinsic resistance), as defined by the European Committee on Antimicrobial Susceptibility Testing (EUCAST, \url{http://eucast.org}), see \emph{Source}. #' @param tbl table with antibiotic columns, like e.g. \code{amox} and \code{amcl} -#' @param col_bactid column name of the bacteria ID in \code{tbl} - values of this column should be present in \code{microorganisms$bactid}, see \code{\link{microorganisms}} +#' @param col_mo column name of the bacteria ID in \code{tbl} - values of this column should be present in \code{microorganisms$mo}, see \code{\link{microorganisms}} #' @param info print progress -#' @param amcl,amik,amox,ampi,azit,azlo,aztr,cefa,cfep,cfot,cfox,cfra,cfta,cftr,cfur,chlo,cipr,clar,clin,clox,coli,czol,dapt,doxy,erta,eryt,fosf,fusi,gent,imip,kana,levo,linc,line,mero,mezl,mino,moxi,nali,neom,neti,nitr,norf,novo,oflo,peni,pita,poly,pris,qida,rifa,roxi,siso,teic,tetr,tica,tige,tobr,trim,trsu,vanc column names of antibiotics. Use \code{NA} to skip a column, like \code{tica = NA}. Non-existing columns will anyway be skipped. See the Antibiotics section for an explanation of the abbreviations. +#' @param amcl,amik,amox,ampi,azit,azlo,aztr,cefa,cfep,cfot,cfox,cfra,cfta,cftr,cfur,chlo,cipr,clar,clin,clox,coli,czol,dapt,doxy,erta,eryt,fosf,fusi,gent,imip,kana,levo,linc,line,mero,mezl,mino,moxi,nali,neom,neti,nitr,norf,novo,oflo,peni,pita,poly,pris,qida,rifa,roxi,siso,teic,tetr,tica,tige,tobr,trim,trsu,vanc column name of an antibiotic. Use \code{NA} to skip a column, like \code{tica = NA}. Non-existing columns will anyway be skipped. See the Antibiotics section for an explanation of the abbreviations. +#' @param col_bactid Deprecated. Use \code{col_mo} instead. #' @param ... parameters that are passed on to \code{EUCAST_rules} -#' @section Abbrevations of antibiotics: +#' @section Antibiotics: #' Abbrevations of the column containing antibiotics: #' #' \strong{amcl}: amoxicillin and beta-lactamase inhibitor (\emph{J01CR02}), @@ -102,23 +103,23 @@ #' \url{http://www.eucast.org/fileadmin/src/media/PDFs/EUCAST_files/Expert_Rules/Expert_rules_intrinsic_exceptional_V3.1.pdf} #' @examples #' a <- EUCAST_rules(septic_patients) -#' a <- data.frame(bactid = c("STAAUR", # Staphylococcus aureus -#' "ENCFAE", # Enterococcus faecalis -#' "ESCCOL", # Escherichia coli -#' "KLEPNE", # Klebsiella pneumoniae -#' "PSEAER"), # Pseudomonas aeruginosa -#' vanc = "-", # Vancomycin -#' amox = "-", # Amoxicillin -#' coli = "-", # Colistin -#' cfta = "-", # Ceftazidime -#' cfur = "-", # Cefuroxime +#' a <- data.frame(mo = c("STAAUR", # Staphylococcus aureus +#' "ENCFAE", # Enterococcus faecalis +#' "ESCCOL", # Escherichia coli +#' "KLEPNE", # Klebsiella pneumoniae +#' "PSEAER"), # Pseudomonas aeruginosa +#' vanc = "-", # Vancomycin +#' amox = "-", # Amoxicillin +#' coli = "-", # Colistin +#' cfta = "-", # Ceftazidime +#' cfur = "-", # Cefuroxime #' stringsAsFactors = FALSE) #' a #' #' b <- EUCAST_rules(a) #' b EUCAST_rules <- function(tbl, - col_bactid = 'bactid', + col_mo = 'mo', info = TRUE, amcl = 'amcl', amik = 'amik', @@ -180,12 +181,17 @@ EUCAST_rules <- function(tbl, tobr = 'tobr', trim = 'trim', trsu = 'trsu', - vanc = 'vanc') { + vanc = 'vanc', + col_bactid = 'bactid') { EUCAST_VERSION <- "3.1" - if (!col_bactid %in% colnames(tbl)) { - stop('Column ', col_bactid, ' not found.', call. = FALSE) + if (col_bactid %in% colnames(tbl)) { + col_mo <- col_bactid + warning("Use of `col_bactid` is deprecated. Use `col_mo` instead.") + } + if (!col_mo %in% colnames(tbl)) { + stop('Column ', col_mo, ' not found.', call. = FALSE) } # check columns @@ -274,10 +280,10 @@ EUCAST_rules <- function(tbl, } # join to microorganisms data set - if (!tbl %>% pull(col_bactid) %>% is.bactid()) { - warning("Improve integrity of the `", col_bactid, "` column by transforming it with 'as.bactid'.") + if (!tbl %>% pull(col_mo) %>% is.mo()) { + warning("Improve integrity of the `", col_mo, "` column by transforming it with 'as.mo'.") } - tbl <- tbl %>% left_join_microorganisms(by = col_bactid, suffix = c("_tempmicroorganisms", "")) + tbl <- tbl %>% left_join_microorganisms(by = col_mo, suffix = c("_tempmicroorganisms", "")) # antibiotic classes aminoglycosides <- c(tobr, gent, kana, neom, neti, siso) diff --git a/R/first_isolate.R b/R/first_isolate.R index 268ad604..a1a65e9a 100755 --- a/R/first_isolate.R +++ b/R/first_isolate.R @@ -22,7 +22,7 @@ #' @param tbl a \code{data.frame} containing isolates. #' @param col_date column name of the result date (or date that is was received on the lab) #' @param col_patient_id column name of the unique IDs of the patients -#' @param col_bactid column name of the unique IDs of the microorganisms: \code{bactid}'s. If this column has another class than \code{"bactid"}, values will be coerced using \code{\link{as.bactid}}. +#' @param col_mo column name of the unique IDs of the microorganisms, see \code{\link{mo}}. If this column has another class than \code{"mo"}, values will be coerced using \code{\link{as.mo}}. #' @param col_testcode column name of the test codes. Use \code{col_testcode = NA} to \strong{not} exclude certain test codes (like test codes for screening). In that case \code{testcodes_exclude} will be ignored. Supports tidyverse-like quotation. #' @param col_specimen column name of the specimen type or group #' @param col_icu column name of the logicals (\code{TRUE}/\code{FALSE}) whether a ward or department is an Intensive Care Unit (ICU) @@ -36,8 +36,9 @@ #' @param ignore_I logical to determine whether antibiotic interpretations with \code{"I"} will be ignored when \code{type = "keyantibiotics"}, see Details #' @param points_threshold points until the comparison of key antibiotics will lead to inclusion of an isolate when \code{type = "points"}, see Details #' @param info print progress -#' @param col_genus (deprecated, use \code{col_bactid} instead) column name of the genus of the microorganisms -#' @param col_species (deprecated, use \code{col_bactid} instead) column name of the species of the microorganisms +#' @param col_bactid (deprecated, use \code{col_mo} instead) +#' @param col_genus (deprecated, use \code{col_mo} instead) column name of the genus of the microorganisms +#' @param col_species (deprecated, use \code{col_mo} instead) column name of the species of the microorganisms #' @details \strong{WHY THIS IS SO IMPORTANT} \cr #' To conduct an analysis of antimicrobial resistance, you should only include the first isolate of every patient per episode \href{https://www.ncbi.nlm.nih.gov/pubmed/17304462}{[1]}. If you would not do this, you could easily get an overestimate or underestimate of the resistance of an antibiotic. Imagine that a patient was admitted with an MRSA and that it was found in 5 different blood cultures the following week. The resistance percentage of oxacillin of all \emph{S. aureus} isolates would be overestimated, because you included this MRSA more than once. It would be \href{https://en.wikipedia.org/wiki/Selection_bias}{selection bias}. #' @section Key antibiotics: @@ -63,7 +64,7 @@ #' mutate(first_isolate = first_isolate(., #' col_date = "date", #' col_patient_id = "patient_id", -#' col_bactid = "bactid")) +#' col_mo = "mo")) #' #' # Now let's see if first isolates matter: #' A <- my_patients %>% @@ -126,7 +127,7 @@ first_isolate <- function(tbl, col_date, col_patient_id, - col_bactid = NA, + col_mo = NA, col_testcode = NA, col_specimen = NA, col_icu = NA, @@ -140,12 +141,17 @@ first_isolate <- function(tbl, ignore_I = TRUE, points_threshold = 2, info = TRUE, + col_bactid = NA, col_genus = NA, col_species = NA) { + if (!is.na(col_bactid)) { + col_mo <- col_bactid + warning("Use of `col_bactid` is deprecated. Use `col_mo` instead.") + } # bactid OR genus+species must be available - if (is.na(col_bactid) & (is.na(col_genus) | is.na(col_species))) { - stop('`col_bactid` or both `col_genus` and `col_species` must be available.') + if (is.na(col_mo) & (is.na(col_genus) | is.na(col_species))) { + stop('`col_mo` or both `col_genus` and `col_species` must be available.') } # check if columns exist @@ -163,19 +169,19 @@ first_isolate <- function(tbl, check_columns_existance(col_date) check_columns_existance(col_patient_id) - check_columns_existance(col_bactid) + check_columns_existance(col_mo) check_columns_existance(col_genus) check_columns_existance(col_species) check_columns_existance(col_testcode) check_columns_existance(col_icu) check_columns_existance(col_keyantibiotics) - if (!is.na(col_bactid)) { - if (!tbl %>% pull(col_bactid) %>% is.bactid()) { - warning("Improve integrity of the `", col_bactid, "` column by transforming it with 'as.bactid'.") + if (!is.na(col_mo)) { + if (!tbl %>% pull(col_mo) %>% is.mo()) { + warning("Improve integrity of the `", col_mo, "` column by transforming it with 'as.mo'.") } # join to microorganisms data set - tbl <- tbl %>% left_join_microorganisms(by = col_bactid) + tbl <- tbl %>% left_join_microorganisms(by = col_mo) col_genus <- "genus" col_species <- "species" } diff --git a/R/freq.R b/R/freq.R index 88de0ca4..0c44dec0 100755 --- a/R/freq.R +++ b/R/freq.R @@ -76,7 +76,7 @@ #' # you could also use `select` or `pull` to get your variables #' septic_patients %>% #' filter(hospital_id == "A") %>% -#' select(bactid) %>% +#' select(mo) %>% #' freq() #' #' # multiple selected variables will be pasted together @@ -88,7 +88,7 @@ #' # get top 10 bugs of hospital A as a vector #' septic_patients %>% #' filter(hospital_id == "A") %>% -#' freq(bactid) %>% +#' freq(mo) %>% #' top_freq(10) #' #' # save frequency table to an object diff --git a/R/ggplot_rsi.R b/R/ggplot_rsi.R index 1c35b6e6..948d00b2 100644 --- a/R/ggplot_rsi.R +++ b/R/ggplot_rsi.R @@ -100,14 +100,14 @@ #' # genuine analysis: check 2 most prevalent microorganisms #' septic_patients %>% #' # create new bacterial ID's, with all CoNS under the same group (Becker et al.) -#' mutate(bactid = as.bactid(bactid, Becker = TRUE)) %>% +#' mutate(mo = as.mo(mo, Becker = TRUE)) %>% #' # filter on top 2 bacterial ID's -#' filter(bactid %in% top_freq(freq(.$bactid), 2)) %>% +#' filter(mo %in% top_freq(freq(.$mo), 2)) %>% #' # determine first isolates #' mutate(first_isolate = first_isolate(., #' col_date = "date", #' col_patient_id = "patient_id", -#' col_bactid = "bactid")) %>% +#' col_mo = "mo")) %>% #' # filter on first isolates #' filter(first_isolate == TRUE) %>% #' # join the `microorganisms` data set @@ -121,7 +121,7 @@ #' ggplot_rsi(x = "Antibiotic", #' facet = "mo") + #' labs(title = "AMR of Top Two Microorganisms In Blood Culture Isolates", -#' subtitle = "Only First Isolates, CoNS grouped according to Becker et al.", +#' subtitle = "Only First Isolates, CoNS grouped according to Becker et al. (2014)", #' x = "Microorganisms") #' } ggplot_rsi <- function(data, diff --git a/R/join_microorganisms.R b/R/join_microorganisms.R index dd19c16b..35c2b313 100755 --- a/R/join_microorganisms.R +++ b/R/join_microorganisms.R @@ -5,7 +5,7 @@ #' @name join #' @aliases join inner_join #' @param x existing table to join, also supports character vectors -#' @param by a variable to join by - could be a column name of \code{x} with values that exist in \code{microorganisms$bactid} (like \code{by = "bacteria_id"}), or another column in \code{\link{microorganisms}} (but then it should be named, like \code{by = c("my_genus_species" = "fullname")}) +#' @param by a variable to join by - could be a column name of \code{x} with values that exist in \code{microorganisms$mo} (like \code{by = "bacteria_id"}), or another column in \code{\link{microorganisms}} (but then it should be named, like \code{by = c("my_genus_species" = "fullname")}) #' @param suffix if there are non-joined duplicate variables in \code{x} and \code{y}, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2. #' @param ... other parameters to pass on to \code{dplyr::\link[dplyr]{join}}. #' @details As opposed to the \code{\link[dplyr]{join}} functions of \code{dplyr}, characters vectors are supported and at default existing columns will get a suffix \code{"2"} and the newly joined columns will not get a suffix. See \code{\link[dplyr]{join}} for more information. @@ -25,9 +25,9 @@ #' colnames(df) #' df2 <- left_join_microorganisms(df, "bacteria_id") #' colnames(df2) -inner_join_microorganisms <- function(x, by = 'bactid', suffix = c("2", ""), ...) { +inner_join_microorganisms <- function(x, by = 'mo', suffix = c("2", ""), ...) { if (!any(class(x) %in% c("data.frame", "matrix"))) { - x <- data.frame(bactid = as.character(x), stringsAsFactors = FALSE) + x <- data.frame(mo = as.character(x), stringsAsFactors = FALSE) } # no name set to `by` parameter if (is.null(names(by))) { @@ -47,9 +47,9 @@ inner_join_microorganisms <- function(x, by = 'bactid', suffix = c("2", ""), ... #' @rdname join #' @export -left_join_microorganisms <- function(x, by = 'bactid', suffix = c("2", ""), ...) { +left_join_microorganisms <- function(x, by = 'mo', suffix = c("2", ""), ...) { if (!any(class(x) %in% c("data.frame", "matrix"))) { - x <- data.frame(bactid = as.character(x), stringsAsFactors = FALSE) + x <- data.frame(mo = as.character(x), stringsAsFactors = FALSE) } # no name set to `by` parameter if (is.null(names(by))) { @@ -69,9 +69,9 @@ left_join_microorganisms <- function(x, by = 'bactid', suffix = c("2", ""), ...) #' @rdname join #' @export -right_join_microorganisms <- function(x, by = 'bactid', suffix = c("2", ""), ...) { +right_join_microorganisms <- function(x, by = 'mo', suffix = c("2", ""), ...) { if (!any(class(x) %in% c("data.frame", "matrix"))) { - x <- data.frame(bactid = as.character(x), stringsAsFactors = FALSE) + x <- data.frame(mo = as.character(x), stringsAsFactors = FALSE) } # no name set to `by` parameter if (is.null(names(by))) { @@ -91,9 +91,9 @@ right_join_microorganisms <- function(x, by = 'bactid', suffix = c("2", ""), ... #' @rdname join #' @export -full_join_microorganisms <- function(x, by = 'bactid', suffix = c("2", ""), ...) { +full_join_microorganisms <- function(x, by = 'mo', suffix = c("2", ""), ...) { if (!any(class(x) %in% c("data.frame", "matrix"))) { - x <- data.frame(bactid = as.character(x), stringsAsFactors = FALSE) + x <- data.frame(mo = as.character(x), stringsAsFactors = FALSE) } # no name set to `by` parameter if (is.null(names(by))) { @@ -113,9 +113,9 @@ full_join_microorganisms <- function(x, by = 'bactid', suffix = c("2", ""), ...) #' @rdname join #' @export -semi_join_microorganisms <- function(x, by = 'bactid', ...) { +semi_join_microorganisms <- function(x, by = 'mo', ...) { if (!any(class(x) %in% c("data.frame", "matrix"))) { - x <- data.frame(bactid = as.character(x), stringsAsFactors = FALSE) + x <- data.frame(mo = as.character(x), stringsAsFactors = FALSE) } # no name set to `by` parameter if (is.null(names(by))) { @@ -131,9 +131,9 @@ semi_join_microorganisms <- function(x, by = 'bactid', ...) { #' @rdname join #' @export -anti_join_microorganisms <- function(x, by = 'bactid', ...) { +anti_join_microorganisms <- function(x, by = 'mo', ...) { if (!any(class(x) %in% c("data.frame", "matrix"))) { - x <- data.frame(bactid = as.character(x), stringsAsFactors = FALSE) + x <- data.frame(mo = as.character(x), stringsAsFactors = FALSE) } # no name set to `by` parameter if (is.null(names(by))) { diff --git a/R/key_antibiotics.R b/R/key_antibiotics.R index 6e04a260..8db9b8a9 100644 --- a/R/key_antibiotics.R +++ b/R/key_antibiotics.R @@ -52,9 +52,9 @@ #' mutate(keyab = key_antibiotics(.)) %>% #' mutate( #' # now calculate first isolates -#' first_regular = first_isolate(., "date", "patient_id", "bactid"), +#' first_regular = first_isolate(., "date", "patient_id", "mo"), #' # and first WEIGHTED isolates -#' first_weighted = first_isolate(., "date", "patient_id", "bactid", +#' first_weighted = first_isolate(., "date", "patient_id", "mo", #' col_keyantibiotics = "keyab") #' ) #' @@ -73,7 +73,7 @@ #' key_antibiotics_equal(strainA, strainB, ignore_I = FALSE) #' # FALSE, because I is not ignored and so the 4th value differs key_antibiotics <- function(tbl, - col_bactid = "bactid", + col_mo = "mo", universal_1 = "amox", universal_2 = "amcl", universal_3 = "cfur", @@ -92,10 +92,15 @@ key_antibiotics <- function(tbl, GramNeg_4 = "cfot", GramNeg_5 = "cfta", GramNeg_6 = "mero", - warnings = TRUE) { + warnings = TRUE, + col_bactid = "bactid") { - if (!col_bactid %in% colnames(tbl)) { - stop('Column ', col_bactid, ' not found.', call. = FALSE) + if (col_bactid %in% colnames(tbl)) { + col_mo <- col_bactid + warning("Use of `col_bactid` is deprecated. Use `col_mo` instead.") + } + if (!col_mo %in% colnames(tbl)) { + stop('Column ', col_mo, ' not found.', call. = FALSE) } # check columns @@ -136,7 +141,7 @@ key_antibiotics <- function(tbl, gram_negative <- gram_negative[!is.na(gram_negative)] # join microorganisms - tbl <- tbl %>% left_join_microorganisms(col_bactid) + tbl <- tbl %>% left_join_microorganisms(col_mo) tbl$key_ab <- NA_character_ diff --git a/R/mdro.R b/R/mdro.R index 48d35c14..01818568 100755 --- a/R/mdro.R +++ b/R/mdro.R @@ -21,10 +21,11 @@ #' Determine which isolates are multidrug-resistant organisms (MDRO) according to country-specific guidelines. #' @param tbl table with antibiotic columns, like e.g. \code{amox} and \code{amcl} #' @param country country code to determine guidelines. EUCAST rules will be used when left empty, see Details. Should be or a code from the \href{https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements}{list of ISO 3166-1 alpha-2 country codes}. Case-insensitive. Currently supported are \code{de} (Germany) and \code{nl} (the Netherlands). -#' @param col_bactid column name of the bacteria ID in \code{tbl} - values of this column should be present in \code{microorganisms$bactid}, see \code{\link{microorganisms}} #' @param info print progress -#' @param amcl,amik,amox,ampi,azit,aztr,cefa,cfra,cfep,cfot,cfox,cfta,cftr,cfur,chlo,cipr,clar,clin,clox,coli,czol,dapt,doxy,erta,eryt,fosf,fusi,gent,imip,kana,levo,linc,line,mero,metr,mino,moxi,nali,neom,neti,nitr,novo,norf,oflo,peni,pita,poly,qida,rifa,roxi,siso,teic,tetr,tica,tige,tobr,trim,trsu,vanc column names of antibiotics. column names of antibiotics +#' @inheritParams EUCAST_rules +#' @param metr column name of an antibiotic. Use \code{NA} to skip a column, like \code{tica = NA}. Non-existing columns will anyway be skipped. See the Antibiotics section for an explanation of the abbreviations. #' @param ... parameters that are passed on to methods +#' @inheritSection EUCAST_rules Antibiotics #' @details When \code{country} will be left blank, guidelines will be taken from EUCAST Expert Rules Version 3.1 "Intrinsic Resistance and Exceptional Phenotypes Tables" (\url{http://www.eucast.org/fileadmin/src/media/PDFs/EUCAST_files/Expert_Rules/Expert_rules_intrinsic_exceptional_V3.1.pdf}). #' @return Ordered factor with levels \code{Unknown < Negative < Unconfirmed < Positive}. #' @rdname MDRO @@ -34,10 +35,10 @@ #' #' septic_patients %>% #' mutate(EUCAST = MDRO(.), -#' BRMO = MDRO(., "nl")) +#' BRMO = BRMO(.)) MDRO <- function(tbl, country = NULL, - col_bactid = 'bactid', + col_mo = 'mo', info = TRUE, amcl = 'amcl', amik = 'amik', @@ -97,10 +98,15 @@ MDRO <- function(tbl, tobr = 'tobr', trim = 'trim', trsu = 'trsu', - vanc = 'vanc') { + vanc = 'vanc', + col_bactid = 'bactid') { - if (!col_bactid %in% colnames(tbl)) { - stop('Column ', col_bactid, ' not found.', call. = FALSE) + if (col_bactid %in% colnames(tbl)) { + col_mo <- col_bactid + warning("Use of `col_bactid` is deprecated. Use `col_mo` instead.") + } + if (!col_mo %in% colnames(tbl)) { + stop('Column ', col_mo, ' not found.', call. = FALSE) } # strip whitespaces @@ -249,7 +255,7 @@ MDRO <- function(tbl, } # join microorganisms - tbl <- tbl %>% left_join_microorganisms(col_bactid) + tbl <- tbl %>% left_join_microorganisms(col_mo) tbl$MDRO <- NA_integer_ diff --git a/R/bactid.R b/R/mo.R similarity index 81% rename from R/bactid.R rename to R/mo.R index 410a1a66..9b1990d7 100644 --- a/R/bactid.R +++ b/R/mo.R @@ -16,18 +16,18 @@ # GNU General Public License for more details. # # ==================================================================== # -#' Transform to bacteria ID +#' Transform to microorganism ID #' #' Use this function to determine a valid ID based on a genus (and species). This input can be a full name (like \code{"Staphylococcus aureus"}), an abbreviated name (like \code{"S. aureus"}), or just a genus. You could also \code{\link{select}} a genus and species column, zie Examples. #' @param x a character vector or a dataframe with one or two columns #' @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}. +#' @rdname as.mo +#' @aliases mo +#' @keywords mo Becker becker Lancefield lancefield guess +#' @details \code{guess_mo} is an alias of \code{as.mo}. #' -#' Use the \code{\link{mo_property}} functions to get properties based on the returned bactid, see Examples. +#' Use the \code{\link{mo_property}} functions to get properties based on the returned mo, see Examples. #' #' Some exceptions have been built in to get more logical results, based on prevalence of human pathogens. These are: #' \itemize{ @@ -45,51 +45,51 @@ #' \url{https://dx.doi.org/10.1084/jem.57.4.571} #' @export #' @importFrom dplyr %>% pull left_join -#' @return Character (vector) with class \code{"bactid"}. Unknown values will return \code{NA}. +#' @return Character (vector) with class \code{"mo"}. Unknown values will return \code{NA}. #' @seealso \code{\link{microorganisms}} for the dataframe that is being used to determine ID's. #' @examples #' # These examples all return "STAAUR", the ID of S. aureus: -#' as.bactid("stau") -#' as.bactid("STAU") -#' as.bactid("staaur") -#' as.bactid("S. aureus") -#' as.bactid("S aureus") -#' as.bactid("Staphylococcus aureus") -#' as.bactid("MRSA") # Methicillin Resistant S. aureus -#' as.bactid("VISA") # Vancomycin Intermediate S. aureus -#' as.bactid("VRSA") # Vancomycin Resistant S. aureus +#' as.mo("stau") +#' as.mo("STAU") +#' as.mo("staaur") +#' as.mo("S. aureus") +#' as.mo("S aureus") +#' as.mo("Staphylococcus aureus") +#' as.mo("MRSA") # Methicillin Resistant S. aureus +#' as.mo("VISA") # Vancomycin Intermediate S. aureus +#' as.mo("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_mo is an alias of as.mo and works the same +#' guess_mo("S. epidermidis") # will remain species: STAEPI +#' guess_mo("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 +#' guess_mo("S. pyogenes") # will remain species: STCAGA +#' guess_mo("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` +#' # Use mo_* functions to get a specific property based on `mo` +#' Ecoli <- as.mo("E. coli") # returns `ESCCOL` #' mo_genus(Ecoli) # returns "Escherichia" #' mo_gramstain(Ecoli) # returns "Negative rods" #' #' \dontrun{ -#' df$bactid <- as.bactid(df$microorganism_name) +#' df$mo <- as.mo(df$microorganism_name) #' #' # the select function of tidyverse is also supported: #' library(dplyr) -#' df$bactid <- df %>% +#' df$mo <- df %>% #' select(microorganism_name) %>% -#' guess_bactid() +#' guess_mo() #' #' # and can even contain 2 columns, which is convenient for genus/species combinations: -#' df$bactid <- df %>% +#' df$mo <- df %>% #' select(genus, species) %>% -#' guess_bactid() +#' guess_mo() #' #' # same result: #' df <- df %>% -#' mutate(bactid = guess_bactid(paste(genus, species))) +#' mutate(mo = guess_mo(paste(genus, species))) #' } -as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { +as.mo <- function(x, Becker = FALSE, Lancefield = FALSE) { if (NCOL(x) == 2) { @@ -111,7 +111,7 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { } } - MOs <- AMR::microorganisms %>% filter(!bactid %like% '^_FAM') # dont search in those + MOs <- AMR::microorganisms %>% filter(!mo %like% '^_FAM') # dont search in those failures <- character(0) x_input <- x @@ -136,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_backup[i])) + mo <- suppressWarnings(guess_mo(x_backup[i])) if (mo %like% '^STA') { # See Source. It's this figure: # https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4187637/figure/F3/ @@ -167,7 +167,7 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { } if (Lancefield == TRUE) { - mo <- suppressWarnings(guess_bactid(x_backup[i])) + mo <- suppressWarnings(guess_mo(x_backup[i])) if (mo %like% '^STC') { # See Source species <- left_join_microorganisms(mo)$species @@ -205,13 +205,13 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { failures <- c(failures, x_backup[i]) next } - if (x_backup[i] %in% AMR::microorganisms$bactid) { - # is already a valid bactid + if (x_backup[i] %in% AMR::microorganisms$mo) { + # is already a valid mo x[i] <- x_backup[i] next } - if (x_trimmed[i] %in% AMR::microorganisms$bactid) { - # is already a valid bactid + if (x_trimmed[i] %in% AMR::microorganisms$mo) { + # is already a valid mo x[i] <- x_trimmed[i] next } @@ -275,14 +275,14 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { } # try any match keeping spaces - found <- MOs[which(MOs$fullname %like% x_withspaces[i]),]$bactid + found <- MOs[which(MOs$fullname %like% x_withspaces[i]),]$mo if (length(found) > 0) { x[i] <- found[1L] next } # try any match diregarding spaces - found <- MOs[which(MOs$fullname %like% x[i]),]$bactid + found <- MOs[which(MOs$fullname %like% x[i]),]$mo if (length(found) > 0) { x[i] <- found[1L] next @@ -290,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 <- MOs[which(MOs$fullname == x_species[i]),]$bactid + found <- MOs[which(MOs$fullname == x_species[i]),]$mo if (length(found) > 0) { x[i] <- found[1L] next } # try any match of only genus, with 'species' attached - found <- MOs[which(MOs$fullname %like% x_species[i]),]$bactid + found <- MOs[which(MOs$fullname %like% x_species[i]),]$mo 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_trimmed[i])),]$bactid + found <- AMR::microorganisms.umcg[which(toupper(AMR::microorganisms.umcg$umcg) == toupper(x_trimmed[i])),]$mo if (length(found) > 0) { x[i] <- found[1L] next @@ -317,7 +317,7 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { x_split[i] <- paste0(x_trimmed[i] %>% substr(1, x_length / 2) %>% trimws(), '.* ', x_trimmed[i] %>% substr((x_length / 2) + 1, x_length) %>% trimws()) - found <- MOs[which(MOs$fullname %like% paste0('^', x_split[i])),]$bactid + found <- MOs[which(MOs$fullname %like% paste0('^', x_split[i])),]$mo if (length(found) > 0) { x[i] <- found[1L] next @@ -331,7 +331,7 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { x_trimmed[i] <- trimws(x_trimmed[i], which = "both") } if (!is.na(x_trimmed[i])) { - found <- MOs[which(MOs$fullname %like% x_trimmed[i]),]$bactid + found <- MOs[which(MOs$fullname %like% x_trimmed[i]),]$mo if (length(found) > 0) { x[i] <- found[1L] next @@ -346,7 +346,7 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { failures <- failures[!failures %in% c(NA, NULL, NaN)] if (length(failures) > 0) { - warning("These values could not be coerced to a valid bactid: ", + warning("These values could not be coerced to a valid mo: ", paste('"', unique(failures), '"', sep = "", collapse = ', '), ".", call. = FALSE) @@ -364,19 +364,51 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { by = "input") %>% pull(found) - class(x) <- "bactid" + class(x) <- "mo" attr(x, 'package') <- 'AMR' x } -#' @rdname as.bactid +#' @rdname as.mo #' @export -guess_bactid <- as.bactid +is.mo <- function(x) { + # bactid for older releases + # remove when is.bactid will be removed + identical(class(x), "mo") | identical(class(x), "bactid") +} -#' @rdname as.bactid +#' @rdname as.mo #' @export -is.bactid <- function(x) { - identical(class(x), "bactid") +guess_mo <- as.mo + +#' @exportMethod print.mo +#' @export +#' @noRd +print.mo <- function(x, ...) { + cat("Class 'mo'\n") + print.default(as.character(x), quote = FALSE) +} + +#' @exportMethod as.data.frame.mo +#' @export +#' @noRd +as.data.frame.mo <- 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.mo +#' @export +#' @importFrom dplyr pull +#' @noRd +pull.mo <- function(.data, ...) { + pull(as.data.frame(.data), ...) } #' @exportMethod print.bactid diff --git a/R/mo_property.R b/R/mo_property.R index 58ad4ba9..a0459a59 100644 --- a/R/mo_property.R +++ b/R/mo_property.R @@ -18,9 +18,9 @@ #' 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"} +#' Use these functions to return a specific property of a microorganism from the \code{\link{microorganisms}} data set, based on their \code{mo}. Get such an ID with \code{\link{as.mo}}. +#' @param x a (vector of a) valid \code{\link{mo}} or any text that can be coerced to a valid microorganism code with \code{\link{as.mo}} +#' @param property one of the column names of one of the \code{\link{microorganisms}} data set, like \code{"mo"}, \code{"bactsys"}, \code{"family"}, \code{"genus"}, \code{"species"}, \code{"fullname"}, \code{"gramstain"} and \code{"aerobic"} #' @rdname mo_property #' @export #' @importFrom dplyr %>% left_join pull @@ -68,12 +68,12 @@ mo_property <- function(x, property = 'fullname') { 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 + if (!is.mo(x)) { + x <- as.mo(x) # this will give a warning if x cannot be coerced } suppressWarnings( - data.frame(bactid = x, stringsAsFactors = FALSE) %>% - left_join(AMR::microorganisms, by = "bactid") %>% + data.frame(mo = x, stringsAsFactors = FALSE) %>% + left_join(AMR::microorganisms, by = "mo") %>% pull(property) ) } diff --git a/R/resistance_predict.R b/R/resistance_predict.R index e48ade63..3890b90b 100644 --- a/R/resistance_predict.R +++ b/R/resistance_predict.R @@ -65,13 +65,13 @@ #' library(dplyr) #' septic_patients %>% #' # get bacteria properties like genus and species -#' left_join_microorganisms("bactid") %>% +#' left_join_microorganisms("mo") %>% #' # calculate first isolates #' mutate(first_isolate = #' first_isolate(., #' "date", #' "patient_id", -#' "bactid", +#' "mo", #' col_specimen = NA, #' col_icu = NA)) %>% #' # filter on first E. coli isolates @@ -89,7 +89,7 @@ #' if (!require(ggplot2)) { #' #' data <- septic_patients %>% -#' filter(bactid == "ESCCOL") %>% +#' filter(mo == "ESCCOL") %>% #' resistance_predict(col_ab = "amox", #' col_date = "date", #' info = FALSE, diff --git a/README.md b/README.md index a02317a0..882a0fbc 100755 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ 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 functions all use artificial intelligence to guess results that you would expect: - * 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". The 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.mo` 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". The 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.mo("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 (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", "Furadantin", "nitro" all return the ATC code of Nitrofurantoine. @@ -55,8 +55,8 @@ This `AMR` package basically does four important things: * 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 like `mo_genus`, `mo_family` or `mo_gramstain`. Since it uses `as.bactid` internally, AI is supported. For example, `mo_genus("MRSA")` and `mo_genus("S. aureus")` will both return `"Staphylococcus"`. 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 and DDD of both oral and parenteral administration. It also contains a total of 298 trade names. Use functions like `ab_official` and `ab_tradenames` to look up values. As the `mo_*` functions use `as.bactid` internally, the `ab_*` functions use `as.atc` internally so it uses AI to guess your expected result. For example, `ab_official("Fluclox")`, `ab_official("Floxapen")` and `ab_official("J01CF05")` will all return `"Flucloxacillin"`. These functions can again be used to add new variables to your data. + * 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 like `mo_genus`, `mo_family` or `mo_gramstain`. Since it uses `as.mo` internally, AI is supported. For example, `mo_genus("MRSA")` and `mo_genus("S. aureus")` will both return `"Staphylococcus"`. 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 and DDD of both oral and parenteral administration. It also contains a total of 298 trade names. Use functions like `ab_official` and `ab_tradenames` to look up values. As the `mo_*` functions use `as.mo` internally, the `ab_*` functions use `as.atc` internally so it uses AI to guess your expected result. For example, `ab_official("Fluclox")`, `ab_official("Floxapen")` and `ab_official("J01CF05")` will all return `"Flucloxacillin"`. These functions can again be used to add new variables to your data. 3. It **analyses the data** with convenient functions that use well-known methods. @@ -204,7 +204,7 @@ plot(mic_data) ### Overwrite/force resistance based on EUCAST rules This is also called *interpretive reading*. ```r -before <- data.frame(bactid = c("STAAUR", # Staphylococcus aureus +before <- data.frame(bact = c("STAAUR", # Staphylococcus aureus "ENCFAE", # Enterococcus faecalis "ESCCOL", # Escherichia coli "KLEPNE", # Klebsiella pneumoniae @@ -216,7 +216,7 @@ before <- data.frame(bactid = c("STAAUR", # Staphylococcus aureus cfur = "-", # Cefuroxime stringsAsFactors = FALSE) before -# bactid vanc amox coli cfta cfur +# bact vanc amox coli cfta cfur # 1 STAAUR - - - - - # 2 ENCFAE - - - - - # 3 ESCCOL - - - - - @@ -224,9 +224,9 @@ before # 5 PSEAER - - - - - # Now apply those rules; just need a column with bacteria IDs and antibiotic results: -after <- EUCAST_rules(before) +after <- EUCAST_rules(before, col_mo = "bact") after -# bactid vanc amox coli cfta cfur +# bact vanc amox coli cfta cfur # 1 STAAUR - - R R - # 2 ENCFAE - - R R R # 3 ESCCOL R - - - - @@ -234,17 +234,17 @@ after # 5 PSEAER R R - - R ``` -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*: +Bacteria IDs can be retrieved with the `guess_mo` 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") -guess_bactid("staaur") -guess_bactid("S. aureus") -guess_bactid("S aureus") -guess_bactid("Staphylococcus aureus") -guess_bactid("MRSA") # Methicillin Resistant S. aureus -guess_bactid("VISA") # Vancomycin Intermediate S. aureus -guess_bactid("VRSA") # Vancomycin Resistant S. aureus +guess_mo("stau") +guess_mo("STAU") +guess_mo("staaur") +guess_mo("S. aureus") +guess_mo("S aureus") +guess_mo("Staphylococcus aureus") +guess_mo("MRSA") # Methicillin Resistant S. aureus +guess_mo("VISA") # Vancomycin Intermediate S. aureus +guess_mo("VRSA") # Vancomycin Resistant S. aureus ``` ### Other (microbial) epidemiological functions diff --git a/data/microorganisms.rda b/data/microorganisms.rda index 645475da26922170669b33b4b4ea9c9aaa97ef53..094dc216f423eb500c82a2d66b0ee5d802c40f57 100755 GIT binary patch delta 39847 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 z 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 z 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 delta 39819 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 HSTbAyUV9H;tz02!c$ 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 literal 6466 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 diff --git a/data/septic_patients.rda b/data/septic_patients.rda index aa113de2b8d047757bc3aadb4af65004d66f3bfd..d951f4eebdf12439e0d04aaf0c224ef969392ed5 100755 GIT binary patch delta 28833 zcmXWBc|g+1|37Yr+ji{r^ZogKpMSh&<~gsK*K?k8ydE=;sdzs}_kPZzXcm8M zcoY*xXL=0Ff3I4!iZBy{N?!xd-YFRoz%Bc5ra7+%TK|!@*$=CKdZ^wdI$NR8;Y+8%F@A2fN3yQ zXtX3=`=S9zs%&zY%xD8Q1u=}ygk^I+{qElD2GIqG_mlnb^J2MZZ?zA~OW-$5eLcF` zD4k>4x6*o7E;y^l!(hfM&TU)qp0&fkA6HiX^4u%a2gMy;soPK5*A}KeqsG?Rv>3|P zDLS|F3`~WJ3UYE_6vX!SQ8Yd%H28mQopsFrg$@qr|MSuRbh9#-+`vdRtvDLy;5D0? z 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 delta 28852 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\% mutate(EUCAST = MDRO(.), - BRMO = MDRO(., "nl")) + BRMO = BRMO(.)) } diff --git a/man/as.bactid.Rd b/man/as.mo.Rd similarity index 69% rename from man/as.bactid.Rd rename to man/as.mo.Rd index 4777c019..fcaa458a 100644 --- a/man/as.bactid.Rd +++ b/man/as.mo.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand -% 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} +% Please edit documentation in R/mo.R +\name{as.mo} +\alias{as.mo} +\alias{mo} +\alias{is.mo} +\alias{guess_mo} +\title{Transform to microorganism ID} \source{ [1] Becker K \emph{et al.} \strong{Coagulase-Negative Staphylococci}. 2014. Clin Microbiol Rev. 27(4): 870–926. \cr \url{https://dx.doi.org/10.1128/CMR.00109-13} \cr @@ -13,11 +13,11 @@ \url{https://dx.doi.org/10.1084/jem.57.4.571} } \usage{ -as.bactid(x, Becker = FALSE, Lancefield = FALSE) +as.mo(x, Becker = FALSE, Lancefield = FALSE) -guess_bactid(x, Becker = FALSE, Lancefield = FALSE) +is.mo(x) -is.bactid(x) +guess_mo(x, Becker = FALSE, Lancefield = FALSE) } \arguments{ \item{x}{a character vector or a dataframe with one or two columns} @@ -27,15 +27,15 @@ is.bactid(x) \item{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}.} } \value{ -Character (vector) with class \code{"bactid"}. Unknown values will return \code{NA}. +Character (vector) with class \code{"mo"}. Unknown values will return \code{NA}. } \description{ Use this function to determine a valid ID based on a genus (and species). This input can be a full name (like \code{"Staphylococcus aureus"}), an abbreviated name (like \code{"S. aureus"}), or just a genus. You could also \code{\link{select}} a genus and species column, zie Examples. } \details{ -\code{guess_bactid} is an alias of \code{as.bactid}. +\code{guess_mo} is an alias of \code{as.mo}. -Use the \code{\link{mo_property}} functions to get properties based on the returned bactid, see Examples. +Use the \code{\link{mo_property}} functions to get properties based on the returned mo, see Examples. Some exceptions have been built in to get more logical results, based on prevalence of human pathogens. These are: \itemize{ @@ -49,45 +49,45 @@ For example, \code{"Gram negative rods"} and \code{"GNR"} will both return the I } \examples{ # These examples all return "STAAUR", the ID of S. aureus: -as.bactid("stau") -as.bactid("STAU") -as.bactid("staaur") -as.bactid("S. aureus") -as.bactid("S aureus") -as.bactid("Staphylococcus aureus") -as.bactid("MRSA") # Methicillin Resistant S. aureus -as.bactid("VISA") # Vancomycin Intermediate S. aureus -as.bactid("VRSA") # Vancomycin Resistant S. aureus +as.mo("stau") +as.mo("STAU") +as.mo("staaur") +as.mo("S. aureus") +as.mo("S aureus") +as.mo("Staphylococcus aureus") +as.mo("MRSA") # Methicillin Resistant S. aureus +as.mo("VISA") # Vancomycin Intermediate S. aureus +as.mo("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_mo is an alias of as.mo and works the same +guess_mo("S. epidermidis") # will remain species: STAEPI +guess_mo("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 +guess_mo("S. pyogenes") # will remain species: STCAGA +guess_mo("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` +# Use mo_* functions to get a specific property based on `mo` +Ecoli <- as.mo("E. coli") # returns `ESCCOL` mo_genus(Ecoli) # returns "Escherichia" mo_gramstain(Ecoli) # returns "Negative rods" \dontrun{ -df$bactid <- as.bactid(df$microorganism_name) +df$mo <- as.mo(df$microorganism_name) # the select function of tidyverse is also supported: library(dplyr) -df$bactid <- df \%>\% +df$mo <- df \%>\% select(microorganism_name) \%>\% - guess_bactid() + guess_mo() # and can even contain 2 columns, which is convenient for genus/species combinations: -df$bactid <- df \%>\% +df$mo <- df \%>\% select(genus, species) \%>\% - guess_bactid() + guess_mo() # same result: df <- df \%>\% - mutate(bactid = guess_bactid(paste(genus, species))) + mutate(mo = guess_mo(paste(genus, species))) } } \seealso{ @@ -95,7 +95,7 @@ df <- df \%>\% } \keyword{Becker} \keyword{Lancefield} -\keyword{bactid} \keyword{becker} \keyword{guess} \keyword{lancefield} +\keyword{mo} diff --git a/man/first_isolate.Rd b/man/first_isolate.Rd index 24a4e714..7e002f9c 100755 --- a/man/first_isolate.Rd +++ b/man/first_isolate.Rd @@ -7,13 +7,13 @@ Methodology of this function is based on: \strong{M39 Analysis and Presentation of Cumulative Antimicrobial Susceptibility Test Data, 4th Edition}, 2014, \emph{Clinical and Laboratory Standards Institute (CLSI)}. \url{https://clsi.org/standards/products/microbiology/documents/m39/}. } \usage{ -first_isolate(tbl, col_date, col_patient_id, col_bactid = NA, +first_isolate(tbl, col_date, col_patient_id, col_mo = NA, col_testcode = NA, col_specimen = NA, col_icu = NA, col_keyantibiotics = NA, episode_days = 365, testcodes_exclude = "", icu_exclude = FALSE, filter_specimen = NA, output_logical = TRUE, type = "keyantibiotics", ignore_I = TRUE, - points_threshold = 2, info = TRUE, col_genus = NA, - col_species = NA) + points_threshold = 2, info = TRUE, col_bactid = NA, + col_genus = NA, col_species = NA) } \arguments{ \item{tbl}{a \code{data.frame} containing isolates.} @@ -22,7 +22,7 @@ first_isolate(tbl, col_date, col_patient_id, col_bactid = NA, \item{col_patient_id}{column name of the unique IDs of the patients} -\item{col_bactid}{column name of the unique IDs of the microorganisms: \code{bactid}'s. If this column has another class than \code{"bactid"}, values will be coerced using \code{\link{as.bactid}}.} +\item{col_mo}{column name of the unique IDs of the microorganisms, see \code{\link{mo}}. If this column has another class than \code{"mo"}, values will be coerced using \code{\link{as.mo}}.} \item{col_testcode}{column name of the test codes. Use \code{col_testcode = NA} to \strong{not} exclude certain test codes (like test codes for screening). In that case \code{testcodes_exclude} will be ignored. Supports tidyverse-like quotation.} @@ -50,9 +50,11 @@ first_isolate(tbl, col_date, col_patient_id, col_bactid = NA, \item{info}{print progress} -\item{col_genus}{(deprecated, use \code{col_bactid} instead) column name of the genus of the microorganisms} +\item{col_bactid}{(deprecated, use \code{col_mo} instead)} -\item{col_species}{(deprecated, use \code{col_bactid} instead) column name of the species of the microorganisms} +\item{col_genus}{(deprecated, use \code{col_mo} instead) column name of the genus of the microorganisms} + +\item{col_species}{(deprecated, use \code{col_mo} instead) column name of the species of the microorganisms} } \value{ A vector to add to table, see Examples. @@ -84,7 +86,7 @@ my_patients <- septic_patients \%>\% mutate(first_isolate = first_isolate(., col_date = "date", col_patient_id = "patient_id", - col_bactid = "bactid")) + col_mo = "mo")) # Now let's see if first isolates matter: A <- my_patients \%>\% diff --git a/man/freq.Rd b/man/freq.Rd index 7a63b85d..0a1c399a 100755 --- a/man/freq.Rd +++ b/man/freq.Rd @@ -88,7 +88,7 @@ septic_patients \%>\% freq(hospital_id) #<- easiest to remember when you're use # you could also use `select` or `pull` to get your variables septic_patients \%>\% filter(hospital_id == "A") \%>\% - select(bactid) \%>\% + select(mo) \%>\% freq() # multiple selected variables will be pasted together @@ -100,7 +100,7 @@ septic_patients \%>\% # get top 10 bugs of hospital A as a vector septic_patients \%>\% filter(hospital_id == "A") \%>\% - freq(bactid) \%>\% + freq(mo) \%>\% top_freq(10) # save frequency table to an object diff --git a/man/ggplot_rsi.Rd b/man/ggplot_rsi.Rd index 4ae1bf75..e2011efc 100644 --- a/man/ggplot_rsi.Rd +++ b/man/ggplot_rsi.Rd @@ -119,14 +119,14 @@ septic_patients \%>\% # genuine analysis: check 2 most prevalent microorganisms septic_patients \%>\% # create new bacterial ID's, with all CoNS under the same group (Becker et al.) - mutate(bactid = as.bactid(bactid, Becker = TRUE)) \%>\% + mutate(mo = as.mo(mo, Becker = TRUE)) \%>\% # filter on top 2 bacterial ID's - filter(bactid \%in\% top_freq(freq(.$bactid), 2)) \%>\% + filter(mo \%in\% top_freq(freq(.$mo), 2)) \%>\% # determine first isolates mutate(first_isolate = first_isolate(., col_date = "date", col_patient_id = "patient_id", - col_bactid = "bactid")) \%>\% + col_mo = "mo")) \%>\% # filter on first isolates filter(first_isolate == TRUE) \%>\% # join the `microorganisms` data set @@ -140,7 +140,7 @@ septic_patients \%>\% ggplot_rsi(x = "Antibiotic", facet = "mo") + labs(title = "AMR of Top Two Microorganisms In Blood Culture Isolates", - subtitle = "Only First Isolates, CoNS grouped according to Becker et al.", + subtitle = "Only First Isolates, CoNS grouped according to Becker et al. (2014)", x = "Microorganisms") } } diff --git a/man/join.Rd b/man/join.Rd index ca89e27d..32eedc22 100755 --- a/man/join.Rd +++ b/man/join.Rd @@ -11,22 +11,22 @@ \alias{anti_join_microorganisms} \title{Join a table with \code{microorganisms}} \usage{ -inner_join_microorganisms(x, by = "bactid", suffix = c("2", ""), ...) +inner_join_microorganisms(x, by = "mo", suffix = c("2", ""), ...) -left_join_microorganisms(x, by = "bactid", suffix = c("2", ""), ...) +left_join_microorganisms(x, by = "mo", suffix = c("2", ""), ...) -right_join_microorganisms(x, by = "bactid", suffix = c("2", ""), ...) +right_join_microorganisms(x, by = "mo", suffix = c("2", ""), ...) -full_join_microorganisms(x, by = "bactid", suffix = c("2", ""), ...) +full_join_microorganisms(x, by = "mo", suffix = c("2", ""), ...) -semi_join_microorganisms(x, by = "bactid", ...) +semi_join_microorganisms(x, by = "mo", ...) -anti_join_microorganisms(x, by = "bactid", ...) +anti_join_microorganisms(x, by = "mo", ...) } \arguments{ \item{x}{existing table to join, also supports character vectors} -\item{by}{a variable to join by - could be a column name of \code{x} with values that exist in \code{microorganisms$bactid} (like \code{by = "bacteria_id"}), or another column in \code{\link{microorganisms}} (but then it should be named, like \code{by = c("my_genus_species" = "fullname")})} +\item{by}{a variable to join by - could be a column name of \code{x} with values that exist in \code{microorganisms$mo} (like \code{by = "bacteria_id"}), or another column in \code{\link{microorganisms}} (but then it should be named, like \code{by = c("my_genus_species" = "fullname")})} \item{suffix}{if there are non-joined duplicate variables in \code{x} and \code{y}, these suffixes will be added to the output to disambiguate them. Should be a character vector of length 2.} diff --git a/man/key_antibiotics.Rd b/man/key_antibiotics.Rd index 41bf8371..386e3b3f 100755 --- a/man/key_antibiotics.Rd +++ b/man/key_antibiotics.Rd @@ -5,13 +5,14 @@ \alias{key_antibiotics_equal} \title{Key antibiotics for first \emph{weighted} isolates} \usage{ -key_antibiotics(tbl, col_bactid = "bactid", universal_1 = "amox", +key_antibiotics(tbl, col_mo = "mo", universal_1 = "amox", universal_2 = "amcl", universal_3 = "cfur", universal_4 = "pita", universal_5 = "cipr", universal_6 = "trsu", GramPos_1 = "vanc", GramPos_2 = "teic", GramPos_3 = "tetr", GramPos_4 = "eryt", GramPos_5 = "oxac", GramPos_6 = "rifa", GramNeg_1 = "gent", GramNeg_2 = "tobr", GramNeg_3 = "coli", GramNeg_4 = "cfot", - GramNeg_5 = "cfta", GramNeg_6 = "mero", warnings = TRUE) + GramNeg_5 = "cfta", GramNeg_6 = "mero", warnings = TRUE, + col_bactid = "bactid") key_antibiotics_equal(x, y, type = c("keyantibiotics", "points"), ignore_I = TRUE, points_threshold = 2, info = FALSE) @@ -19,7 +20,7 @@ key_antibiotics_equal(x, y, type = c("keyantibiotics", "points"), \arguments{ \item{tbl}{table with antibiotics coloms, like \code{amox} and \code{amcl}.} -\item{col_bactid}{column name of the unique IDs of the microorganisms: \code{bactid}'s. If this column has another class than \code{"bactid"}, values will be coerced using \code{\link{as.bactid}}.} +\item{col_mo}{column name of the unique IDs of the microorganisms, see \code{\link{mo}}. If this column has another class than \code{"mo"}, values will be coerced using \code{\link{as.mo}}.} \item{universal_1, universal_2, universal_3, universal_4, universal_5, universal_6}{column names of \strong{broad-spectrum} antibiotics, case-insensitive} @@ -29,6 +30,8 @@ key_antibiotics_equal(x, y, type = c("keyantibiotics", "points"), \item{warnings}{give warning about missing antibiotic columns, they will anyway be ignored} +\item{col_bactid}{(deprecated, use \code{col_mo} instead)} + \item{x, y}{characters to compare} \item{type}{type to determine weighed isolates; can be \code{"keyantibiotics"} or \code{"points"}, see Details} @@ -76,9 +79,9 @@ my_patients <- my_patients \%>\% mutate(keyab = key_antibiotics(.)) \%>\% mutate( # now calculate first isolates - first_regular = first_isolate(., "date", "patient_id", "bactid"), + first_regular = first_isolate(., "date", "patient_id", "mo"), # and first WEIGHTED isolates - first_weighted = first_isolate(., "date", "patient_id", "bactid", + first_weighted = first_isolate(., "date", "patient_id", "mo", col_keyantibiotics = "keyab") ) diff --git a/man/microorganisms.Rd b/man/microorganisms.Rd index 05415a0b..dd57a3d2 100755 --- a/man/microorganisms.Rd +++ b/man/microorganisms.Rd @@ -6,7 +6,7 @@ \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{mo}}{ID of microorganism} \item{\code{bactsys}}{Bactsyscode of microorganism} \item{\code{family}}{Family name of microorganism} \item{\code{genus}}{Genus name of microorganism, like \code{"Echerichia"}} @@ -26,6 +26,6 @@ microorganisms 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}} +\code{\link{guess_mo}} \code{\link{antibiotics}} \code{\link{microorganisms.umcg}} } \keyword{datasets} diff --git a/man/microorganisms.umcg.Rd b/man/microorganisms.umcg.Rd index 51645a14..517fadf0 100755 --- a/man/microorganisms.umcg.Rd +++ b/man/microorganisms.umcg.Rd @@ -6,16 +6,16 @@ \title{Translation table for UMCG with ~1100 microorganisms} \format{A data.frame with 1090 observations and 2 variables: \describe{ - \item{\code{mocode}}{Code of microorganism according to UMCG MMB} - \item{\code{bactid}}{Code of microorganism in \code{\link{microorganisms}}} + \item{\code{umcg}}{Code of microorganism according to UMCG MMB} + \item{\code{mo}}{Code of microorganism in \code{\link{microorganisms}}} }} \usage{ microorganisms.umcg } \description{ -A dataset containing all bacteria codes of UMCG MMB. These codes can be joined to data with an ID from \code{\link{microorganisms}$bactid} (using \code{\link{left_join_microorganisms}}). GLIMS codes can also be translated to valid \code{bactid}'s with \code{\link{guess_bactid}}. +A dataset containing all bacteria codes of UMCG MMB. These codes can be joined to data with an ID from \code{\link{microorganisms}$mo} (using \code{\link{left_join_microorganisms}}). GLIMS codes can also be translated to valid \code{mo}'s with \code{\link{guess_mo}}. } \seealso{ -\code{\link{guess_bactid}} \code{\link{microorganisms}} +\code{\link{guess_mo}} \code{\link{microorganisms}} } \keyword{datasets} diff --git a/man/mo_property.Rd b/man/mo_property.Rd index 3fd60ce7..cd8caabe 100644 --- a/man/mo_property.Rd +++ b/man/mo_property.Rd @@ -37,12 +37,12 @@ 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{x}{a (vector of a) valid \code{\link{mo}} or any text that can be coerced to a valid microorganism code with \code{\link{as.mo}}} -\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"}} +\item{property}{one of the column names of one of the \code{\link{microorganisms}} data set, like \code{"mo"}, \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}}. +Use these functions to return a specific property of a microorganism from the \code{\link{microorganisms}} data set, based on their \code{mo}. Get such an ID with \code{\link{as.mo}}. } \examples{ # All properties diff --git a/man/resistance_predict.Rd b/man/resistance_predict.Rd index 254aa29f..4d47b6d5 100644 --- a/man/resistance_predict.Rd +++ b/man/resistance_predict.Rd @@ -71,13 +71,13 @@ tbl \%>\% library(dplyr) septic_patients \%>\% # get bacteria properties like genus and species - left_join_microorganisms("bactid") \%>\% + left_join_microorganisms("mo") \%>\% # calculate first isolates mutate(first_isolate = first_isolate(., "date", "patient_id", - "bactid", + "mo", col_specimen = NA, col_icu = NA)) \%>\% # filter on first E. coli isolates @@ -95,7 +95,7 @@ septic_patients \%>\% if (!require(ggplot2)) { data <- septic_patients \%>\% - filter(bactid == "ESCCOL") \%>\% + filter(mo == "ESCCOL") \%>\% resistance_predict(col_ab = "amox", col_date = "date", info = FALSE, diff --git a/man/septic_patients.Rd b/man/septic_patients.Rd index cd494038..0e6645c0 100755 --- a/man/septic_patients.Rd +++ b/man/septic_patients.Rd @@ -14,7 +14,7 @@ \item{\code{age}}{age of the patient} \item{\code{sex}}{sex of the patient} \item{\code{patient_id}}{ID of the patient, first 10 characters of an SHA hash containing irretrievable information} - \item{\code{bactid}}{ID of microorganism, see \code{\link{microorganisms}}} + \item{\code{mo}}{ID of microorganism, see \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}}} }} \usage{ @@ -36,7 +36,7 @@ library(dplyr) # Add first isolates to our dataset: my_data <- my_data \%>\% - mutate(first_isolates = first_isolate(my_data, "date", "patient_id", "bactid")) + mutate(first_isolates = first_isolate(my_data, "date", "patient_id", "mo")) # -------- # # ANALYSIS # @@ -46,7 +46,7 @@ my_data <- my_data \%>\% # and numbers (n) of E. coli, divided by hospital: my_data \%>\% - filter(bactid == guess_bactid("E. coli"), + filter(mo == guess_mo("E. coli"), first_isolates == TRUE) \%>\% group_by(hospital_id) \%>\% summarise(n = n_rsi(amox), @@ -57,7 +57,7 @@ my_data \%>\% # percentages of E. coli, trend over the years: my_data \%>\% - filter(bactid == guess_bactid("E. coli"), + filter(mo == guess_mo("E. coli"), first_isolates == TRUE) \%>\% group_by(year = format(date, "\%Y")) \%>\% summarise(n = n_rsi(amcl), diff --git a/tests/testthat/test-bactid.R b/tests/testthat/test-bactid.R deleted file mode 100644 index 8210b3bc..00000000 --- a/tests/testthat/test-bactid.R +++ /dev/null @@ -1,118 +0,0 @@ -context("bactid.R") - -test_that("as.bactid works", { - expect_identical( - as.character(as.bactid(c("E. coli", "H. influenzae"))), - c("ESCCOL", "HAEINF")) - - expect_equal(as.character(as.bactid("Escherichia coli")), "ESCCOL") - expect_equal(as.character(as.bactid("Escherichia coli")), "ESCCOL") - expect_equal(as.character(as.bactid("Escherichia species")), "ESC") - expect_equal(as.character(as.bactid(" ESCCOL ")), "ESCCOL") - expect_equal(as.character(as.bactid("klpn")), "KLEPNE") - expect_equal(as.character(as.bactid("Klebsiella")), "KLE") - expect_equal(as.character(as.bactid("coagulase negative")), "STACNS") - - expect_equal(as.character(as.bactid("P. aer")), "PSEAER") # not Pasteurella aerogenes - - expect_equal(as.character(as.bactid("Negative rods")), "GNR") - expect_equal(as.character(as.bactid("Gram negative rods")), "GNR") - - # GLIMS - expect_equal(as.character(as.bactid("shiboy")), "SHIBOY") - - expect_equal(as.character(as.bactid("MRSE")), "STAEPI") - expect_equal(as.character(as.bactid("VRE")), "ENC") - expect_equal(as.character(as.bactid("MRPA")), "PSEAER") - expect_equal(as.character(as.bactid("PISP")), "STCPNE") - expect_equal(as.character(as.bactid("PRSP")), "STCPNE") - expect_equal(as.character(as.bactid("VISP")), "STCPNE") - expect_equal(as.character(as.bactid("VRSP")), "STCPNE") - - expect_identical( - as.character( - as.bactid(c("stau", - "STAU", - "staaur", - "S. aureus", - "S aureus", - "Staphylococcus aureus", - "MRSA", - "VISA"))), - rep("STAAUR", 8)) - - # check for Becker classification - expect_identical(as.character(guess_bactid("S. epidermidis", Becker = FALSE)), "STAEPI") - expect_identical(as.character(guess_bactid("S. epidermidis", Becker = TRUE)), "STACNS") - expect_identical(as.character(guess_bactid("STAEPI", Becker = TRUE)), "STACNS") - expect_identical(as.character(guess_bactid("S. intermedius", Becker = FALSE)), "STAINT") - expect_identical(as.character(guess_bactid("S. intermedius", Becker = TRUE)), "STACPS") - expect_identical(as.character(guess_bactid("STAINT", Becker = TRUE)), "STACPS") - # aureus must only be influenced if Becker = "all" - expect_identical(as.character(guess_bactid("STAAUR", Becker = FALSE)), "STAAUR") - expect_identical(as.character(guess_bactid("STAAUR", Becker = TRUE)), "STAAUR") - expect_identical(as.character(guess_bactid("STAAUR", Becker = "all")), "STACPS") - - # check for Lancefield classification - expect_identical(as.character(guess_bactid("S. pyogenes", Lancefield = FALSE)), "STCPYO") - expect_identical(as.character(guess_bactid("S. pyogenes", Lancefield = TRUE)), "STCGRA") - expect_identical(as.character(guess_bactid("STCPYO", Lancefield = TRUE)), "STCGRA") - expect_identical(as.character(guess_bactid("S. agalactiae", Lancefield = FALSE)), "STCAGA") - expect_identical(as.character(guess_bactid("S. agalactiae", Lancefield = TRUE)), "STCGRB") # group B - expect_identical(as.character(guess_bactid("S. equisimilis", Lancefield = FALSE)), "STCEQS") - expect_identical(as.character(guess_bactid("S. equisimilis", Lancefield = TRUE)), "STCGRC") # group C - expect_identical(as.character(guess_bactid("S. anginosus", Lancefield = FALSE)), "STCANG") - expect_identical(as.character(guess_bactid("S. anginosus", Lancefield = TRUE)), "STCGRF") # group F - expect_identical(as.character(guess_bactid("S. sanguis", Lancefield = FALSE)), "STCSAN") - expect_identical(as.character(guess_bactid("S. sanguis", Lancefield = TRUE)), "STCGRH") # group H - expect_identical(as.character(guess_bactid("S. salivarius", Lancefield = FALSE)), "STCSAL") - expect_identical(as.character(guess_bactid("S. salivarius", Lancefield = TRUE)), "STCGRK") # group K - - library(dplyr) - - # select with one column - expect_identical( - septic_patients[1:10,] %>% - left_join_microorganisms() %>% - select(genus) %>% - as.bactid() %>% - as.character(), - c("ESC", "ESC", "STA", "STA", "STA", - "STA", "STA", "STA", "STA", "STA")) - - # select with two columns - expect_identical( - septic_patients[1:10,] %>% - pull(bactid), - septic_patients[1:10,] %>% - left_join_microorganisms() %>% - select(genus, species) %>% - as.bactid() %>% - as.character()) - - # unknown results - expect_warning(as.bactid(c("INVALID", "Yeah, unknown"))) - - # too many columns - expect_error(septic_patients %>% select(1:3) %>% as.bactid()) - - # print - expect_output(print(as.bactid(c("ESCCOL", NA)))) - - # helper function - expect_identical(as.bactid("ESCCOL"), - guess_bactid("ESCCOL")) - - # test pull - expect_equal(nrow(septic_patients %>% mutate(bactid = as.bactid(bactid))), - 2000) - - # test data.frame - expect_equal(nrow(data.frame(test = as.bactid("ESCCOL"))), - 1) - - # check empty values - expect_equal(as.character(suppressWarnings(as.bactid(""))), - NA_character_) - -}) diff --git a/tests/testthat/test-deprecated.R b/tests/testthat/test-deprecated.R new file mode 100644 index 00000000..353242bd --- /dev/null +++ b/tests/testthat/test-deprecated.R @@ -0,0 +1,24 @@ +context("deprecated.R") + +test_that("deprecated functions work", { + + expect_identical(is.mo(as.mo("esco")), suppressWarnings(is.bactid(as.bactid("esco")))) + expect_warning(identical(is.mo(as.mo("esco")), is.bactid(as.bactid("esco")))) + + expect_identical(as.mo("esco"), suppressWarnings(guess_bactid("esco"))) + + 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)) + + old_mo <- "ESCCOL" + class(old_mo) <- "bactid" + # print + expect_output(print(old_mo)) + # test data.frame and pull + expect_equal(as.character(dplyr::pull(data.frame(test = old_mo), test)), "ESCCOL") + +}) diff --git a/tests/testthat/test-eucast.R b/tests/testthat/test-eucast.R index d2f977b6..c2e40425 100755 --- a/tests/testthat/test-eucast.R +++ b/tests/testthat/test-eucast.R @@ -2,19 +2,19 @@ context("eucast.R") test_that("EUCAST rules work", { - expect_error(EUCAST_rules(septic_patients, col_bactid = "Non-existing")) + expect_error(EUCAST_rules(septic_patients, col_mo = "Non-existing")) expect_identical(colnames(septic_patients), colnames(suppressWarnings(EUCAST_rules(septic_patients)))) - a <- data.frame(bactid = + a <- data.frame(mo = c("KLEPNE", # Klebsiella pneumoniae "PSEAER", # Pseudomonas aeruginosa "ENTAER"), # Enterobacter aerogenes amox = "-", # Amoxicillin stringsAsFactors = FALSE) - b <- data.frame(bactid = + b <- data.frame(mo = c("KLEPNE", # Klebsiella pneumoniae "PSEAER", # Pseudomonas aeruginosa "ENTAER"), # Enterobacter aerogenes @@ -24,12 +24,12 @@ test_that("EUCAST rules work", { expect_identical(suppressWarnings(EUCAST_rules(a, info = FALSE)), b) expect_identical(suppressWarnings(interpretive_reading(a, info = TRUE)), b) - a <- data.frame(bactid = + a <- data.frame(mo = c("STAAUR", # Staphylococcus aureus "STCGRA"), # Streptococcus pyognenes (Lancefield Group A) coli = "-", # Colistin stringsAsFactors = FALSE) - b <- data.frame(bactid = + b <- data.frame(mo = c("STAAUR", # Staphylococcus aureus "STCGRA"), # Streptococcus pyognenes (Lancefield Group A) coli = "R", # Colistin @@ -42,7 +42,7 @@ test_that("EUCAST rules work", { septic_patients %>% mutate(tica = as.rsi("R"), pita = as.rsi("S")) %>% - EUCAST_rules(col_bactid = "bactid") %>% + EUCAST_rules(col_mo = "mo") %>% left_join_microorganisms() %>% filter(family == "Enterobacteriaceae") %>% pull(pita) %>% @@ -54,11 +54,11 @@ test_that("EUCAST rules work", { septic_patients %>% mutate(azit = as.rsi("R"), clar = as.rsi("R")) %>% - EUCAST_rules(col_bactid = "bactid") %>% + EUCAST_rules(col_mo = "mo") %>% pull(clar)), suppressWarnings( septic_patients %>% - EUCAST_rules(col_bactid = "bactid") %>% + EUCAST_rules(col_mo = "mo") %>% left_join_microorganisms() %>% pull(eryt))) diff --git a/tests/testthat/test-first_isolate.R b/tests/testthat/test-first_isolate.R index 5f1f973e..bb18789d 100755 --- a/tests/testthat/test-first_isolate.R +++ b/tests/testthat/test-first_isolate.R @@ -7,7 +7,7 @@ test_that("first isolates work", { first_isolate(tbl = septic_patients, col_date = "date", col_patient_id = "patient_id", - col_bactid = "bactid", + col_mo = "mo", info = TRUE), na.rm = TRUE), 1331) @@ -19,7 +19,7 @@ test_that("first isolates work", { first_isolate(tbl = septic_patients %>% mutate(keyab = key_antibiotics(.)), col_date = "date", col_patient_id = "patient_id", - col_bactid = "bactid", + col_mo = "mo", col_keyantibiotics = "keyab", type = "keyantibiotics", info = TRUE), @@ -32,7 +32,7 @@ test_that("first isolates work", { first_isolate(tbl = septic_patients %>% mutate(keyab = key_antibiotics(.)), col_date = "date", col_patient_id = "patient_id", - col_bactid = "bactid", + col_mo = "mo", col_keyantibiotics = "keyab", ignore_I = FALSE, type = "keyantibiotics", @@ -46,7 +46,7 @@ test_that("first isolates work", { first_isolate(tbl = septic_patients %>% mutate(keyab = key_antibiotics(.)), col_date = "date", col_patient_id = "patient_id", - col_bactid = "bactid", + col_mo = "mo", col_keyantibiotics = "keyab", type = "points", info = TRUE), @@ -57,7 +57,7 @@ test_that("first isolates work", { expect_equal( sum( first_isolate(septic_patients, - col_bactid = "bactid", + col_mo = "mo", col_date = "date", col_patient_id = "patient_id", col_icu = "ward_icu", @@ -76,7 +76,7 @@ test_that("first isolates work", { "Other")), col_date = "date", col_patient_id = "patient_id", - col_bactid = "bactid", + col_mo = "mo", col_specimen = "specimen", filter_specimen = "Urine", info = TRUE), @@ -91,7 +91,7 @@ test_that("first isolates work", { "Other")), col_date = "date", col_patient_id = "patient_id", - col_bactid = "bactid", + col_mo = "mo", col_specimen = "specimen", filter_specimen = "Urine", col_icu = "ward_icu", @@ -104,7 +104,7 @@ test_that("first isolates work", { expect_message(septic_patients %>% mutate(specimen = "test") %>% mutate(first = first_isolate(., "date", "patient_id", - col_bactid = "bactid", + col_mo = "mo", col_specimen = "specimen", filter_specimen = "something_unexisting", output_logical = FALSE))) @@ -112,22 +112,22 @@ test_that("first isolates work", { # printing of exclusion message expect_output(septic_patients %>% first_isolate(col_date = "date", - col_bactid = "bactid", + col_mo = "mo", col_patient_id = "patient_id", col_testcode = "sex", testcodes_exclude = "M")) # errors - expect_error(first_isolate("date", "patient_id", col_bactid = "bactid")) + expect_error(first_isolate("date", "patient_id", col_mo = "mo")) expect_error(first_isolate(septic_patients)) expect_error(first_isolate(septic_patients, col_date = "non-existing col", - col_bactid = "bactid")) + col_mo = "mo")) expect_warning(septic_patients %>% - mutate(bactid = as.character(bactid)) %>% + mutate(mo = as.character(mo)) %>% first_isolate(col_date = "date", - col_bactid = "bactid", + col_mo = "mo", col_patient_id = "patient_id")) }) diff --git a/tests/testthat/test-freq.R b/tests/testthat/test-freq.R index 08bb835d..787b17a5 100755 --- a/tests/testthat/test-freq.R +++ b/tests/testthat/test-freq.R @@ -22,7 +22,7 @@ test_that("frequency table works", { expect_output(print(freq(septic_patients$age[0]))) # character - expect_output(print(freq(septic_patients$bactid))) + expect_output(print(freq(septic_patients$mo))) # integer expect_output(print(freq(septic_patients$age))) # date @@ -56,21 +56,21 @@ test_that("frequency table works", { # top 5 expect_equal( septic_patients %>% - freq(bactid) %>% + freq(mo) %>% top_freq(5) %>% length(), 5) # there're more than 5 lowest values expect_gt( septic_patients %>% - freq(bactid) %>% + freq(mo) %>% top_freq(-5) %>% length(), 5) # n has length > 1 expect_error( septic_patients %>% - freq(bactid) %>% + freq(mo) %>% top_freq(n = c(1, 2)) ) # input must be freq tbl diff --git a/tests/testthat/test-join_microorganisms.R b/tests/testthat/test-join_microorganisms.R index c1237ea2..2dd59d1e 100755 --- a/tests/testthat/test-join_microorganisms.R +++ b/tests/testthat/test-join_microorganisms.R @@ -25,11 +25,11 @@ test_that("joins work", { expect_equal(nrow(inner_join_microorganisms("ESCCOL")), 1) - expect_equal(nrow(inner_join_microorganisms("ESCCOL", by = c("bactid" = "bactid"))), 1) - expect_warning(inner_join_microorganisms("Escherichia", by = c("bactid" = "genus"))) + expect_equal(nrow(inner_join_microorganisms("ESCCOL", by = c("mo" = "mo"))), 1) + expect_warning(inner_join_microorganisms("Escherichia", by = c("mo" = "genus"))) expect_equal(nrow(left_join_microorganisms("ESCCOL")), 1) - expect_warning(left_join_microorganisms("Escherichia", by = c("bactid" = "genus"))) + expect_warning(left_join_microorganisms("Escherichia", by = c("mo" = "genus"))) expect_equal(nrow(semi_join_microorganisms("ESCCOL")), 1) expect_equal(nrow(anti_join_microorganisms("ESCCOL")), 0) diff --git a/tests/testthat/test-mo.R b/tests/testthat/test-mo.R new file mode 100644 index 00000000..47b5baeb --- /dev/null +++ b/tests/testthat/test-mo.R @@ -0,0 +1,118 @@ +context("mo.R") + +test_that("as.mo works", { + expect_identical( + as.character(as.mo(c("E. coli", "H. influenzae"))), + c("ESCCOL", "HAEINF")) + + expect_equal(as.character(as.mo("Escherichia coli")), "ESCCOL") + expect_equal(as.character(as.mo("Escherichia coli")), "ESCCOL") + expect_equal(as.character(as.mo("Escherichia species")), "ESC") + expect_equal(as.character(as.mo(" ESCCOL ")), "ESCCOL") + expect_equal(as.character(as.mo("klpn")), "KLEPNE") + expect_equal(as.character(as.mo("Klebsiella")), "KLE") + expect_equal(as.character(as.mo("coagulase negative")), "STACNS") + + expect_equal(as.character(as.mo("P. aer")), "PSEAER") # not Pasteurella aerogenes + + expect_equal(as.character(as.mo("Negative rods")), "GNR") + expect_equal(as.character(as.mo("Gram negative rods")), "GNR") + + # GLIMS + expect_equal(as.character(as.mo("shiboy")), "SHIBOY") + + expect_equal(as.character(as.mo("MRSE")), "STAEPI") + expect_equal(as.character(as.mo("VRE")), "ENC") + expect_equal(as.character(as.mo("MRPA")), "PSEAER") + expect_equal(as.character(as.mo("PISP")), "STCPNE") + expect_equal(as.character(as.mo("PRSP")), "STCPNE") + expect_equal(as.character(as.mo("VISP")), "STCPNE") + expect_equal(as.character(as.mo("VRSP")), "STCPNE") + + expect_identical( + as.character( + as.mo(c("stau", + "STAU", + "staaur", + "S. aureus", + "S aureus", + "Staphylococcus aureus", + "MRSA", + "VISA"))), + rep("STAAUR", 8)) + + # check for Becker classification + expect_identical(as.character(guess_mo("S. epidermidis", Becker = FALSE)), "STAEPI") + expect_identical(as.character(guess_mo("S. epidermidis", Becker = TRUE)), "STACNS") + expect_identical(as.character(guess_mo("STAEPI", Becker = TRUE)), "STACNS") + expect_identical(as.character(guess_mo("S. intermedius", Becker = FALSE)), "STAINT") + expect_identical(as.character(guess_mo("S. intermedius", Becker = TRUE)), "STACPS") + expect_identical(as.character(guess_mo("STAINT", Becker = TRUE)), "STACPS") + # aureus must only be influenced if Becker = "all" + expect_identical(as.character(guess_mo("STAAUR", Becker = FALSE)), "STAAUR") + expect_identical(as.character(guess_mo("STAAUR", Becker = TRUE)), "STAAUR") + expect_identical(as.character(guess_mo("STAAUR", Becker = "all")), "STACPS") + + # check for Lancefield classification + expect_identical(as.character(guess_mo("S. pyogenes", Lancefield = FALSE)), "STCPYO") + expect_identical(as.character(guess_mo("S. pyogenes", Lancefield = TRUE)), "STCGRA") + expect_identical(as.character(guess_mo("STCPYO", Lancefield = TRUE)), "STCGRA") + expect_identical(as.character(guess_mo("S. agalactiae", Lancefield = FALSE)), "STCAGA") + expect_identical(as.character(guess_mo("S. agalactiae", Lancefield = TRUE)), "STCGRB") # group B + expect_identical(as.character(guess_mo("S. equisimilis", Lancefield = FALSE)), "STCEQS") + expect_identical(as.character(guess_mo("S. equisimilis", Lancefield = TRUE)), "STCGRC") # group C + expect_identical(as.character(guess_mo("S. anginosus", Lancefield = FALSE)), "STCANG") + expect_identical(as.character(guess_mo("S. anginosus", Lancefield = TRUE)), "STCGRF") # group F + expect_identical(as.character(guess_mo("S. sanguis", Lancefield = FALSE)), "STCSAN") + expect_identical(as.character(guess_mo("S. sanguis", Lancefield = TRUE)), "STCGRH") # group H + expect_identical(as.character(guess_mo("S. salivarius", Lancefield = FALSE)), "STCSAL") + expect_identical(as.character(guess_mo("S. salivarius", Lancefield = TRUE)), "STCGRK") # group K + + library(dplyr) + + # select with one column + expect_identical( + septic_patients[1:10,] %>% + left_join_microorganisms() %>% + select(genus) %>% + as.mo() %>% + as.character(), + c("ESC", "ESC", "STA", "STA", "STA", + "STA", "STA", "STA", "STA", "STA")) + + # select with two columns + expect_identical( + septic_patients[1:10,] %>% + pull(mo), + septic_patients[1:10,] %>% + left_join_microorganisms() %>% + select(genus, species) %>% + as.mo() %>% + as.character()) + + # unknown results + expect_warning(as.mo(c("INVALID", "Yeah, unknown"))) + + # too many columns + expect_error(septic_patients %>% select(1:3) %>% as.mo()) + + # print + expect_output(print(as.mo(c("ESCCOL", NA)))) + + # helper function + expect_identical(as.mo("ESCCOL"), + guess_mo("ESCCOL")) + + # test pull + expect_equal(nrow(septic_patients %>% mutate(mo = as.mo(mo))), + 2000) + + # test data.frame + expect_equal(nrow(data.frame(test = as.mo("ESCCOL"))), + 1) + + # check empty values + expect_equal(as.character(suppressWarnings(as.mo(""))), + NA_character_) + +}) diff --git a/tests/testthat/test-portion.R b/tests/testthat/test-portion.R index d5edcd72..b39481bd 100755 --- a/tests/testthat/test-portion.R +++ b/tests/testthat/test-portion.R @@ -122,7 +122,7 @@ test_that("old rsi works", { test_that("prediction of rsi works", { amox_R <- septic_patients %>% - filter(bactid == "ESCCOL") %>% + filter(mo == "ESCCOL") %>% rsi_predict(col_ab = "amox", col_date = "date", minimum = 10, @@ -131,37 +131,37 @@ test_that("prediction of rsi works", { # amox resistance will increase according to data set `septic_patients` expect_true(amox_R[3] < amox_R[20]) - expect_output(rsi_predict(tbl = filter(septic_patients, bactid == "ESCCOL"), + expect_output(rsi_predict(tbl = filter(septic_patients, mo == "ESCCOL"), model = "binomial", col_ab = "amox", col_date = "date", info = TRUE)) - expect_output(rsi_predict(tbl = filter(septic_patients, bactid == "ESCCOL"), + expect_output(rsi_predict(tbl = filter(septic_patients, mo == "ESCCOL"), model = "loglin", col_ab = "amox", col_date = "date", info = TRUE)) - expect_output(rsi_predict(tbl = filter(septic_patients, bactid == "ESCCOL"), + expect_output(rsi_predict(tbl = filter(septic_patients, mo == "ESCCOL"), model = "lin", col_ab = "amox", col_date = "date", info = TRUE)) - expect_error(rsi_predict(tbl = filter(septic_patients, bactid == "ESCCOL"), + expect_error(rsi_predict(tbl = filter(septic_patients, mo == "ESCCOL"), model = "INVALID MODEL", col_ab = "amox", col_date = "date", info = TRUE)) - expect_error(rsi_predict(tbl = filter(septic_patients, bactid == "ESCCOL"), + expect_error(rsi_predict(tbl = filter(septic_patients, mo == "ESCCOL"), col_ab = "NOT EXISTING COLUMN", col_date = "date", info = TRUE)) - expect_error(rsi_predict(tbl = filter(septic_patients, bactid == "ESCCOL"), + expect_error(rsi_predict(tbl = filter(septic_patients, mo == "ESCCOL"), col_ab = "amox", col_date = "NOT EXISTING COLUMN", info = TRUE)) # almost all E. coli are mero S in the Netherlands :) - expect_error(resistance_predict(tbl = filter(septic_patients, bactid == "ESCCOL"), + expect_error(resistance_predict(tbl = filter(septic_patients, mo == "ESCCOL"), col_ab = "mero", col_date = "date", info = TRUE))