From 029157b3be8c3730b4c6d0596b8f8ffcfc38bf6c Mon Sep 17 00:00:00 2001 From: "Matthijs S. Berends" Date: Wed, 29 Aug 2018 12:27:37 +0200 Subject: [PATCH] 163 new trade names, added ab_tradenames --- .Rbuildignore | 1 + .gitignore | 1 + DESCRIPTION | 2 +- NAMESPACE | 1 + NEWS.md | 15 +- R/ab_property.R | 14 ++ R/abname.R | 11 +- R/atc.R | 14 ++ R/bactid.R | 4 +- R/data.R | 231 ++++++------------------------ README.md | 10 +- data/antibiotics.rda | Bin 12665 -> 13641 bytes man/ab_property.Rd | 6 + man/abname.Rd | 3 + man/antibiotics.Rd | 8 +- tests/testthat/test-ab_property.R | 2 + tests/testthat/test-atc.R | 4 + vignettes/AMR.Rmd | 33 +++-- vignettes/freq.R | 89 ------------ vignettes/freq.Rmd | 4 +- 20 files changed, 139 insertions(+), 314 deletions(-) delete mode 100644 vignettes/freq.R diff --git a/.Rbuildignore b/.Rbuildignore index 51c54326..fad9f2b1 100755 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -4,3 +4,4 @@ .zenodo.json ^cran-comments\.md$ ^appveyor\.yml$ +_noinclude diff --git a/.gitignore b/.gitignore index 304c2613..eba10c58 100755 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ inst/doc /src/*.o-* /src/*.d /src/*.so +_noinclude *.dll vignettes/*.R .DS_Store diff --git a/DESCRIPTION b/DESCRIPTION index 8003e2cf..3c5f55ad 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR Version: 0.3.0.9005 -Date: 2018-08-28 +Date: 2018-08-29 Title: Antimicrobial Resistance Analysis Authors@R: c( person( diff --git a/NAMESPACE b/NAMESPACE index 267b9542..6f5d359c 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -41,6 +41,7 @@ export(ab_certe) export(ab_official) export(ab_official_nl) export(ab_property) +export(ab_tradenames) export(ab_trivial_nl) export(ab_umcg) export(abname) diff --git a/NEWS.md b/NEWS.md index 59a41c6d..1d940162 100755 --- a/NEWS.md +++ b/NEWS.md @@ -2,14 +2,25 @@ #### New * Functions `count_R`, `count_IR`, `count_I`, `count_SI` and `count_S` to selectively count resistant or susceptible isolates - * New function `count_df` to get all counts of S, I and R of a data set with antibiotic columns, with support for grouped variables + * 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.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` +* Introduction to AMR as a vignette #### Changed -* Added 182 microorganisms to the `microorganisms` data set, now n = 2,646 (2,207 bacteria, 285 fungi/yeasts, 153 parasites, 1 other) +* Added 182 microorganisms to the `microorganisms` data set, now *n* = 2,646 (2,207 bacteria, 285 fungi/yeasts, 153 parasites, 1 other) +* Added three antimicrobial agents to the `antibiotics` data set: Terbinafine (D01BA02), Rifaximin (A07AA11) and Isoconazole (D01AC05) +* Added 163 trade names to the `antibiotics` data set, it now contains 298 different trade names in total, e.g.: + ```r + ab_official("Bactroban") + # [1] "Mupirocin" + ab_official(c("Bactroban", "Amoxil", "Zithromax", "Floxapen")) + # [1] "Mupirocin" "Amoxicillin" "Azithromycin" "Flucloxacillin" + 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 * Fix in `as.mic` for values ending in zeroes after a real number * Huge speed improvement for `as.bactid` diff --git a/R/ab_property.R b/R/ab_property.R index 963e4916..a29ca321 100644 --- a/R/ab_property.R +++ b/R/ab_property.R @@ -22,6 +22,7 @@ #' @param x a (vector of a) valid \code{\link{atc}} code or any text that can be coerced to a valid atc with \code{\link{as.atc}} #' @param property one of the column names of one of the \code{\link{antibiotics}} data set, like \code{"atc"} and \code{"official"} #' @rdname ab_property +#' @return A vector of values. In case of \code{ab_tradenames}, if \code{x} is of length one, a vector will be returned. Otherwise a \code{\link{list}}, with \code{x} as names. #' @export #' @importFrom dplyr %>% left_join pull #' @seealso \code{\link{antibiotics}} @@ -82,3 +83,16 @@ ab_certe <- function(x) { ab_umcg <- function(x) { ab_property(x, "umcg") } + +#' @rdname ab_property +#' @export +ab_tradenames <- function(x) { + res <- ab_property(x, "trade_name") + res <- strsplit(res, "|", fixed = TRUE) + if (length(x) == 1) { + res <- unlist(res) + } else { + names(res) <- x + } + res +} diff --git a/R/abname.R b/R/abname.R index 2086b035..7105ba75 100644 --- a/R/abname.R +++ b/R/abname.R @@ -23,6 +23,7 @@ #' @param from,to type to transform from and to. See \code{\link{antibiotics}} for its column names. WIth \code{from = "guess"} the from will be guessed from \code{"atc"}, \code{"certe"} and \code{"umcg"}. When using \code{to = "atc"}, the ATC code will be searched using \code{\link{as.atc}}. #' @param textbetween text to put between multiple returned texts #' @param tolower return output as lower case with function \code{\link{tolower}}. +#' @details \strong{The \code{\link{ab_property}} functions are faster and more concise}, but do not support concatenated strings, like \code{abname("AMCL+GENT"}. #' @keywords ab antibiotics #' @source \code{\link{antibiotics}} #' @export @@ -100,29 +101,29 @@ abname <- function(abcode, } if (from %in% c("atc", "guess")) { if (abcode[i] %in% abx$atc) { - abcode[i] <- abx[which(abx$atc == abcode[i]),] %>% pull(to) + abcode[i] <- abx[which(abx$atc == abcode[i]),] %>% pull(to) %>% .[1] next } } if (from %in% c("certe", "guess")) { if (abcode[i] %in% abx$certe) { - abcode[i] <- abx[which(abx$certe == abcode[i]),] %>% pull(to) + abcode[i] <- abx[which(abx$certe == abcode[i]),] %>% pull(to) %>% .[1] next } } if (from %in% c("umcg", "guess")) { if (abcode[i] %in% abx$umcg) { - abcode[i] <- abx[which(abx$umcg == abcode[i]),] %>% pull(to) + abcode[i] <- abx[which(abx$umcg == abcode[i]),] %>% pull(to) %>% .[1] next } } if (from %in% c("trade_name", "guess")) { if (abcode[i] %in% abx$trade_name) { - abcode[i] <- abx[which(abx$trade_name == abcode[i]),] %>% pull(to) + abcode[i] <- abx[which(abx$trade_name == abcode[i]),] %>% pull(to) %>% .[1] next } if (sum(abx$trade_name %like% abcode[i]) > 0) { - abcode[i] <- abx[which(abx$trade_name %like% abcode[i]),] %>% pull(to) + abcode[i] <- abx[which(abx$trade_name %like% abcode[i]),] %>% pull(to) %>% .[1] next } } diff --git a/R/atc.R b/R/atc.R index f1396104..dd1a41a9 100755 --- a/R/atc.R +++ b/R/atc.R @@ -64,6 +64,13 @@ as.atc <- function(x) { x.new[is.na(x.new) & x.bak == x[i]] <- found[1L] } + # try ATC in code form, even if it does not exist in the antibiotics data set YET + if (length(found) == 0 & x[i] %like% '[A-Z][0-9][0-9][A-Z][A-Z][0-9][0-9]') { + warning("ATC code ", x[i], " is not yet in the `antibiotics` data set.") + fail <- FALSE + x.new[is.na(x.new) & x.bak == x[i]] <- x[i] + } + # try abbreviation of certe and glims found <- AMR::antibiotics[which(tolower(AMR::antibiotics$certe) == tolower(x[i])),]$atc if (length(found) > 0) { @@ -83,6 +90,13 @@ as.atc <- function(x) { x.new[is.na(x.new) & x.bak == x[i]] <- found[1L] } + # try exact official Dutch + found <- AMR::antibiotics[which(tolower(AMR::antibiotics$official_nl) == tolower(x[i])),]$atc + if (length(found) > 0) { + fail <- FALSE + x.new[is.na(x.new) & x.bak == x[i]] <- found[1L] + } + # try trade name found <- AMR::antibiotics[which(paste0("(", AMR::antibiotics$trade_name, ")") %like% x[i]),]$atc if (length(found) > 0) { diff --git a/R/bactid.R b/R/bactid.R index b94b7173..410a1a66 100644 --- a/R/bactid.R +++ b/R/bactid.R @@ -205,12 +205,12 @@ as.bactid <- function(x, Becker = FALSE, Lancefield = FALSE) { failures <- c(failures, x_backup[i]) next } - if (x_backup[i] %in% MOs$bactid) { + if (x_backup[i] %in% AMR::microorganisms$bactid) { # is already a valid bactid x[i] <- x_backup[i] next } - if (x_trimmed[i] %in% MOs$bactid) { + if (x_trimmed[i] %in% AMR::microorganisms$bactid) { # is already a valid bactid x[i] <- x_trimmed[i] next diff --git a/R/data.R b/R/data.R index 3b322e68..2193704b 100755 --- a/R/data.R +++ b/R/data.R @@ -16,10 +16,10 @@ # GNU General Public License for more details. # # ==================================================================== # -#' Dataset with 420 antibiotics +#' Dataset with 423 antibiotics #' -#' 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 18 variables: +#' A dataset containing all antibiotics with a J0 code and some other antimicrobial agents, with their DDD's. Except for trade names and abbreviations, all properties were downloaded from the WHO, see Source. +#' @format A data.frame with 423 observations and 18 variables: #' \describe{ #' \item{\code{atc}}{ATC code, like \code{J01CR02}} #' \item{\code{certe}}{Certe code, like \code{amcl}} @@ -28,7 +28,7 @@ #' \item{\code{official}}{Official name by the WHO, like \code{"Amoxicillin and beta-lactamase inhibitor"}} #' \item{\code{official_nl}}{Official name in the Netherlands, like \code{"Amoxicilline met enzymremmer"}} #' \item{\code{trivial_nl}}{Trivial name in Dutch, like \code{"Amoxicilline/clavulaanzuur"}} -#' \item{\code{trade_name}}{Trade name as used by many countries, used internally by \code{\link{as.atc}}} +#' \item{\code{trade_name}}{Trade name as used by many countries (a total of 294), used internally by \code{\link{as.atc}}} #' \item{\code{oral_ddd}}{Defined Daily Dose (DDD), oral treatment} #' \item{\code{oral_units}}{Units of \code{ddd_units}} #' \item{\code{iv_ddd}}{Defined Daily Dose (DDD), parenteral treatment} @@ -61,177 +61,7 @@ # paste() %>% # .[. %like% "StringValueList"] %>% # gsub("[]", "", .) -# abbr and trade_name created with: -# https://hs.unr.edu/Documents/dhs/chs/NVPHTC/antibiotic_refeference_guide.pdf -# antibiotics %>% -# mutate(abbr = -# case_when( -# official == 'Amikacin' ~ 'Ak|AN|AMI|AMK', -# official == 'Amoxicillin' ~ 'AMX|AMOX|AC', -# official == 'Amoxicillin and beta-lactamase inhibitor' ~ 'AUG|A/C|XL|AML', -# official == 'Ampicillin' ~ 'AM|AMP', -# official == 'Ampicillin and beta-lactamase inhibitor' ~ 'A/S|SAM|AMS|AB', -# official == 'Azithromycin' ~ 'Azi|AZM|AZ', -# official == 'Azlocillin' ~ 'AZ|AZL', -# official == 'Aztreonam' ~ 'Azt|ATM|AT|AZM', -# official == 'Carbenicillin' ~ 'Cb|BAR', -# official == 'Cefaclor' ~ 'Ccl|CEC|Cfr|FAC|CF', -# official == 'Cefadroxil' ~ 'CFR|FAD', -# official == 'Cefazolin' ~ 'Cfz|CZ|FAZ|KZ', -# official == 'Cefdinir' ~ 'Cdn|CDR|DIN|CD|CFD', -# official == 'Cefditoren' ~ 'CDN', -# official == 'Cefepime' ~ 'Cpe|FEP|PM|CPM', -# official == 'Cefixime' ~ 'Cfe|DCFM|FIX|IX', -# official == 'Cefoperazone' ~ 'Cfp|CPZ|PER|FOP|CP', -# official == 'Cefotaxime' ~ 'Cft|CTX|TAX|FOT|CT', -# official == 'Cefotetan' ~ 'Ctn|CTT|CTE|TANS|CN', -# official == 'Cefoxitin' ~ 'Cfx|FOX|CX|FX', -# official == 'Cefpodoxime' ~ 'Cpd|POD|PX', -# official == 'Cefprozil' ~ 'Cpz|CPR|FP', -# official == 'Ceftaroline' ~ 'CPT', -# official == 'Ceftazidime' ~ 'Caz|TAZ|TZ', -# official == 'Ceftibuten' ~ 'CTB|TIB|CB', -# official == 'Ceftizoxime' ~ 'Cz|ZOX|CZX|CZ|CTZ|TIZ', -# official == 'Ceftriaxone' ~ 'Cax|CRO|CTR|FRX|AXO|TX', -# official == 'Cefuroxime' ~ 'Crm|CXM|CFX|ROX|FUR|XM', -# official == 'Cephalexin' ~ 'CN|LX|CFL', -# official == 'Cephalothin' ~ 'Cf', -# official == 'Chloramphenicol' ~ 'C|CHL|CL', -# official == 'Ciprofloxacin' ~ 'Cp|CIP|CI', -# official == 'Clarithromycin' ~ 'Cla|CLR|CLM|CH', -# official == 'Clindamycin' ~ 'Cd|CC|CM|CLI|DA', -# official == 'Colistin' ~ 'CL|CS|CT', -# official == 'Daptomycin' ~ 'Dap', -# official == 'Doxycycline' ~ 'Dox', -# official == 'Doripenem' ~ 'DOR|Dor', -# official == 'Ertapenem' ~ 'Etp', -# official == 'Erythromycin' ~ 'E|ERY|EM', -# official == 'Fosfomycin' ~ 'FOS|FF|FO|FM', -# official == 'Flucloxacillin' ~ 'CLOX', -# official == 'Gentamicin' ~ 'Gm|CN|GEN', -# official == 'Imipenem' ~ 'Imp|IPM|IMI|IP', -# official == 'Kanamycin' ~ 'K|KAN|HLK|KM', -# official == 'Levofloxacin' ~ 'Lvx|LEV|LEVO|LE', -# official == 'Linezolid' ~ 'Lzd|LNZ|LZ', -# official == 'Lomefloxacin' ~ 'Lmf|LOM', -# official == 'Meropenem' ~ 'Mer|MEM|MERO|MRP|MP', -# official == 'Metronidazole' ~ 'MNZ', -# official == 'Mezlocillin' ~ 'Mz|MEZ', -# official == 'Minocycline' ~ 'Min|MI|MN|MNO|MC|MH', -# official == 'Moxifloxacin' ~ 'Mox|MXF', -# official == 'Mupirocin' ~ 'MUP', -# official == 'Nafcillin' ~ 'Naf|NF', -# official == 'Nalidixic acid' ~ 'NA|NAL', -# official == 'Nitrofurantoin' ~ 'Fd|F/M|FT|NIT|NI|F', -# official == 'Norfloxacin' ~ 'Nxn|NOR|NX', -# official == 'Ofloxacin' ~ 'Ofl|OFX|OF', -# official == 'Oxacillin' ~ 'Ox|OXS|OXA', -# official == 'Benzylpenicillin' ~ 'P|PEN|PV', -# official == 'Penicillins, combinations with other antibacterials' ~ 'P|PEN|PV', -# official == 'Piperacillin' ~ 'Pi|PIP|PP', -# official == 'Piperacillin and beta-lactamase inhibitor' ~ 'PT|TZP|PTZ|P/T|PTc', -# official == 'Polymyxin B' ~ 'PB', -# official == 'Quinupristin/dalfopristin' ~ 'Syn|Q/D|QDA|RP', -# official == 'Rifampin' ~ 'Rif|RA|RI|RD', -# official == 'Spectinomycin' ~ 'SPT|SPE|SC', -# official == 'Streptomycin' ~ 'S|STR', -# official == 'Teicoplanin' ~ 'Tei|TEC|TPN|TP|TPL', -# official == 'Telavancin' ~ 'TLV', -# official == 'Telithromcyin' ~ 'Tel', -# official == 'Tetracycline' ~ 'Te|TET|TC', -# official == 'Ticarcillin' ~ 'Ti|TIC|TC', -# official == 'Ticarcillin and beta-lactamase inhibitor' ~ 'Tim|T/C|TCC|TLc', -# official == 'Tigecycline' ~ 'TGC', -# official == 'Tobramycin' ~ 'To|NN|TM|TOB', -# official == 'Trimethoprim' ~ 'T|TMP|TR|W', -# official == 'Sulfamethoxazole and trimethoprim' ~ 'T/S|SXT|SxT|TS|COT', -# official == 'Vancomycin' ~ 'Va|VAN', -# TRUE ~ NA_character_), -# -# trade_name = -# case_when( -# official == 'Amikacin' ~ 'Amikin', -# official == 'Amoxicillin' ~ 'Amoxil|Dispermox|Larotid|Trimox', -# official == 'Amoxicillin and beta-lactamase inhibitor' ~ 'Augmentin', -# official == 'Ampicillin' ~ 'Pfizerpen-A|Principen', -# official == 'Ampicillin and beta-lactamase inhibitor' ~ 'Unasyn', -# official == 'Azithromycin' ~ 'Zithromax', -# official == 'Azlocillin' ~ 'Azlin', -# official == 'Aztreonam' ~ 'Azactam', -# official == 'Carbenicillin' ~ 'Geocillin', -# official == 'Cefaclor' ~ 'Ceclor', -# official == 'Cefadroxil' ~ 'Duricef', -# official == 'Cefazolin' ~ 'Ancef', -# official == 'Cefdinir' ~ 'Omnicef', -# official == 'Cefditoren' ~ 'Spectracef', -# official == 'Cefepime' ~ 'Maxipime', -# official == 'Cefixime' ~ 'Suprax', -# official == 'Cefoperazone' ~ 'Cefobid', -# official == 'Cefotaxime' ~ 'Claforan', -# official == 'Cefotetan' ~ 'Cefotan', -# official == 'Cefoxitin' ~ 'Mefoxin', -# official == 'Cefpodoxime' ~ 'Vantin', -# official == 'Cefprozil' ~ 'Cefzil', -# official == 'Ceftaroline' ~ 'Teflaro', -# official == 'Ceftazidime' ~ 'Fortaz|Tazicef|Tazidime', -# official == 'Ceftibuten' ~ 'Cedax', -# official == 'Ceftizoxime' ~ 'Cefizox', -# official == 'Ceftriaxone' ~ 'Rocephin', -# official == 'Cefuroxime' ~ 'Ceftin|Zinacef', -# official == 'Cephalexin' ~ 'Keflex|Panixine', -# official == 'Cephalothin' ~ 'Keflin', -# official == 'Chloramphenicol' ~ 'Chloromycetin', -# official == 'Ciprofloxacin' ~ 'Cipro|Ciloxan|Ciproxin', -# official == 'Clarithromycin' ~ 'Biaxin', -# official == 'Clindamycin' ~ 'Cleocin|Clinda-Derm|Clindagel|Clindesse|Clindets|Evoclin', -# official == 'Colistin' ~ 'Coly-Mycin', -# official == 'Daptomycin' ~ 'Cubicin', -# official == 'Doxycycline' ~ 'Doryx|Monodox|Vibramycin|Atridox|Oracea|Periostat|Vibra-Tabs', -# official == 'Doripenem' ~ 'Doribax', -# official == 'Ertapenem' ~ 'Invanz', -# official == 'Erythromycin' ~ 'Eryc|EryPed|Erythrocin|E-Base|E-Glades|E-Mycin|E.E.S.|Ery-Tab|Eryderm|Erygel|Erythra-derm|Eryzole|Pediamycin', -# official == 'Fosfomycin' ~ 'Monurol', -# official == 'Flucloxacillin' ~ 'Flopen|Floxapen|Fluclox|Sesamol|Softapen|Staphylex', -# official == 'Gentamicin' ~ 'Garamycin|Genoptic', -# official == 'Imipenem' ~ 'Primaxin', -# official == 'Kanamycin' ~ 'Kantrex', -# official == 'Levofloxacin' ~ 'Levaquin|Quixin', -# official == 'Linezolid' ~ 'Zyvox', -# official == 'Lomefloxacin' ~ 'Maxaquin', -# official == 'Meropenem' ~ 'Merrem', -# official == 'Metronidazole' ~ 'Flagyl|MetroGel|MetroCream|MetroLotion', -# official == 'Mezlocillin' ~ 'Mezlin', -# official == 'Minocycline' ~ 'Arestin|Solodyn', -# official == 'Moxifloxacin' ~ 'Avelox|Vigamox', -# official == 'Mupirocin' ~ 'Bactroban|Centany', -# official == 'Nafcillin' ~ 'Unipen', -# official == 'Nalidixic acid' ~ 'NegGram', -# official == 'Nitrofurantoin' ~ 'Furadantin|Macrobid|Macrodantin', -# official == 'Norfloxacin' ~ 'Noroxin', -# official == 'Ofloxacin' ~ 'Floxin|Ocuflox|Ophthalmic', -# official == 'Oxacillin' ~ 'Bactocill', -# official == 'Benzylpenicillin' ~ 'Permapen|Pfizerpen|Veetids', -# official == 'Penicillins, combinations with other antibacterials' ~ 'Permapen|Pfizerpen|Veetids', -# official == 'Piperacillin' ~ 'Pipracil', -# official == 'Piperacillin and beta-lactamase inhibitor' ~ 'Zosyn', -# official == 'Polymyxin B' ~ 'Poly-RX', -# official == 'Quinupristin/dalfopristin' ~ 'Synercid', -# official == 'Rifampin' ~ 'Rifadin|Rifamate|Rimactane', -# official == 'Spectinomycin' ~ 'Trobicin', -# official == 'Streptomycin' ~ 'Streptomycin Sulfate', -# official == 'Teicoplanin' ~ 'Targocid', -# official == 'Telavancin' ~ 'Vibativ', -# official == 'Telithromcyin' ~ 'Ketek', -# official == 'Tetracycline' ~ 'Sumycin|Bristacycline|Tetrex', -# official == 'Ticarcillin' ~ 'Ticar', -# official == 'Ticarcillin and beta-lactamase inhibitor' ~ 'Timentin', -# official == 'Tigecycline' ~ 'Tygacil', -# official == 'Tobramycin' ~ 'Tobi|Aktob|Tobre', -# official == 'Trimethoprim' ~ 'Primsol|Proloprim', -# official == 'Sulfamethoxazole and trimethoprim' ~ 'Bactrim|Septra|Sulfatrim', -# official == 'Vancomycin' ~ 'Vancocin|Vancomycin Hydrochloride', -# TRUE ~ NA_character_) -# ) + # last two columns created with: # antibiotics %>% # mutate(useful_gramnegative = @@ -251,21 +81,44 @@ # NA # ) # ) +# +# ADD NEW TRADE NAMES FROM OTHER DATAFRAME +# antibiotics_add_to_property <- function(ab_df, atc, property, value) { +# if (length(atc) > 1L) { +# stop("only one atc at a time") +# } +# if (!property %in% c("abbr", "trade_name")) { +# stop("only possible for abbr and trade_name") +# } +# +# value <- gsub(ab_df[which(ab_df$atc == atc),] %>% pull("official"), "", value, fixed = TRUE) +# value <- gsub("||", "|", value, fixed = TRUE) +# value <- gsub("[äáàâ]", "a", value) +# value <- gsub("[ëéèê]", "e", value) +# value <- gsub("[ïíìî]", "i", value) +# value <- gsub("[öóòô]", "o", value) +# value <- gsub("[üúùû]", "u", value) +# if (!atc %in% ab_df$atc) { +# message("SKIPPING - UNKNOWN ATC: ", atc) +# } +# if (is.na(value)) { +# message("SKIPPING - VALUE MISSES: ", atc) +# } +# if (atc %in% ab_df$atc & !is.na(value)) { +# current <- ab_df[which(ab_df$atc == atc),] %>% pull(property) +# if (!is.na(current)) { +# value <- paste(current, value, sep = "|") +# } +# value <- strsplit(value, "|", fixed = TRUE) %>% unlist() %>% unique() %>% paste(collapse = "|") +# value <- gsub("||", "|", value, fixed = TRUE) +# # print(value) +# ab_df[which(ab_df$atc == atc), property] <- value +# message("Added ", value, " to ", ab_official(atc), " (", atc, ", ", ab_certe(atc), ")") +# } +# ab_df +# } +# "antibiotics" -antibiotics_add_to_property <- function(antibiotics, atc, property, value) { - if (length(atc) > 1L) { - stop("only one atc at a time") - } - if (!property %in% c("abbr", "trade_name")) { - stop("only possible for abbr and trade_name") - } - if (atc %in% antibiotics$atc) { - current <- antibiotics[which(antibiotics$atc == atc), property] - antibiotics[which(antibiotics$atc == atc), property] <- paste(current, value, sep = "|") - message("done") - } - antibiotics -} #' Dataset with ~2650 microorganisms #' diff --git a/README.md b/README.md index 84e39005..5c3f144b 100755 --- a/README.md +++ b/README.md @@ -42,12 +42,12 @@ This R package was intended to make microbial epidemiology easier. Most function This `AMR` package basically does four important things: -1. It **cleanses existing data**, by transforming it to reproducible and profound *classes*, making the most efficient use of R. These functions all use artificial intelligence to get 'more expected' results: +1. It **cleanses existing data**, by transforming it to reproducible and profound *classes*, making the most efficient use of R. These functions all use artificial intelligence to 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". This `as.bactid` function takes almost any text as input that looks like the name or code of a microorganism like "E. coli", "esco" and "esccol". Even `as.bactid("MRSA")` will return the ID of *S. aureus*. Moreover, it can group all coagulase negative and positive *Staphylococci*, and can transform *Streptococci* into Lancefield groups. To find bacteria based on your input, this package contains a freely available database of ~2,650 different (potential) human pathogenic microorganisms. + * Use `as.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.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", "Furadantine", "nitro" all return the ATC code of Nitrofurantoine. + * 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. 2. It **enhances existing data** and **adds new data** from data sets included in this package. @@ -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. For example, to get properties of a bacteria ID, use `mo_genus`, `mo_family` or `mo_gramstain`. These functions can be used to add new variables to your data. - * The data set `antibiotics` contains the ATC code, LIS codes, official name, trivial name, trade name and DDD of both oral and parenteral administration. + * 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. 3. It **analyses the data** with convenient functions that use well-known methods. diff --git a/data/antibiotics.rda b/data/antibiotics.rda index 5e5e2d518748a4fab5e718aebcfd5a62b9fe0023..ce7b7d6b9af0e6321366e023aea98acde4b676a5 100755 GIT binary patch literal 13641 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 F`9DaKh9Lj| literal 12665 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 freq() - -# do it all with pipes, using the `select` function from the dplyr package -septic_patients %>% - select(sex) %>% - freq() - -# or the preferred way: using a pipe to pass the variable on to the freq function -septic_patients %>% freq(sex) # this also shows 'age' in the title - - -## ---- echo = TRUE-------------------------------------------------------- -freq(septic_patients$sex) - -## ---- echo = TRUE, results = 'hide'-------------------------------------- -my_patients <- septic_patients %>% left_join_microorganisms() - -## ---- echo = TRUE-------------------------------------------------------- -colnames(microorganisms) - -## ---- echo = TRUE-------------------------------------------------------- -dim(septic_patients) -dim(my_patients) - -## ---- echo = TRUE-------------------------------------------------------- -my_patients %>% freq(genus, species) - -## ---- echo = TRUE-------------------------------------------------------- -# # get age distribution of unique patients -septic_patients %>% - distinct(patient_id, .keep_all = TRUE) %>% - freq(age, nmax = 5) - -## ---- echo = TRUE-------------------------------------------------------- -septic_patients %>% - freq(hospital_id) - -## ---- echo = TRUE-------------------------------------------------------- -septic_patients %>% - freq(hospital_id, sort.count = TRUE) - -## ---- echo = TRUE-------------------------------------------------------- -septic_patients %>% - select(amox) %>% - freq() - -## ---- echo = TRUE-------------------------------------------------------- -septic_patients %>% - select(date) %>% - freq(nmax = 5) - -## ---- echo = TRUE-------------------------------------------------------- -my_df <- septic_patients %>% freq(age) -class(my_df) - -## ---- echo = TRUE-------------------------------------------------------- -dim(my_df) - -## ---- echo = TRUE-------------------------------------------------------- -septic_patients %>% - freq(amox, na.rm = FALSE) - -## ---- echo = TRUE-------------------------------------------------------- -septic_patients %>% - freq(hospital_id, row.names = FALSE) - -## ---- echo = TRUE-------------------------------------------------------- -septic_patients %>% - freq(hospital_id, markdown = TRUE) - -## ---- echo = FALSE------------------------------------------------------- -# this will print "2018" in 2018, and "2018-yyyy" after 2018. -yrs <- c(2018:format(Sys.Date(), "%Y")) -yrs <- c(min(yrs), max(yrs)) -yrs <- paste(unique(yrs), collapse = "-") - diff --git a/vignettes/freq.Rmd b/vignettes/freq.Rmd index 0457b42d..fe3ef18a 100755 --- a/vignettes/freq.Rmd +++ b/vignettes/freq.Rmd @@ -181,9 +181,7 @@ septic_patients %>% ---- ```{r, echo = FALSE} # this will print "2018" in 2018, and "2018-yyyy" after 2018. -yrs <- c(2018:format(Sys.Date(), "%Y")) -yrs <- c(min(yrs), max(yrs)) -yrs <- paste(unique(yrs), collapse = "-") +yrs <- paste(unique(c(2018, format(Sys.Date(), "%Y"))), collapse = "-") ``` AMR, (c) `r yrs`, `r packageDescription("AMR")$URL`