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 645475da..094dc216 100755 Binary files a/data/microorganisms.rda and b/data/microorganisms.rda differ diff --git a/data/microorganisms.umcg.rda b/data/microorganisms.umcg.rda index 770ad7ef..5f43db47 100755 Binary files a/data/microorganisms.umcg.rda and b/data/microorganisms.umcg.rda differ diff --git a/data/septic_patients.rda b/data/septic_patients.rda index aa113de2..d951f4ee 100755 Binary files a/data/septic_patients.rda and b/data/septic_patients.rda differ diff --git a/man/AMR-deprecated.Rd b/man/AMR-deprecated.Rd new file mode 100644 index 00000000..85a24ded --- /dev/null +++ b/man/AMR-deprecated.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/deprecated.R +\name{AMR-deprecated} +\alias{AMR-deprecated} +\alias{as.bactid} +\alias{is.bactid} +\alias{guess_bactid} +\alias{ratio} +\title{Deprecated functions} +\usage{ +as.bactid(...) + +is.bactid(...) + +guess_bactid(...) + +ratio(x, ratio) +} +\description{ +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. +} +\keyword{internal} diff --git a/man/EUCAST.Rd b/man/EUCAST.Rd index ef87adf3..0ffdabbc 100755 --- a/man/EUCAST.Rd +++ b/man/EUCAST.Rd @@ -13,7 +13,7 @@ EUCAST Expert Rules Version 2.0: \cr \url{http://www.eucast.org/fileadmin/src/media/PDFs/EUCAST_files/Expert_Rules/Expert_rules_intrinsic_exceptional_V3.1.pdf} } \usage{ -EUCAST_rules(tbl, col_bactid = "bactid", info = TRUE, amcl = "amcl", +EUCAST_rules(tbl, col_mo = "mo", info = TRUE, amcl = "amcl", amik = "amik", amox = "amox", ampi = "ampi", azit = "azit", azlo = "azlo", aztr = "aztr", cefa = "cefa", cfep = "cfep", cfot = "cfot", cfox = "cfox", cfra = "cfra", cfta = "cfta", @@ -28,18 +28,21 @@ EUCAST_rules(tbl, col_bactid = "bactid", info = TRUE, amcl = "amcl", peni = "peni", pita = "pita", poly = "poly", pris = "pris", qida = "qida", rifa = "rifa", roxi = "roxi", siso = "siso", teic = "teic", tetr = "tetr", tica = "tica", tige = "tige", - tobr = "tobr", trim = "trim", trsu = "trsu", vanc = "vanc") + tobr = "tobr", trim = "trim", trsu = "trsu", vanc = "vanc", + col_bactid = "bactid") interpretive_reading(...) } \arguments{ \item{tbl}{table with antibiotic columns, like e.g. \code{amox} and \code{amcl}} -\item{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}}} +\item{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}}} \item{info}{print progress} -\item{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.} +\item{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.} + +\item{col_bactid}{Deprecated. Use \code{col_mo} instead.} \item{...}{parameters that are passed on to \code{EUCAST_rules}} } @@ -49,7 +52,7 @@ table with edited variables of antibiotics. \description{ Apply expert rules (like intrinsic resistance), as defined by the European Committee on Antimicrobial Susceptibility Testing (EUCAST, \url{http://eucast.org}), see \emph{Source}. } -\section{Abbrevations of antibiotics}{ +\section{Antibiotics}{ Abbrevations of the column containing antibiotics: @@ -118,16 +121,16 @@ Abbrevations of the column containing antibiotics: \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 diff --git a/man/MDRO.Rd b/man/MDRO.Rd index 27012851..75b05407 100755 --- a/man/MDRO.Rd +++ b/man/MDRO.Rd @@ -7,7 +7,7 @@ \alias{EUCAST_exceptional_phenotypes} \title{Determine multidrug-resistant organisms (MDRO)} \usage{ -MDRO(tbl, country = NULL, col_bactid = "bactid", info = TRUE, +MDRO(tbl, country = NULL, col_mo = "mo", info = TRUE, amcl = "amcl", amik = "amik", amox = "amox", ampi = "ampi", azit = "azit", aztr = "aztr", cefa = "cefa", cfra = "cfra", cfep = "cfep", cfot = "cfot", cfox = "cfox", cfta = "cfta", @@ -22,7 +22,8 @@ MDRO(tbl, country = NULL, col_bactid = "bactid", info = TRUE, peni = "peni", pita = "pita", poly = "poly", qida = "qida", rifa = "rifa", roxi = "roxi", siso = "siso", teic = "teic", tetr = "tetr", tica = "tica", tige = "tige", tobr = "tobr", - trim = "trim", trsu = "trsu", vanc = "vanc") + trim = "trim", trsu = "trsu", vanc = "vanc", + col_bactid = "bactid") BRMO(tbl, country = "nl", ...) @@ -35,11 +36,129 @@ EUCAST_exceptional_phenotypes(tbl, country = "EUCAST", ...) \item{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).} -\item{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}}} +\item{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}}} \item{info}{print progress} -\item{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} +\item{amcl}{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.} + +\item{amik}{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.} + +\item{amox}{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.} + +\item{ampi}{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.} + +\item{azit}{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.} + +\item{aztr}{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.} + +\item{cefa}{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.} + +\item{cfra}{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.} + +\item{cfep}{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.} + +\item{cfot}{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.} + +\item{cfox}{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.} + +\item{cfta}{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.} + +\item{cftr}{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.} + +\item{cfur}{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.} + +\item{chlo}{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.} + +\item{cipr}{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.} + +\item{clar}{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.} + +\item{clin}{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.} + +\item{clox}{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.} + +\item{coli}{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.} + +\item{czol}{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.} + +\item{dapt}{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.} + +\item{doxy}{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.} + +\item{erta}{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.} + +\item{eryt}{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.} + +\item{fosf}{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.} + +\item{fusi}{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.} + +\item{gent}{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.} + +\item{imip}{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.} + +\item{kana}{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.} + +\item{levo}{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.} + +\item{linc}{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.} + +\item{line}{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.} + +\item{mero}{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.} + +\item{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.} + +\item{mino}{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.} + +\item{moxi}{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.} + +\item{nali}{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.} + +\item{neom}{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.} + +\item{neti}{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.} + +\item{nitr}{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.} + +\item{novo}{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.} + +\item{norf}{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.} + +\item{oflo}{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.} + +\item{peni}{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.} + +\item{pita}{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.} + +\item{poly}{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.} + +\item{qida}{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.} + +\item{rifa}{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.} + +\item{roxi}{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.} + +\item{siso}{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.} + +\item{teic}{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.} + +\item{tetr}{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.} + +\item{tica}{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.} + +\item{tige}{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.} + +\item{tobr}{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.} + +\item{trim}{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.} + +\item{trsu}{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.} + +\item{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.} + +\item{col_bactid}{Deprecated. Use \code{col_mo} instead.} \item{...}{parameters that are passed on to methods} } @@ -52,10 +171,77 @@ Determine which isolates are multidrug-resistant organisms (MDRO) according to c \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}). } +\section{Antibiotics}{ + +Abbrevations of the column containing antibiotics: + + \strong{amcl}: amoxicillin and beta-lactamase inhibitor (\emph{J01CR02}), + \strong{amik}: amikacin (\emph{J01GB06}), + \strong{amox}: amoxicillin (\emph{J01CA04}), + \strong{ampi}: ampicillin (\emph{J01CA01}), + \strong{azit}: azithromycin (\emph{J01FA10}), + \strong{azlo}: azlocillin (\emph{J01CA09}), + \strong{aztr}: aztreonam (\emph{J01DF01}), + \strong{cefa}: cefaloridine (\emph{J01DB02}), + \strong{cfep}: cefepime (\emph{J01DE01}), + \strong{cfot}: cefotaxime (\emph{J01DD01}), + \strong{cfox}: cefoxitin (\emph{J01DC01}), + \strong{cfra}: cefradine (\emph{J01DB09}), + \strong{cfta}: ceftazidime (\emph{J01DD02}), + \strong{cftr}: ceftriaxone (\emph{J01DD04}), + \strong{cfur}: cefuroxime (\emph{J01DC02}), + \strong{chlo}: chloramphenicol (\emph{J01BA01}), + \strong{cipr}: ciprofloxacin (\emph{J01MA02}), + \strong{clar}: clarithromycin (\emph{J01FA09}), + \strong{clin}: clindamycin (\emph{J01FF01}), + \strong{clox}: flucloxacillin (\emph{J01CF05}), + \strong{coli}: colistin (\emph{J01XB01}), + \strong{czol}: cefazolin (\emph{J01DB04}), + \strong{dapt}: daptomycin (\emph{J01XX09}), + \strong{doxy}: doxycycline (\emph{J01AA02}), + \strong{erta}: ertapenem (\emph{J01DH03}), + \strong{eryt}: erythromycin (\emph{J01FA01}), + \strong{fosf}: fosfomycin (\emph{J01XX01}), + \strong{fusi}: fusidic acid (\emph{J01XC01}), + \strong{gent}: gentamicin (\emph{J01GB03}), + \strong{imip}: imipenem and cilastatin (\emph{J01DH51}), + \strong{kana}: kanamycin (\emph{J01GB04}), + \strong{levo}: levofloxacin (\emph{J01MA12}), + \strong{linc}: lincomycin (\emph{J01FF02}), + \strong{line}: linezolid (\emph{J01XX08}), + \strong{mero}: meropenem (\emph{J01DH02}), + \strong{mezl}: mezlocillin (\emph{J01CA10}), + \strong{mino}: minocycline (\emph{J01AA08}), + \strong{moxi}: moxifloxacin (\emph{J01MA14}), + \strong{nali}: nalidixic acid (\emph{J01MB02}), + \strong{neom}: neomycin (\emph{J01GB05}), + \strong{neti}: netilmicin (\emph{J01GB07}), + \strong{nitr}: nitrofurantoin (\emph{J01XE01}), + \strong{norf}: norfloxacin (\emph{J01MA06}), + \strong{novo}: novobiocin (an ATCvet code: \emph{QJ01XX95}), + \strong{oflo}: ofloxacin (\emph{J01MA01}), + \strong{peni}: penicillins, combinations with other antibacterials (\emph{J01RA01}), + \strong{pita}: piperacillin and beta-lactamase inhibitor (\emph{J01CR05}), + \strong{poly}: polymyxin B (\emph{J01XB02}), + \strong{pris}: pristinamycin (\emph{J01FG01}), + \strong{qida}: quinupristin/dalfopristin (\emph{J01FG02}), + \strong{rifa}: rifampicin (\emph{J04AB02}), + \strong{roxi}: roxithromycin (\emph{J01FA06}), + \strong{siso}: sisomicin (\emph{J01GB08}), + \strong{teic}: teicoplanin (\emph{J01XA02}), + \strong{tetr}: tetracycline (\emph{J01AA07}), + \strong{tica}: ticarcillin (\emph{J01CA13}), + \strong{tige}: tigecycline (\emph{J01AA12}), + \strong{tobr}: tobramycin (\emph{J01GB01}), + \strong{trim}: trimethoprim (\emph{J01EA01}), + \strong{trsu}: sulfamethoxazole and trimethoprim (\emph{J01EE01}), + \strong{vanc}: vancomycin (\emph{J01XA01}). +} + \examples{ library(dplyr) septic_patients \%>\% 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))