From ab0503f8b8435a393b3109afe02c7537105c4ea2 Mon Sep 17 00:00:00 2001 From: Matthijs Berends Date: Wed, 21 Feb 2018 12:10:00 +0100 Subject: [PATCH] abname, logo --- NAMESPACE | 2 + R/atc.R | 101 ++++++++++++++++++++++++++++++++++++++++ README.md | 8 +++- man/abname.Rd | 46 ++++++++++++++++++ man/figures/logo_en.png | Bin 0 -> 9579 bytes 5 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 man/abname.Rd create mode 100644 man/figures/logo_en.png diff --git a/NAMESPACE b/NAMESPACE index 418a2139..01ea53e4 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -10,6 +10,7 @@ S3method(print,rsi) S3method(summary,mic) S3method(summary,rsi) export(EUCAST_rules) +export(abname) export(anti_join_bactlist) export(as.mic) export(as.rsi) @@ -56,6 +57,7 @@ importFrom(dplyr,progress_estimated) importFrom(dplyr,pull) importFrom(dplyr,row_number) importFrom(dplyr,select) +importFrom(dplyr,slice) importFrom(dplyr,summarise) importFrom(dplyr,tibble) importFrom(dplyr,vars) diff --git a/R/atc.R b/R/atc.R index dcc4b2f1..c45da077 100644 --- a/R/atc.R +++ b/R/atc.R @@ -119,3 +119,104 @@ atc_property <- function(atc_code, returnvalue } + +#' 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}}. +#' @param abcode a code or name, like \code{"amox"}, \code{"cftr"} or \code{"J01CA04"} +#' @param from,to type to transform from and to. See \code{\link{ablist}} 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 +#' @export +#' @importFrom dplyr %>% filter select slice +#' @examples +#' abname("AMCL") +#' # "amoxicillin and enzyme inhibitor" +#' +#' abname("AMCL+GENT") +#' # "amoxicillin and enzyme inhibitor + gentamicin" +#' +#' abname(c("AMCL", "GENT")) +#' # "amoxicillin and enzyme inhibitor" "gentamicin" +#' +#' abname("AMCL", to = "trivial") +#' # "Amoxicilline/clavulaanzuur" +#' +#' abname("AMCL", to = "atc") +#' # "J01CR02" +#' +#' abname("J01CR02", from = "atc", to = "umcg") +#' # "AMCL" +#' +#' @source \code{\link{ablist}} +abname <- function(abcode, from = 'umcg', to = 'official', textbetween = ' + ', tolower = FALSE) { + + ablist <- AMR::ablist + colnames(ablist) <- colnames(ablist) %>% tolower() + from <- from %>% tolower() + to <- to %>% tolower() + + if (!from %in% colnames(ablist) | + !to %in% colnames(ablist)) { + stop(paste0('Invalid `from` or `to`. Choose one of ', + colnames(ablist) %>% paste(collapse = ","), '.'), call. = FALSE) + } + + abcode <- as.character(abcode) + + for (i in 1:length(abcode)) { + drug <- abcode[i] + if (!grepl('+', drug, fixed = TRUE) & !grepl(' en ', drug, fixed = TRUE)) { + # bestaat maar uit 1 middel + if (any(ablist[, from] == drug)) { + abcode[i] <- + ablist %>% + filter(.[, from] == drug) %>% + select(to) %>% + slice(1) %>% + as.character() + } else { + # niet gevonden + warning('Code "', drug, '" not found in antibiotics list.', call. = FALSE) + abcode[i] <- NA + } + } else { + # meerdere middelen + if (grepl('+', drug, fixed = TRUE)) { + drug.group <- + strsplit(drug, '+', fixed = TRUE) %>% + unlist() %>% + trimws('both') + } else if (grepl(' en ', drug, fixed = TRUE)) { + drug.group <- + strsplit(drug, ' en ', fixed = TRUE) %>% + unlist() %>% + trimws('both') + } else { + warning('Invalid concat.') + abcode[i] <- NA + next + } + + for (j in 1:length(drug.group)) { + drug.group[j] <- + ablist %>% + filter(.[, from] == drug.group[j]) %>% + select(to) %>% + slice(1) %>% + as.character() + if (j > 1 & to %in% c('official', 'trivial')) { + drug.group[j] <- drug.group[j] %>% tolower() + } + } + abcode[i] <- paste(drug.group, collapse = textbetween) + } + } + + if (tolower == TRUE) { + abcode <- abcode %>% tolower() + } + + abcode +} diff --git a/README.md b/README.md index e629c8f5..6105a60f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ # `AMR` This is an [R package](https://www.r-project.org) to simplify the analysis of Antimicrobial Resistance (AMR). +![logo](man/figures/logo_en.png) + +This R package was created for academic research by PhD students of the Medical Microbiology & Infection Prevention (mmb) department of the [University of Groningen](https://www.rug.nl/) who also maintain this package, see [#authors]. + ## Why this package? This R package contains functions to make microbiological, epidemiological data analysis easier. It allows the use of some new S3 classes to work with MIC values and antimicrobial interpretations (i.e. values S, I and R). -This R package was created for academic research by PhD students of the [University of Groningen](https://www.rug.nl/). +AMR can also be predicted for the forthcoming years with the `rsi_predict` function. For use with the `dplyr` package, the `rsi` can be used in conjunction with `summarise` to calculate the resistance percentages of different antibiotic columns of a table. ## How to use it? ```r @@ -63,7 +67,7 @@ A plot of `rsi_data`: plot(rsi_data) ``` -![plot2_ex4](man/figures/rsi_example.png) +![example](man/figures/rsi_example.png) Other epidemiological functions: diff --git a/man/abname.Rd b/man/abname.Rd new file mode 100644 index 00000000..4f253ff8 --- /dev/null +++ b/man/abname.Rd @@ -0,0 +1,46 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/atc.R +\name{abname} +\alias{abname} +\title{Name of an antibiotic} +\source{ +\code{\link{ablist}} +} +\usage{ +abname(abcode, from = "umcg", to = "official", textbetween = " + ", + tolower = FALSE) +} +\arguments{ +\item{abcode}{a code or name, like \code{"amox"}, \code{"cftr"} or \code{"J01CA04"}} + +\item{from, to}{type to transform from and to. See \code{\link{ablist}} 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}}. +} +\examples{ +abname("AMCL") +# "amoxicillin and enzyme inhibitor" + +abname("AMCL+GENT") +# "amoxicillin and enzyme inhibitor + gentamicin" + +abname(c("AMCL", "GENT")) +# "amoxicillin and enzyme inhibitor" "gentamicin" + +abname("AMCL", to = "trivial") +# "Amoxicilline/clavulaanzuur" + +abname("AMCL", to = "atc") +# "J01CR02" + +abname("J01CR02", from = "atc", to = "umcg") +# "AMCL" + +} +\keyword{ab} +\keyword{antibiotics} diff --git a/man/figures/logo_en.png b/man/figures/logo_en.png new file mode 100644 index 0000000000000000000000000000000000000000..23d14c388cdf3422f372ba334bd05ff576d7b83d GIT binary patch literal 9579 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 VJIVE3^!)$;002ovPDHLkV1oT{I?ez9 literal 0 HcmV?d00001