diff --git a/.travis.yml b/.travis.yml index 468cc477..8a1ef087 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,2 +1,21 @@ +# R for travis: see documentation at https://docs.travis-ci.com/user/languages/r + language: r cache: packages + +r: + - 3.0 + +r_packages: + - covr + +after_success: + - Rscript -e 'covr::codecov()' + +notifications: + email: + recipients: + - m.s.berends@umcg.nl + - c.f.luz@umcg.nl + on_success: change + on_failure: always diff --git a/DESCRIPTION b/DESCRIPTION index aae2c276..d82324d9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,13 +1,14 @@ Package: AMR -Version: 0.1.1 -Date: 2018-03-13 +Version: 0.1.2 +Date: 2018-03-19 Title: Antimicrobial Resistance Analysis Authors@R: c( person( given = c("Matthijs", "S."), family = "Berends", email = "m.s.berends@umcg.nl", - role = c("aut", "cre")), + role = c("aut", "cre"), + comment = c(ORCID = "0000-0001-7620-1800")), person( given = c("Christian", "F."), family = "Luz", diff --git a/NAMESPACE b/NAMESPACE index f87e4384..7a2bb5b8 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -19,6 +19,7 @@ export(as.rsi) export(atc_property) export(first_isolate) export(full_join_bactlist) +export(guess_bactid) export(inner_join_bactlist) export(interpretive_reading) export(is.mic) diff --git a/NEWS b/NEWS index f80f18eb..677d1a39 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +## 0.1.2 +- Added new function `guess_bactid` to determine the ID of a microorganism based on genus/species +- Renamed `ablist` to `antibiotics` +- Added support for character vector in join functions +- Altered `%like%` to make it case insensitive + ## 0.1.1 - `EUCAST_rules` applies for amoxicillin even if ampicillin is missing - Edited column names to comply with GLIMS, the laboratory information system diff --git a/R/atc.R b/R/atc.R index c309ea17..b03032db 100644 --- a/R/atc.R +++ b/R/atc.R @@ -127,13 +127,13 @@ atc_property <- function(atc_code, #' Name of an antibiotic #' -#' Convert antibiotic codes (from a laboratory information system like MOLIS or GLIMS) to a (trivial) antibiotic name or ATC code, or vice versa. This uses the data from \code{\link{ablist}}. +#' Convert antibiotic codes (from a laboratory information system like MOLIS or GLIMS) to a (trivial) antibiotic name or ATC code, or vice versa. This uses the data from \code{\link{antibiotics}}. #' @param abcode a code or name, like \code{"AMOX"}, \code{"AMCL"} or \code{"J01CA04"} -#' @param from,to type to transform from and to. See \code{\link{ablist}} for its column names. +#' @param from,to type to transform from and to. See \code{\link{antibiotics}} for its column names. #' @param textbetween text to put between multiple returned texts #' @param tolower return output as lower case with function \code{\link{tolower}}. #' @keywords ab antibiotics -#' @source \code{\link{ablist}} +#' @source \code{\link{antibiotics}} #' @export #' @importFrom dplyr %>% filter select slice #' @examples @@ -156,15 +156,15 @@ atc_property <- function(atc_code, #' # "AMCL" abname <- function(abcode, from = 'umcg', to = 'official', textbetween = ' + ', tolower = FALSE) { - ablist <- AMR::ablist - colnames(ablist) <- colnames(ablist) %>% tolower() + antibiotics <- AMR::antibiotics + colnames(antibiotics) <- colnames(antibiotics) %>% tolower() from <- from %>% tolower() to <- to %>% tolower() - if (!from %in% colnames(ablist) | - !to %in% colnames(ablist)) { + if (!from %in% colnames(antibiotics) | + !to %in% colnames(antibiotics)) { stop(paste0('Invalid `from` or `to`. Choose one of ', - colnames(ablist) %>% paste(collapse = ","), '.'), call. = FALSE) + colnames(antibiotics) %>% paste(collapse = ","), '.'), call. = FALSE) } abcode <- as.character(abcode) @@ -173,9 +173,9 @@ abname <- function(abcode, from = 'umcg', to = 'official', textbetween = ' + ', drug <- abcode[i] if (!grepl('+', drug, fixed = TRUE) & !grepl(' en ', drug, fixed = TRUE)) { # bestaat maar uit 1 middel - if (any(ablist[, from] == drug)) { + if (any(antibiotics[, from] == drug)) { abcode[i] <- - ablist %>% + antibiotics %>% filter(.[, from] == drug) %>% select(to) %>% slice(1) %>% @@ -205,7 +205,7 @@ abname <- function(abcode, from = 'umcg', to = 'official', textbetween = ' + ', for (j in 1:length(drug.group)) { drug.group[j] <- - ablist %>% + antibiotics %>% filter(.[, from] == drug.group[j]) %>% select(to) %>% slice(1) %>% diff --git a/R/data.R b/R/data.R index 915f7566..5dfb1ca0 100644 --- a/R/data.R +++ b/R/data.R @@ -18,36 +18,53 @@ #' Dataset with 420 antibiotics #' -#' A dataset containing all antibiotics with a J0 code, with their DDD's. -#' @format A data.frame with 420 observations and 12 variables: +#' A dataset containing all antibiotics with a J0 code, with their DDD's. Properties were downloaded from the WHO, see Source. +#' @format A data.frame with 420 observations and 16 variables: #' \describe{ #' \item{\code{atc}}{ATC code, like \code{J01CR02}} #' \item{\code{molis}}{MOLIS code, like \code{amcl}} #' \item{\code{umcg}}{UMCG code, like \code{AMCL}} -#' \item{\code{official}}{Official name by the WHO, like \code{"amoxicillin and enzyme inhibitor"}} +#' \item{\code{official}}{Official name by the WHO, like \code{"Amoxicillin and enzyme inhibitor"}} #' \item{\code{official_nl}}{Official name in the Netherlands, like \code{"Amoxicilline met enzymremmer"}} #' \item{\code{trivial_nl}}{Trivial name in Dutch, like \code{"Amoxicilline/clavulaanzuur"}} -#' \item{\code{oral_ddd}}{Defined Daily Dose (DDD) according to the WHO, oral treatment} +#' \item{\code{oral_ddd}}{Defined Daily Dose (DDD), oral treatment} #' \item{\code{oral_units}}{Units of \code{ddd_units}} -#' \item{\code{iv_ddd}}{Defined Daily Dose (DDD) according to the WHO, parenteral treatment} +#' \item{\code{iv_ddd}}{Defined Daily Dose (DDD), parenteral treatment} #' \item{\code{iv_units}}{Units of \code{iv_ddd}} -#' \item{\code{atc_group1}}{ATC group in Dutch, like \code{"Macroliden, lincosamiden en streptograminen"}} -#' \item{\code{atc_group2}}{Subgroup of \code{atc_group1} in Dutch, like \code{"Macroliden"}} +#' \item{\code{atc_group1}}{ATC group, like \code{"Macrolides, lincosamides and streptogramins"}} +#' \item{\code{atc_group2}}{Subgroup of \code{atc_group1}, like \code{"Macrolides"}} +#' \item{\code{atc_group1_nl}}{ATC group in Dutch, like \code{"Macroliden, lincosamiden en streptograminen"}} +#' \item{\code{atc_group2_nl}}{Subgroup of \code{atc_group1} in Dutch, like \code{"Macroliden"}} +#' \item{\code{useful_gramnegative}}{\code{FALSE} if not useful according to EUCAST, \code{NA} otherwise (see Source)} +#' \item{\code{useful_grampositive}}{\code{FALSE} if not useful according to EUCAST, \code{NA} otherwise (see Source)} #' } -#' @source MOLIS (LIS of Certe) - \url{https://www.certe.nl} \cr \cr GLIMS (LIS of UMCG) - \url{https://www.umcg.nl} \cr \cr World Health Organization - \url{https://www.whocc.no/atc_ddd_index/} +#' @source - World Health Organization: \url{https://www.whocc.no/atc_ddd_index/} \cr - EUCAST - Expert rules intrinsic exceptional V3.1 \cr - MOLIS (LIS of Certe): \url{https://www.certe.nl} \cr - GLIMS (LIS of UMCG): \url{https://www.umcg.nl} #' @seealso \code{\link{bactlist}} -# todo: -# ablist <- ablist %>% mutate(useful_gramnegative = if_else(atc_group2 == 'Tetracyclines', FALSE, TRUE)) -# ablist <- ablist %>% mutate(useful_gramnegative = if_else(atc_group2 %like% 'Glycopept', FALSE, useful_gramnegative)) -# Tbl1 Enterobacteriaceae are also intrinsically resistant to benzylpenicillin, glycopeptides, fusidic acid, macrolides (with some exceptions1), lincosamides, streptogramins, rifampicin, daptomycin and linezolid. -# Tbl2 Non-fermentative Gram-negative bacteria are also generally intrinsically resistant to benzylpenicillin, first and second generation cephalosporins, glycopeptides, fusidic acid, macrolides, lincosamides, streptogramins, rifampicin, daptomycin and linezolid -# Tbl3 Gram-negative bacteria other than Enterobacteriaceae and non-fermentative Gram-negative bacteria listed are also intrinsically resistant to glycopeptides, lincosamides, daptomycin and linezolid. -"ablist" +# last two columns created with: +# antibiotics %>% +# mutate(useful_gramnegative = +# if_else( +# atc_group1 %like% '(fusidic|glycopeptide|macrolide|lincosamide|daptomycin|linezolid)' | +# atc_group2 %like% '(fusidic|glycopeptide|macrolide|lincosamide|daptomycin|linezolid)' | +# official %like% '(fusidic|glycopeptide|macrolide|lincosamide|daptomycin|linezolid)', +# FALSE, +# NA +# ), +# useful_grampositive = +# if_else( +# atc_group1 %like% '(aztreonam|temocillin|polymyxin|colistin|nalidixic)' | +# atc_group2 %like% '(aztreonam|temocillin|polymyxin|colistin|nalidixic)' | +# official %like% '(aztreonam|temocillin|polymyxin|colistin|nalidixic)', +# FALSE, +# NA +# ) +# ) +"antibiotics" #' Dataset with ~2500 microorganisms #' #' A dataset containing all microorganisms of MOLIS. MO codes of the UMCG can be looked up using \code{\link{bactlist.umcg}}. -#' @format A data.frame with 2507 observations and 10 variables: +#' @format A data.frame with 2507 observations and 12 variables: #' \describe{ #' \item{\code{bactid}}{ID of microorganism} #' \item{\code{bactsys}}{Bactsyscode of microorganism} @@ -56,12 +73,14 @@ #' \item{\code{species}}{Species name of microorganism, like \code{"coli"}} #' \item{\code{subspecies}}{Subspecies name of bio-/serovar of microorganism, like \code{"EHEC"}} #' \item{\code{fullname}}{Full name, like \code{"Echerichia coli (EHEC)"}} -#' \item{\code{type}}{Type of microorganism in Dutch, like \code{"Bacterie"} and \code{"Schimmel/gist"}} -#' \item{\code{gramstain}}{Gram of microorganism in Dutch, like \code{"Negatieve staven"}} -#' \item{\code{aerobic}}{Type aerobe/anaerobe of bacteria} +#' \item{\code{type}}{Type of microorganism, like \code{"Bacteria"} and \code{"Fungus/yeast"}} +#' \item{\code{gramstain}}{Gram of microorganism, like \code{"Negative rods"}} +#' \item{\code{aerobic}}{Logical whether bacteria is aerobic} +#' \item{\code{type_nl}}{Type of microorganism in Dutch, like \code{"Bacterie"} and \code{"Schimmel/gist"}} +#' \item{\code{gramstain_nl}}{Gram of microorganism in Dutch, like \code{"Negatieve staven"}} #' } #' @source MOLIS (LIS of Certe) - \url{https://www.certe.nl} -#' @seealso \code{\link{ablist}} \code{\link{bactlist.umcg}} +#' @seealso \code{\link{guess_bactid}} \code{\link{antibiotics}} \code{\link{bactlist.umcg}} "bactlist" #' Translation table for UMCG with ~1100 microorganisms @@ -90,7 +109,7 @@ #' \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{bactlist}}} -#' \item{\code{peni:mupi}}{38 different antibiotics with class \code{rsi} (see \code{\link{as.rsi}}), these column names occur in \code{\link{ablist}} and can be translated with \code{\link{abname}}} +#' \item{\code{peni:mupi}}{38 different antibiotics with class \code{rsi} (see \code{\link{as.rsi}}), these column names occur in \code{\link{antibiotics}} and can be translated with \code{\link{abname}}} #' } #' @source MOLIS (LIS of Certe) - \url{https://www.certe.nl} -"septic_patients" \ No newline at end of file +"septic_patients" diff --git a/R/first_isolates.R b/R/first_isolates.R index cc510e1e..f2de99f8 100644 --- a/R/first_isolates.R +++ b/R/first_isolates.R @@ -357,7 +357,7 @@ first_isolate <- function(tbl, #' @export #' @importFrom dplyr %>% mutate if_else #' @return Character of length 1. -#' @seealso \code{\link{mo_property}} \code{\link{ablist}} +#' @seealso \code{\link{mo_property}} \code{\link{antibiotics}} #' @examples #' \donttest{ #' #' # set key antibiotics to a new variable @@ -403,7 +403,7 @@ key_antibiotics <- function(tbl, } } - # bactlist aan vastknopen + # join bactlist tbl <- tbl %>% left_join_bactlist(col_bactcode) tbl$key_ab <- NA_character_ @@ -422,7 +422,7 @@ key_antibiotics <- function(tbl, list_ab <- c(peni, amox, teic, vanc, clin, line, clar, trsu) list_ab <- list_ab[list_ab %in% colnames(tbl)] tbl <- tbl %>% mutate(key_ab = - if_else(gramstain %like% '^Positi[e]?ve', + if_else(gramstain %like% '^Positive ', apply(X = tbl[, list_ab], MARGIN = 1, FUN = function(x) paste(x, collapse = "")), @@ -432,7 +432,7 @@ key_antibiotics <- function(tbl, list_ab <- c(amox, amcl, pita, cfur, cfot, cfta, cftr, mero, cipr, trsu, gent) list_ab <- list_ab[list_ab %in% colnames(tbl)] tbl <- tbl %>% mutate(key_ab = - if_else(gramstain %like% '^Negati[e]?ve', + if_else(gramstain %like% '^Negative ', apply(X = tbl[, list_ab], MARGIN = 1, FUN = function(x) paste(x, collapse = "")), @@ -502,3 +502,95 @@ key_antibiotics_equal <- function(x, y, points_threshold = 2, info = FALSE) { } result } + +#' Find bacteria ID based on genus/species +#' +#' Use this function to determine a valid ID based on a genus (and species). This input could be a full name (like \code{"Staphylococcus aureus"}), an abbreviated name (like \code{"S. aureus"}), or just a genus. You could also use a \code{\link{paste}} of a genus and species column to use the full name as input: \code{x = paste(df$genus, df$species)}, where \code{df} is your dataframe. +#' @param x character vector to determine \code{bactid} +#' @export +#' @importFrom dplyr %>% filter slice pull +#' @return Character (vector). +#' @seealso \code{\link{bactlist}} for the dataframe that is being used to determine ID's. +#' @examples +#' # These examples all return "STAAUR", the ID of S. aureus: +#' 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 <- function(x) { + # remove dots and other non-text in case of "E. coli" except spaces + x <- gsub("[^a-zA-Z ]+", "", x) + x.bak <- x + # replace space by regex sign + x <- gsub(" ", ".*", x, fixed = TRUE) + # add start and stop + x_species <- paste(x, 'species') + x <- paste0('^', x, '$') + + for (i in 1:length(x)) { + if (tolower(x[i]) == '^e.*coli$') { + # avoid detection of Entamoeba coli in case of Escherichia coli + x[i] <- 'Escherichia coli' + } + if (tolower(x[i]) == '^st.*au$' + | tolower(x[i]) == '^stau$' + | tolower(x[i]) == '^staaur$') { + # avoid detection of Staphylococcus auricularis in case of S. aureus + x[i] <- 'Staphylococcus aureus' + } + if (tolower(x[i]) == '^p.*aer$') { + # avoid detection of Pasteurella aerogenes in case of Pseudomonas aeruginosa + x[i] <- 'Pseudomonas aeruginosa' + } + # translate known trivial names to genus+species + if (toupper(x.bak[i]) == 'MRSA' + | toupper(x.bak[i]) == 'VISA' + | toupper(x.bak[i]) == 'VRSA') { + x[i] <- 'Staphylococcus aureus' + } + if (toupper(x.bak[i]) == 'MRSE') { + x[i] <- 'Staphylococcus epidermidis' + } + if (toupper(x.bak[i]) == 'VRE') { + x[i] <- 'Enterococcus' + } + + # let's try the ID's first + found <- AMR::bactlist %>% filter(bactid == x.bak[i]) + + if (nrow(found) == 0) { + # now try exact match + found <- AMR::bactlist %>% filter(fullname == x[i]) + } + if (nrow(found) == 0) { + # try any match + found <- AMR::bactlist %>% filter(fullname %like% x[i]) + } + if (nrow(found) == 0) { + # try only genus, with 'species' attached + found <- AMR::bactlist %>% filter(fullname %like% x_species[i]) + } + if (nrow(found) == 0) { + # try splitting of characters and then find ID + # like esco = E. coli, klpn = K. pneumoniae, stau = S. aureus + x_length <- nchar(x.bak[i]) + x[i] <- paste0(x.bak[i] %>% substr(1, x_length / 2) %>% trimws(), + '.* ', + x.bak[i] %>% substr((x_length / 2) + 1, x_length) %>% trimws()) + found <- AMR::bactlist %>% filter(fullname %like% paste0('^', x[i])) + } + + if (nrow(found) != 0) { + x[i] <- found %>% + slice(1) %>% + pull(bactid) + } else { + x[i] <- "" + } + } + x +} diff --git a/R/globals.R b/R/globals.R index 1ce289ab..ece183b2 100644 --- a/R/globals.R +++ b/R/globals.R @@ -23,6 +23,7 @@ globalVariables(c('.', 'date_lab', 'days_diff', 'first_isolate_row_index', + 'fullname', 'genus', 'gramstain', 'key_ab', diff --git a/R/join.R b/R/join.R index 294b875d..cce29b18 100644 --- a/R/join.R +++ b/R/join.R @@ -4,23 +4,28 @@ #' @rdname join #' @name join #' @aliases join inner_join -#' @param x existing table to 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{bactlist$bactid} (like \code{by = "bacteria_id"}), or another column in \code{\link{bactlist}} (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}, 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. +#' @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. #' @export #' @examples +#' left_join_bactlist("STAAUR") +#' #' df <- data.frame(date = seq(from = as.Date("2018-01-01"), #' to = as.Date("2018-01-07"), #' by = 1), #' bacteria_id = c("STAAUR", "STAAUR", "STAAUR", "STAAUR", #' "ESCCOL", "ESCCOL", "ESCCOL"), #' stringsAsFactors = FALSE) -#' #' colnames(df) #' df2 <- left_join_bactlist(df, "bacteria_id") #' colnames(df2) -inner_join_bactlist <- function(x, by = 'bactid', ...) { +inner_join_bactlist <- function(x, by = 'bactid', suffix = c("2", ""), ...) { + if (any(class(x) %in% c('character', 'factor'))) { + x <- data.frame(bactid = x, stringsAsFactors = FALSE) + } # no name set to `by` parameter if (is.null(names(by))) { joinby <- colnames(AMR::bactlist)[1] @@ -37,7 +42,10 @@ inner_join_bactlist <- function(x, by = 'bactid', ...) { #' @rdname join #' @export -left_join_bactlist <- function(x, by = 'bactid', ...) { +left_join_bactlist <- function(x, by = 'bactid', suffix = c("2", ""), ...) { + if (any(class(x) %in% c('character', 'factor'))) { + x <- data.frame(bactid = x, stringsAsFactors = FALSE) + } # no name set to `by` parameter if (is.null(names(by))) { joinby <- colnames(AMR::bactlist)[1] @@ -54,7 +62,10 @@ left_join_bactlist <- function(x, by = 'bactid', ...) { #' @rdname join #' @export -right_join_bactlist <- function(x, by = 'bactid', ...) { +right_join_bactlist <- function(x, by = 'bactid', suffix = c("2", ""), ...) { + if (any(class(x) %in% c('character', 'factor'))) { + x <- data.frame(bactid = x, stringsAsFactors = FALSE) + } # no name set to `by` parameter if (is.null(names(by))) { joinby <- colnames(AMR::bactlist)[1] @@ -71,7 +82,10 @@ right_join_bactlist <- function(x, by = 'bactid', ...) { #' @rdname join #' @export -full_join_bactlist <- function(x, by = 'bactid', ...) { +full_join_bactlist <- function(x, by = 'bactid', suffix = c("2", ""), ...) { + if (any(class(x) %in% c('character', 'factor'))) { + x <- data.frame(bactid = x, stringsAsFactors = FALSE) + } # no name set to `by` parameter if (is.null(names(by))) { joinby <- colnames(AMR::bactlist)[1] @@ -85,6 +99,9 @@ full_join_bactlist <- function(x, by = 'bactid', ...) { #' @rdname join #' @export semi_join_bactlist <- function(x, by = 'bactid', ...) { + if (any(class(x) %in% c('character', 'factor'))) { + x <- data.frame(bactid = x, stringsAsFactors = FALSE) + } # no name set to `by` parameter if (is.null(names(by))) { joinby <- colnames(AMR::bactlist)[1] @@ -98,6 +115,9 @@ semi_join_bactlist <- function(x, by = 'bactid', ...) { #' @rdname join #' @export anti_join_bactlist <- function(x, by = 'bactid', ...) { + if (any(class(x) %in% c('character', 'factor'))) { + x <- data.frame(bactid = x, stringsAsFactors = FALSE) + } # no name set to `by` parameter if (is.null(names(by))) { joinby <- colnames(AMR::bactlist)[1] diff --git a/R/misc.R b/R/misc.R index ff4b3afa..8d14b600 100644 --- a/R/misc.R +++ b/R/misc.R @@ -19,17 +19,20 @@ # No export, no Rd "%like%" <- function(vector, pattern) { # Source: https://github.com/Rdatatable/data.table/blob/master/R/like.R + # But made it case insensitive if (is.factor(vector)) { - as.integer(vector) %in% grep(pattern, levels(vector)) + as.integer(vector) %in% grep(pattern, levels(vector), ignore.case = TRUE) } else { - grepl(pattern, vector) + grepl(pattern, vector, ignore.case = TRUE) } } +# No export, no Rd percent <- function(x, round = 1, ...) { base::paste0(base::round(x * 100, digits = round), "%") } +# No export, no Rd quasiquotate <- function(deparsed, parsed) { # when text: remove first and last " if (any(deparsed %like% '^".+"$' | deparsed %like% "^'.+'$")) { @@ -46,4 +49,4 @@ quasiquotate <- function(deparsed, parsed) { } else { parsed } -} \ No newline at end of file +} diff --git a/README.md b/README.md index b896be2a..9ab9f67b 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ This package is available on CRAN and also here on GitHub. ### From GitHub (latest development version) [![Travis_Build](https://travis-ci.org/msberends/AMR.svg?branch=master)](https://travis-ci.org/msberends/AMR) -[![Since_Release](https://img.shields.io/github/commits-since/msberends/AMR/latest.svg?colorB=3679BC)](https://github.com/msberends/AMR/releases) +[![Since_Release](https://img.shields.io/github/commits-since/msberends/AMR/latest.svg?colorB=3679BC)](https://github.com/msberends/AMR/commits/master) [![Last_Commit](https://img.shields.io/github/last-commit/msberends/AMR.svg?colorB=3679BC)](https://github.com/msberends/AMR/commits/master) ```r @@ -116,7 +116,14 @@ A plot of `rsi_data`: plot(rsi_data) ``` -![example](man/figures/rsi_example.png) +![example1](man/figures/rsi_example.png) + +A plot of `mic_data` (defaults to bar plot): +```r +plot(mic_data) +``` + +![example2](man/figures/mic_example.png) Other epidemiological functions: diff --git a/data/ablist.rda b/data/ablist.rda deleted file mode 100644 index c0f2b9db..00000000 Binary files a/data/ablist.rda and /dev/null differ diff --git a/data/antibiotics.rda b/data/antibiotics.rda new file mode 100644 index 00000000..3884040e Binary files /dev/null and b/data/antibiotics.rda differ diff --git a/data/bactlist.rda b/data/bactlist.rda index 069d2f5a..743672e9 100644 Binary files a/data/bactlist.rda and b/data/bactlist.rda differ diff --git a/man/ablist.Rd b/man/ablist.Rd deleted file mode 100644 index ed3ba3bc..00000000 --- a/man/ablist.Rd +++ /dev/null @@ -1,34 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/data.R -\docType{data} -\name{ablist} -\alias{ablist} -\title{Dataset with 420 antibiotics} -\format{A data.frame with 420 observations and 12 variables: -\describe{ - \item{\code{atc}}{ATC code, like \code{J01CR02}} - \item{\code{molis}}{MOLIS code, like \code{amcl}} - \item{\code{umcg}}{UMCG code, like \code{AMCL}} - \item{\code{official}}{Official name by the WHO, like \code{"amoxicillin and enzyme inhibitor"}} - \item{\code{official_nl}}{Official name in the Netherlands, like \code{"Amoxicilline met enzymremmer"}} - \item{\code{trivial_nl}}{Trivial name in Dutch, like \code{"Amoxicilline/clavulaanzuur"}} - \item{\code{oral_ddd}}{Defined Daily Dose (DDD) according to the WHO, oral treatment} - \item{\code{oral_units}}{Units of \code{ddd_units}} - \item{\code{iv_ddd}}{Defined Daily Dose (DDD) according to the WHO, parenteral treatment} - \item{\code{iv_units}}{Units of \code{iv_ddd}} - \item{\code{atc_group1}}{ATC group in Dutch, like \code{"Macroliden, lincosamiden en streptograminen"}} - \item{\code{atc_group2}}{Subgroup of \code{atc_group1} in Dutch, like \code{"Macroliden"}} -}} -\source{ -MOLIS (LIS of Certe) - \url{https://www.certe.nl} \cr \cr GLIMS (LIS of UMCG) - \url{https://www.umcg.nl} \cr \cr World Health Organization - \url{https://www.whocc.no/atc_ddd_index/} -} -\usage{ -ablist -} -\description{ -A dataset containing all antibiotics with a J0 code, with their DDD's. -} -\seealso{ -\code{\link{bactlist}} -} -\keyword{datasets} diff --git a/man/abname.Rd b/man/abname.Rd index 116a4ded..8478d17d 100644 --- a/man/abname.Rd +++ b/man/abname.Rd @@ -4,7 +4,7 @@ \alias{abname} \title{Name of an antibiotic} \source{ -\code{\link{ablist}} +\code{\link{antibiotics}} } \usage{ abname(abcode, from = "umcg", to = "official", textbetween = " + ", @@ -13,14 +13,14 @@ abname(abcode, from = "umcg", to = "official", textbetween = " + ", \arguments{ \item{abcode}{a code or name, like \code{"AMOX"}, \code{"AMCL"} or \code{"J01CA04"}} -\item{from, to}{type to transform from and to. See \code{\link{ablist}} for its column names.} +\item{from, to}{type to transform from and to. See \code{\link{antibiotics}} for its column names.} \item{textbetween}{text to put between multiple returned texts} \item{tolower}{return output as lower case with function \code{\link{tolower}}.} } \description{ -Convert antibiotic codes (from a laboratory information system like MOLIS or GLIMS) to a (trivial) antibiotic name or ATC code, or vice versa. This uses the data from \code{\link{ablist}}. +Convert antibiotic codes (from a laboratory information system like MOLIS or GLIMS) to a (trivial) antibiotic name or ATC code, or vice versa. This uses the data from \code{\link{antibiotics}}. } \examples{ abname("AMCL") diff --git a/man/antibiotics.Rd b/man/antibiotics.Rd new file mode 100644 index 00000000..44db1565 --- /dev/null +++ b/man/antibiotics.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/data.R +\docType{data} +\name{antibiotics} +\alias{antibiotics} +\title{Dataset with 420 antibiotics} +\format{A data.frame with 420 observations and 16 variables: +\describe{ + \item{\code{atc}}{ATC code, like \code{J01CR02}} + \item{\code{molis}}{MOLIS code, like \code{amcl}} + \item{\code{umcg}}{UMCG code, like \code{AMCL}} + \item{\code{official}}{Official name by the WHO, like \code{"Amoxicillin and enzyme inhibitor"}} + \item{\code{official_nl}}{Official name in the Netherlands, like \code{"Amoxicilline met enzymremmer"}} + \item{\code{trivial_nl}}{Trivial name in Dutch, like \code{"Amoxicilline/clavulaanzuur"}} + \item{\code{oral_ddd}}{Defined Daily Dose (DDD), oral treatment} + \item{\code{oral_units}}{Units of \code{ddd_units}} + \item{\code{iv_ddd}}{Defined Daily Dose (DDD), parenteral treatment} + \item{\code{iv_units}}{Units of \code{iv_ddd}} + \item{\code{atc_group1}}{ATC group, like \code{"Macrolides, lincosamides and streptogramins"}} + \item{\code{atc_group2}}{Subgroup of \code{atc_group1}, like \code{"Macrolides"}} + \item{\code{atc_group1_nl}}{ATC group in Dutch, like \code{"Macroliden, lincosamiden en streptograminen"}} + \item{\code{atc_group2_nl}}{Subgroup of \code{atc_group1} in Dutch, like \code{"Macroliden"}} + \item{\code{useful_gramnegative}}{\code{FALSE} if not useful according to EUCAST, \code{NA} otherwise (see Source)} + \item{\code{useful_grampositive}}{\code{FALSE} if not useful according to EUCAST, \code{NA} otherwise (see Source)} +}} +\source{ +- World Health Organization: \url{https://www.whocc.no/atc_ddd_index/} \cr - EUCAST - Expert rules intrinsic exceptional V3.1 \cr - MOLIS (LIS of Certe): \url{https://www.certe.nl} \cr - GLIMS (LIS of UMCG): \url{https://www.umcg.nl} +} +\usage{ +antibiotics +} +\description{ +A dataset containing all antibiotics with a J0 code, with their DDD's. Properties were downloaded from the WHO, see Source. +} +\seealso{ +\code{\link{bactlist}} +} +\keyword{datasets} diff --git a/man/bactlist.Rd b/man/bactlist.Rd index 937749e4..8c4abafa 100644 --- a/man/bactlist.Rd +++ b/man/bactlist.Rd @@ -4,7 +4,7 @@ \name{bactlist} \alias{bactlist} \title{Dataset with ~2500 microorganisms} -\format{A data.frame with 2507 observations and 10 variables: +\format{A data.frame with 2507 observations and 12 variables: \describe{ \item{\code{bactid}}{ID of microorganism} \item{\code{bactsys}}{Bactsyscode of microorganism} @@ -13,9 +13,11 @@ \item{\code{species}}{Species name of microorganism, like \code{"coli"}} \item{\code{subspecies}}{Subspecies name of bio-/serovar of microorganism, like \code{"EHEC"}} \item{\code{fullname}}{Full name, like \code{"Echerichia coli (EHEC)"}} - \item{\code{type}}{Type of microorganism in Dutch, like \code{"Bacterie"} and \code{"Schimmel/gist"}} - \item{\code{gramstain}}{Gram of microorganism in Dutch, like \code{"Negatieve staven"}} - \item{\code{aerobic}}{Type aerobe/anaerobe of bacteria} + \item{\code{type}}{Type of microorganism, like \code{"Bacteria"} and \code{"Fungus/yeast"}} + \item{\code{gramstain}}{Gram of microorganism, like \code{"Negative rods"}} + \item{\code{aerobic}}{Logical whether bacteria is aerobic} + \item{\code{type_nl}}{Type of microorganism in Dutch, like \code{"Bacterie"} and \code{"Schimmel/gist"}} + \item{\code{gramstain_nl}}{Gram of microorganism in Dutch, like \code{"Negatieve staven"}} }} \source{ MOLIS (LIS of Certe) - \url{https://www.certe.nl} @@ -27,6 +29,6 @@ bactlist A dataset containing all microorganisms of MOLIS. MO codes of the UMCG can be looked up using \code{\link{bactlist.umcg}}. } \seealso{ -\code{\link{ablist}} \code{\link{bactlist.umcg}} +\code{\link{guess_bactid}} \code{\link{antibiotics}} \code{\link{bactlist.umcg}} } \keyword{datasets} diff --git a/man/figures/mic_example.png b/man/figures/mic_example.png new file mode 100644 index 00000000..74359c67 Binary files /dev/null and b/man/figures/mic_example.png differ diff --git a/man/guess_bactid.Rd b/man/guess_bactid.Rd new file mode 100644 index 00000000..df6c8c02 --- /dev/null +++ b/man/guess_bactid.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/first_isolates.R +\name{guess_bactid} +\alias{guess_bactid} +\title{Find bacteria ID based on genus/species} +\usage{ +guess_bactid(x) +} +\arguments{ +\item{x}{character vector to determine \code{bactid}} +} +\value{ +Character (vector). +} +\description{ +Use this function to determine a valid ID based on a genus (and species). This input could be a full name (like \code{"Staphylococcus aureus"}), an abbreviated name (like \code{"S. aureus"}), or just a genus. You could also use a \code{\link{paste}} of a genus and species column to use the full name as input: \code{x = paste(df$genus, df$species)}, where \code{df} is your dataframe. +} +\examples{ +# These examples all return "STAAUR", the ID of S. aureus: +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 +} +\seealso{ +\code{\link{bactlist}} for the dataframe that is being used to determine ID's. +} diff --git a/man/join.Rd b/man/join.Rd index 9be18359..2f06422a 100644 --- a/man/join.Rd +++ b/man/join.Rd @@ -11,39 +11,42 @@ \alias{anti_join_bactlist} \title{Join a table with \code{bactlist}} \usage{ -inner_join_bactlist(x, by = "bactid", ...) +inner_join_bactlist(x, by = "bactid", suffix = c("2", ""), ...) -left_join_bactlist(x, by = "bactid", ...) +left_join_bactlist(x, by = "bactid", suffix = c("2", ""), ...) -right_join_bactlist(x, by = "bactid", ...) +right_join_bactlist(x, by = "bactid", suffix = c("2", ""), ...) -full_join_bactlist(x, by = "bactid", ...) +full_join_bactlist(x, by = "bactid", suffix = c("2", ""), ...) semi_join_bactlist(x, by = "bactid", ...) anti_join_bactlist(x, by = "bactid", ...) } \arguments{ -\item{x}{existing table to join} +\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{bactlist$bactid} (like \code{by = "bacteria_id"}), or another column in \code{\link{bactlist}} (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.} + \item{...}{other parameters to pass on to \code{dplyr::\link[dplyr]{join}}.} } \description{ Join the list of microorganisms \code{\link{bactlist}} easily to an existing table. } \details{ -As opposed to the \code{\link[dplyr]{join}} functions of \code{dplyr}, 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. +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. } \examples{ +left_join_bactlist("STAAUR") + df <- data.frame(date = seq(from = as.Date("2018-01-01"), to = as.Date("2018-01-07"), by = 1), bacteria_id = c("STAAUR", "STAAUR", "STAAUR", "STAAUR", "ESCCOL", "ESCCOL", "ESCCOL"), stringsAsFactors = FALSE) - colnames(df) df2 <- left_join_bactlist(df, "bacteria_id") colnames(df2) diff --git a/man/key_antibiotics.Rd b/man/key_antibiotics.Rd index 8943f3ad..3172f4d0 100644 --- a/man/key_antibiotics.Rd +++ b/man/key_antibiotics.Rd @@ -33,5 +33,5 @@ tbl$keyab <- key_antibiotics(tbl) } } \seealso{ -\code{\link{mo_property}} \code{\link{ablist}} +\code{\link{mo_property}} \code{\link{antibiotics}} } diff --git a/man/septic_patients.Rd b/man/septic_patients.Rd index a118d022..510e6aeb 100644 --- a/man/septic_patients.Rd +++ b/man/septic_patients.Rd @@ -15,7 +15,7 @@ \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{bactlist}}} - \item{\code{peni:mupi}}{38 different antibiotics with class \code{rsi} (see \code{\link{as.rsi}}), these column names occur in \code{\link{ablist}} and can be translated with \code{\link{abname}}} + \item{\code{peni:mupi}}{38 different antibiotics with class \code{rsi} (see \code{\link{as.rsi}}), these column names occur in \code{\link{antibiotics}} and can be translated with \code{\link{abname}}} }} \source{ MOLIS (LIS of Certe) - \url{https://www.certe.nl}