mirror of
https://github.com/msberends/AMR.git
synced 2024-12-26 07:26:13 +01:00
new ggplot enhancement
This commit is contained in:
parent
4680df1e9c
commit
1ba7d883fe
@ -2,3 +2,4 @@
|
|||||||
^\.Rproj\.user$
|
^\.Rproj\.user$
|
||||||
.travis.yml
|
.travis.yml
|
||||||
.zenodo.json
|
.zenodo.json
|
||||||
|
^cran-comments\.md$
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -12,3 +12,4 @@ inst/doc
|
|||||||
*.dll
|
*.dll
|
||||||
vignettes/*.R
|
vignettes/*.R
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
^cran-comments\.md$
|
||||||
|
15
DESCRIPTION
15
DESCRIPTION
@ -1,6 +1,6 @@
|
|||||||
Package: AMR
|
Package: AMR
|
||||||
Version: 0.2.0.9022
|
Version: 0.2.0.9023
|
||||||
Date: 2018-08-10
|
Date: 2018-08-11
|
||||||
Title: Antimicrobial Resistance Analysis
|
Title: Antimicrobial Resistance Analysis
|
||||||
Authors@R: c(
|
Authors@R: c(
|
||||||
person(
|
person(
|
||||||
@ -46,7 +46,7 @@ Description: Functions to simplify the analysis of Antimicrobial Resistance (AMR
|
|||||||
on antibiograms according to Leclercq (2013)
|
on antibiograms according to Leclercq (2013)
|
||||||
<doi:10.1111/j.1469-0691.2011.03703.x>.
|
<doi:10.1111/j.1469-0691.2011.03703.x>.
|
||||||
Depends:
|
Depends:
|
||||||
R (>= 3.0.0)
|
R (>= 3.1.0)
|
||||||
Imports:
|
Imports:
|
||||||
backports,
|
backports,
|
||||||
clipr,
|
clipr,
|
||||||
@ -57,19 +57,18 @@ Imports:
|
|||||||
Rcpp (>= 0.12.14),
|
Rcpp (>= 0.12.14),
|
||||||
readr,
|
readr,
|
||||||
rvest (>= 0.3.2),
|
rvest (>= 0.3.2),
|
||||||
tibble
|
tibble,
|
||||||
|
ggplot2
|
||||||
Suggests:
|
Suggests:
|
||||||
testthat (>= 1.0.2),
|
testthat (>= 1.0.2),
|
||||||
covr (>= 3.0.1),
|
covr (>= 3.0.1),
|
||||||
rmarkdown,
|
rmarkdown,
|
||||||
rstudioapi,
|
rstudioapi,
|
||||||
tidyr,
|
tidyr
|
||||||
ggplot2
|
|
||||||
LinkingTo: Rcpp
|
|
||||||
VignetteBuilder: knitr
|
VignetteBuilder: knitr
|
||||||
URL: https://github.com/msberends/AMR
|
URL: https://github.com/msberends/AMR
|
||||||
BugReports: https://github.com/msberends/AMR/issues
|
BugReports: https://github.com/msberends/AMR/issues
|
||||||
License: GPL-2 | file LICENSE
|
License: GPL-2 | file LICENSE
|
||||||
Encoding: UTF-8
|
Encoding: UTF-8
|
||||||
LazyData: true
|
LazyData: true
|
||||||
RoxygenNote: 6.0.1.9000
|
RoxygenNote: 6.1.0
|
||||||
|
11
NAMESPACE
11
NAMESPACE
@ -43,11 +43,14 @@ export(atc_groups)
|
|||||||
export(atc_property)
|
export(atc_property)
|
||||||
export(clipboard_export)
|
export(clipboard_export)
|
||||||
export(clipboard_import)
|
export(clipboard_import)
|
||||||
|
export(facet_rsi)
|
||||||
export(first_isolate)
|
export(first_isolate)
|
||||||
export(freq)
|
export(freq)
|
||||||
export(frequency_tbl)
|
export(frequency_tbl)
|
||||||
export(full_join_microorganisms)
|
export(full_join_microorganisms)
|
||||||
export(g.test)
|
export(g.test)
|
||||||
|
export(geom_rsi)
|
||||||
|
export(ggplot_rsi)
|
||||||
export(guess_atc)
|
export(guess_atc)
|
||||||
export(guess_bactid)
|
export(guess_bactid)
|
||||||
export(inner_join_microorganisms)
|
export(inner_join_microorganisms)
|
||||||
@ -68,13 +71,17 @@ export(portion_IR)
|
|||||||
export(portion_R)
|
export(portion_R)
|
||||||
export(portion_S)
|
export(portion_S)
|
||||||
export(portion_SI)
|
export(portion_SI)
|
||||||
|
export(portion_df)
|
||||||
export(ratio)
|
export(ratio)
|
||||||
export(resistance_predict)
|
export(resistance_predict)
|
||||||
export(right_join_microorganisms)
|
export(right_join_microorganisms)
|
||||||
export(rsi)
|
export(rsi)
|
||||||
export(rsi_predict)
|
export(rsi_predict)
|
||||||
|
export(scale_rsi_colours)
|
||||||
|
export(scale_y_percent)
|
||||||
export(semi_join_microorganisms)
|
export(semi_join_microorganisms)
|
||||||
export(skewness)
|
export(skewness)
|
||||||
|
export(theme_rsi)
|
||||||
export(top_freq)
|
export(top_freq)
|
||||||
exportMethods(as.data.frame.bactid)
|
exportMethods(as.data.frame.bactid)
|
||||||
exportMethods(as.data.frame.frequency_tbl)
|
exportMethods(as.data.frame.frequency_tbl)
|
||||||
@ -105,7 +112,6 @@ exportMethods(skewness.default)
|
|||||||
exportMethods(skewness.matrix)
|
exportMethods(skewness.matrix)
|
||||||
exportMethods(summary.mic)
|
exportMethods(summary.mic)
|
||||||
exportMethods(summary.rsi)
|
exportMethods(summary.rsi)
|
||||||
importFrom(Rcpp,evalCpp)
|
|
||||||
importFrom(clipr,read_clip_tbl)
|
importFrom(clipr,read_clip_tbl)
|
||||||
importFrom(clipr,write_clip)
|
importFrom(clipr,write_clip)
|
||||||
importFrom(curl,nslookup)
|
importFrom(curl,nslookup)
|
||||||
@ -114,6 +120,7 @@ importFrom(dplyr,arrange)
|
|||||||
importFrom(dplyr,arrange_at)
|
importFrom(dplyr,arrange_at)
|
||||||
importFrom(dplyr,as_tibble)
|
importFrom(dplyr,as_tibble)
|
||||||
importFrom(dplyr,between)
|
importFrom(dplyr,between)
|
||||||
|
importFrom(dplyr,bind_cols)
|
||||||
importFrom(dplyr,case_when)
|
importFrom(dplyr,case_when)
|
||||||
importFrom(dplyr,desc)
|
importFrom(dplyr,desc)
|
||||||
importFrom(dplyr,filter)
|
importFrom(dplyr,filter)
|
||||||
@ -130,6 +137,7 @@ importFrom(dplyr,row_number)
|
|||||||
importFrom(dplyr,select)
|
importFrom(dplyr,select)
|
||||||
importFrom(dplyr,slice)
|
importFrom(dplyr,slice)
|
||||||
importFrom(dplyr,summarise)
|
importFrom(dplyr,summarise)
|
||||||
|
importFrom(dplyr,summarise_if)
|
||||||
importFrom(dplyr,tibble)
|
importFrom(dplyr,tibble)
|
||||||
importFrom(dplyr,top_n)
|
importFrom(dplyr,top_n)
|
||||||
importFrom(grDevices,boxplot.stats)
|
importFrom(grDevices,boxplot.stats)
|
||||||
@ -161,4 +169,3 @@ importFrom(utils,object.size)
|
|||||||
importFrom(utils,read.delim)
|
importFrom(utils,read.delim)
|
||||||
importFrom(utils,write.table)
|
importFrom(utils,write.table)
|
||||||
importFrom(xml2,read_html)
|
importFrom(xml2,read_html)
|
||||||
useDynLib(AMR, .registration = TRUE)
|
|
||||||
|
8
NEWS.md
8
NEWS.md
@ -1,12 +1,16 @@
|
|||||||
# 0.2.0.90xx (development version)
|
# 0.2.0.90xx (development version)
|
||||||
**Published on CRAN: (unpublished)**
|
|
||||||
|
|
||||||
#### New
|
#### New
|
||||||
* **BREAKING**: `rsi_df` was removed in favour of new functions `portion_R`, `portion_IR`, `portion_I`, `portion_SI` and `portion_S` to selectively calculate resistance or susceptibility. These functions use **hybrid evaluation**, which means that calculations are not done in R directly but rather in C++ using the `Rcpp` package, making them 20 to 30 times faster. The function `rsi` still works, but is deprecated.
|
* **BREAKING**: `rsi_df` was removed in favour of new functions `portion_R`, `portion_IR`, `portion_I`, `portion_SI` and `portion_S` to selectively calculate resistance or susceptibility. These functions are 20 to 30 times faster than the old `rsi` function. The old function still works, but is deprecated.
|
||||||
|
* New function `portion_df` to get all portions of S, I and R of a data set with antibiotic columns
|
||||||
* **BREAKING**: the methodology for determining first weighted isolates was changed. The antibiotics that are compared between isolates (call *key antibiotics*) to include more first isolates (afterwards called first *weighted* isolates) are now as follows:
|
* **BREAKING**: the methodology for determining first weighted isolates was changed. The antibiotics that are compared between isolates (call *key antibiotics*) to include more first isolates (afterwards called first *weighted* isolates) are now as follows:
|
||||||
* Universal: amoxicillin, amoxicillin/clavlanic acid, cefuroxime, piperacillin/tazobactam, ciprofloxacin, trimethoprim/sulfamethoxazole
|
* Universal: amoxicillin, amoxicillin/clavlanic acid, cefuroxime, piperacillin/tazobactam, ciprofloxacin, trimethoprim/sulfamethoxazole
|
||||||
* Gram-positive: vancomycin, teicoplanin, tetracycline, erythromycin, oxacillin, rifampicin
|
* Gram-positive: vancomycin, teicoplanin, tetracycline, erythromycin, oxacillin, rifampicin
|
||||||
* Gram-negative: gentamicin, tobramycin, colistin, cefotaxime, ceftazidime, meropenem
|
* Gram-negative: gentamicin, tobramycin, colistin, cefotaxime, ceftazidime, meropenem
|
||||||
|
* Support for `ggplot2`
|
||||||
|
* New functions `geom_rsi`, `facet_rsi`, `scale_y_percent`, `scale_rsi_colours` and `theme_rsi`
|
||||||
|
* New wrapper function `ggplot_rsi` to apply all above functions on a data set:
|
||||||
|
* `septic_patients %>% select(tobr, gent) %>% ggplot_rsi` will show portions of S, I and R immediately in a pretty plot
|
||||||
* Determining bacterial ID:
|
* Determining bacterial ID:
|
||||||
* New functions `as.bactid` and `is.bactid` to transform/ look up microbial ID's.
|
* New functions `as.bactid` and `is.bactid` to transform/ look up microbial ID's.
|
||||||
* The existing function `guess_bactid` is now an alias of `as.bactid`
|
* The existing function `guess_bactid` is now an alias of `as.bactid`
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
# Generated by using Rcpp::compileAttributes() -> do not edit by hand
|
|
||||||
# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393
|
|
||||||
|
|
||||||
rsi_calc_S <- function(x, include_I) {
|
|
||||||
.Call(`_AMR_rsi_calc_S`, x, include_I)
|
|
||||||
}
|
|
||||||
|
|
||||||
rsi_calc_I <- function(x) {
|
|
||||||
.Call(`_AMR_rsi_calc_I`, x)
|
|
||||||
}
|
|
||||||
|
|
||||||
rsi_calc_R <- function(x, include_I) {
|
|
||||||
.Call(`_AMR_rsi_calc_R`, x, include_I)
|
|
||||||
}
|
|
||||||
|
|
130
R/ggplot_rsi.R
Normal file
130
R/ggplot_rsi.R
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
# ==================================================================== #
|
||||||
|
# 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. #
|
||||||
|
# ==================================================================== #
|
||||||
|
|
||||||
|
#' AMR bar plots with \code{ggplot}
|
||||||
|
#'
|
||||||
|
#' Use these functions to create bar plots for antimicrobial resistance analysis. All functions rely on internal \code{\link{ggplot}} functions.
|
||||||
|
#' @param data a \code{data.frame} with column(s) of class \code{"rsi"} (see \code{\link{as.rsi}})
|
||||||
|
#' @param position position adjustment of bars, either \code{"stack"} (default) or \code{"dodge"}
|
||||||
|
#' @param x parameter to show on x axis, either \code{"Antibiotic"} (default) or \code{"Interpretation"}
|
||||||
|
#' @param facet parameter to split plots by, either \code{"Interpretation"} (default) or \code{"Antibiotic"}
|
||||||
|
#' @details At default, the names of antibiotics will be shown on the plots using \code{\link{abname}}. This can be set with the option \code{get_antibiotic_names} (a logical value), so change it e.g. to \code{FALSE} with \code{options(get_antibiotic_names = FALSE)}.
|
||||||
|
#'
|
||||||
|
#' \strong{The functions}\cr
|
||||||
|
#' \code{geom_rsi} will take any variable from the data that has an \code{rsi} class (created with \code{\link{as.rsi}}) using \code{\link{portion_df}} and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis.
|
||||||
|
#'
|
||||||
|
#' \code{facet_rsi} creates 2d plots (at default based on S/I/R) using \code{\link{facet_wrap}}.
|
||||||
|
#'
|
||||||
|
#' \code{scale_y_percent} transforms the y axis to a 0 to 100% range.
|
||||||
|
#'
|
||||||
|
#' \code{scale_rsi_colours} sets colours to the bars: green for S, yellow for I and red for R.
|
||||||
|
#'
|
||||||
|
#' \code{theme_rsi} is a \code{\link{theme}} with minimal distraction.
|
||||||
|
#'
|
||||||
|
#' \code{ggplot_rsi} is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (\code{\%>\%}). See Examples.
|
||||||
|
#' @rdname ggplot_rsi
|
||||||
|
#' @export
|
||||||
|
#' @examples
|
||||||
|
#' library(dplyr)
|
||||||
|
#' library(ggplot2)
|
||||||
|
#'
|
||||||
|
#' # get antimicrobial results for drugs against a UTI:
|
||||||
|
#' ggplot(septic_patients %>% select(amox, nitr, fosf, trim, cipr)) +
|
||||||
|
#' geom_rsi()
|
||||||
|
#'
|
||||||
|
#' # prettify it using some additional functions
|
||||||
|
#' df <- septic_patients[, c("amox", "nitr", "fosf", "trim", "cipr")]
|
||||||
|
#' ggplot(df) +
|
||||||
|
#' geom_rsi(x = "Interpretation") +
|
||||||
|
#' facet_rsi(facet = "Antibiotic") +
|
||||||
|
#' scale_y_percent() +
|
||||||
|
#' scale_rsi_colours() +
|
||||||
|
#' theme_rsi()
|
||||||
|
#'
|
||||||
|
#' # or better yet, simplify this using the wrapper function - a single command:
|
||||||
|
#' septic_patients %>%
|
||||||
|
#' select(amox, nitr, fosf, trim, cipr) %>%
|
||||||
|
#' ggplot_rsi()
|
||||||
|
#'
|
||||||
|
#' septic_patients %>%
|
||||||
|
#' select(amox, nitr, fosf, trim, cipr) %>%
|
||||||
|
#' ggplot_rsi(x = "Interpretation", facet = "Antibiotic")
|
||||||
|
ggplot_rsi <- function(data,
|
||||||
|
x = "Antibiotic",
|
||||||
|
facet = NULL) {
|
||||||
|
p <- ggplot2::ggplot(data = data) +
|
||||||
|
geom_rsi(x = x) +
|
||||||
|
scale_y_percent() +
|
||||||
|
scale_rsi_colours() +
|
||||||
|
theme_rsi()
|
||||||
|
|
||||||
|
if (!is.null(facet)) {
|
||||||
|
p <- p + facet_rsi(facet = facet)
|
||||||
|
}
|
||||||
|
|
||||||
|
p
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname ggplot_rsi
|
||||||
|
#' @export
|
||||||
|
geom_rsi <- function(position = "stack", x = c("Antibiotic", "Interpretation")) {
|
||||||
|
|
||||||
|
x <- x[1]
|
||||||
|
if (!x %in% c("Antibiotic", "Interpretation")) {
|
||||||
|
stop("`x` must be 'Antibiotic' or 'Interpretation'")
|
||||||
|
}
|
||||||
|
|
||||||
|
ggplot2::layer(geom = "bar", stat = "identity", position = position,
|
||||||
|
mapping = ggplot2::aes_string(x = x, y = "Percentage", fill = "Interpretation"),
|
||||||
|
data = AMR::portion_df, params = list())
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname ggplot_rsi
|
||||||
|
#' @export
|
||||||
|
facet_rsi <- function(facet = c("Interpretation", "Antibiotic")) {
|
||||||
|
facet <- facet[1]
|
||||||
|
if (!facet %in% c("Antibiotic", "Interpretation")) {
|
||||||
|
stop("`facet` must be 'Antibiotic' or 'Interpretation'")
|
||||||
|
}
|
||||||
|
ggplot2::facet_wrap(facets = facet, scales = "free")
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname ggplot_rsi
|
||||||
|
#' @export
|
||||||
|
scale_y_percent <- function() {
|
||||||
|
ggplot2::scale_y_continuous(name = "Percentage",
|
||||||
|
breaks = seq(0, 1, 0.1),
|
||||||
|
limits = c(0, 1),
|
||||||
|
labels = percent(seq(0, 1, 0.1)))
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname ggplot_rsi
|
||||||
|
#' @export
|
||||||
|
scale_rsi_colours <- function() {
|
||||||
|
ggplot2::scale_fill_brewer(palette = "RdYlGn")
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname ggplot_rsi
|
||||||
|
#' @export
|
||||||
|
theme_rsi <- function() {
|
||||||
|
theme_minimal() +
|
||||||
|
theme(panel.grid.major.x = element_blank(),
|
||||||
|
panel.grid.minor = element_blank(),
|
||||||
|
panel.grid.major.y = element_line(colour = "grey75"))
|
||||||
|
}
|
@ -17,6 +17,14 @@
|
|||||||
# ==================================================================== #
|
# ==================================================================== #
|
||||||
|
|
||||||
globalVariables(c('abname',
|
globalVariables(c('abname',
|
||||||
|
'Antibiotic',
|
||||||
|
'Interpretation',
|
||||||
|
'Percentage',
|
||||||
|
'bind_rows',
|
||||||
|
'element_blank',
|
||||||
|
'element_line',
|
||||||
|
'theme',
|
||||||
|
'theme_minimal',
|
||||||
'antibiotic',
|
'antibiotic',
|
||||||
'antibiotics',
|
'antibiotics',
|
||||||
'atc',
|
'atc',
|
||||||
|
36
R/portion.R
36
R/portion.R
@ -25,8 +25,12 @@
|
|||||||
#' @param ab2 like \code{ab}, a vector of antibiotic interpretations. Use this to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See Examples.
|
#' @param ab2 like \code{ab}, a vector of antibiotic interpretations. Use this to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See Examples.
|
||||||
#' @param minimum minimal amount of available isolates. Any number lower than \code{minimum} will return \code{NA}. The default number of \code{30} isolates is advised by the CLSI as best practice, see Source.
|
#' @param minimum minimal amount of available isolates. Any number lower than \code{minimum} will return \code{NA}. The default number of \code{30} isolates is advised by the CLSI as best practice, see Source.
|
||||||
#' @param as_percent logical to indicate whether the output must be returned as percent (text), will else be a double
|
#' @param as_percent logical to indicate whether the output must be returned as percent (text), will else be a double
|
||||||
|
#' @param data a code{data.frame} containing columns with class \code{rsi} (see \code{\link{as.rsi}})
|
||||||
|
#' @param translate a logical value to indicate whether antibiotic abbreviations should be translated with \code{\link{abname}}
|
||||||
#' @details \strong{Remember that you should filter your table to let it contain only first isolates!} Use \code{\link{first_isolate}} to determine them in your data set.
|
#' @details \strong{Remember that you should filter your table to let it contain only first isolates!} Use \code{\link{first_isolate}} to determine them in your data set.
|
||||||
#'
|
#'
|
||||||
|
#' \code{portion_df} takes any variable from \code{data} that has an \code{"rsi"} class (created with \code{\link{as.rsi}}) and calculates the portions R, I and S. The resulting \code{data.frame} will have three rows (for R/I/S) and a column for each variable with class \code{"rsi"}.
|
||||||
|
#'
|
||||||
#' The old \code{\link{rsi}} function is still available for backwards compatibility but is deprecated.
|
#' The old \code{\link{rsi}} function is still available for backwards compatibility but is deprecated.
|
||||||
#' \if{html}{
|
#' \if{html}{
|
||||||
#' \cr\cr
|
#' \cr\cr
|
||||||
@ -225,11 +229,11 @@ rsi_calc <- function(type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (type == "S") {
|
if (type == "S") {
|
||||||
found <- .Call(`_AMR_rsi_calc_S`, x, include_I)
|
found <- sum(as.integer(x) <= 1 + include_I, na.rm = TRUE)
|
||||||
} else if (type == "I") {
|
} else if (type == "I") {
|
||||||
found <- .Call(`_AMR_rsi_calc_I`, x)
|
found <- sum(as.integer(x) == 2, na.rm = TRUE)
|
||||||
} else if (type == "R") {
|
} else if (type == "R") {
|
||||||
found <- .Call(`_AMR_rsi_calc_R`, x, include_I)
|
found <- sum(as.integer(x) >= 3 - include_I, na.rm = TRUE)
|
||||||
} else {
|
} else {
|
||||||
stop("invalid type")
|
stop("invalid type")
|
||||||
}
|
}
|
||||||
@ -240,3 +244,29 @@ rsi_calc <- function(type,
|
|||||||
found / total
|
found / total
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#' @rdname portion
|
||||||
|
#' @importFrom dplyr bind_cols summarise_if mutate
|
||||||
|
#' @export
|
||||||
|
portion_df <- function(data, translate = getOption("get_antibiotic_names", TRUE)) {
|
||||||
|
resS <- bind_cols(data.frame(Interpretation = "S", stringsAsFactors = FALSE),
|
||||||
|
summarise_if(.tbl = data,
|
||||||
|
.predicate = is.rsi,
|
||||||
|
.funs = portion_S))
|
||||||
|
resI <- bind_cols(data.frame(Interpretation = "I", stringsAsFactors = FALSE),
|
||||||
|
summarise_if(.tbl = data,
|
||||||
|
.predicate = is.rsi,
|
||||||
|
.funs = portion_I))
|
||||||
|
resR <- bind_cols(data.frame(Interpretation = "R", stringsAsFactors = FALSE),
|
||||||
|
summarise_if(.tbl = data,
|
||||||
|
.predicate = is.rsi,
|
||||||
|
.funs = portion_R))
|
||||||
|
|
||||||
|
res <- bind_rows(resS, resI, resR) %>%
|
||||||
|
mutate(Interpretation = factor(Interpretation, levels = c("R", "I", "S"), ordered = TRUE)) %>%
|
||||||
|
tidyr::gather(Antibiotic, Percentage, -Interpretation)
|
||||||
|
if (translate == TRUE) {
|
||||||
|
res <- res %>% mutate(Antibiotic = abname(Antibiotic, from = "guess", to = "official"))
|
||||||
|
}
|
||||||
|
res
|
||||||
|
}
|
||||||
|
4
R/zzz.R
4
R/zzz.R
@ -1,7 +1,3 @@
|
|||||||
.onLoad <- function(libname, pkgname) {
|
.onLoad <- function(libname, pkgname) {
|
||||||
backports::import(pkgname)
|
backports::import(pkgname)
|
||||||
}
|
}
|
||||||
|
|
||||||
#' @importFrom Rcpp evalCpp
|
|
||||||
#' @useDynLib AMR, .registration = TRUE
|
|
||||||
NULL
|
|
||||||
|
34
README.md
34
README.md
@ -50,8 +50,6 @@ And it contains:
|
|||||||
|
|
||||||
With the `MDRO` function (abbreviation of Multi Drug Resistant Organisms), you can check your isolates for exceptional resistance with country-specific guidelines or EUCAST rules. Currently guidelines for Germany and the Netherlands are supported. Please suggest addition of your own country here: [https://github.com/msberends/AMR/issues/new](https://github.com/msberends/AMR/issues/new?title=New%20guideline%20for%20MDRO&body=%3C--%20Please%20add%20your%20country%20code,%20guideline%20name,%20version%20and%20source%20below%20and%20remove%20this%20line--%3E).
|
With the `MDRO` function (abbreviation of Multi Drug Resistant Organisms), you can check your isolates for exceptional resistance with country-specific guidelines or EUCAST rules. Currently guidelines for Germany and the Netherlands are supported. Please suggest addition of your own country here: [https://github.com/msberends/AMR/issues/new](https://github.com/msberends/AMR/issues/new?title=New%20guideline%20for%20MDRO&body=%3C--%20Please%20add%20your%20country%20code,%20guideline%20name,%20version%20and%20source%20below%20and%20remove%20this%20line--%3E).
|
||||||
|
|
||||||
The functions to calculate microbial resistance use expressions that are not evaluated by R itself, but by alternative C++ code that is 25 to 30 times faster than R and uses less memory. This is called *hybrid evaluation*.
|
|
||||||
|
|
||||||
#### Read all changes and new functions in [NEWS.md](NEWS.md).
|
#### Read all changes and new functions in [NEWS.md](NEWS.md).
|
||||||
|
|
||||||
## How to get it?
|
## How to get it?
|
||||||
@ -145,27 +143,21 @@ rsi_data <- as.rsi(c(rep("S", 474), rep("I", 36), rep("R", 370)))
|
|||||||
```
|
```
|
||||||
These functions also try to coerce valid values.
|
These functions also try to coerce valid values.
|
||||||
|
|
||||||
Quick overviews when just printing objects:
|
Quick overviews with `summary`:
|
||||||
```r
|
```r
|
||||||
mic_data
|
summary(rsi_data)
|
||||||
# Class 'mic': 7 isolates
|
# Mode :rsi
|
||||||
#
|
# <NA> :0
|
||||||
# <NA> 0
|
# Sum S :474
|
||||||
#
|
# Sum IR:406
|
||||||
# <=0.128 1 8 16 >=32
|
# -Sum R:370
|
||||||
# 1 1 2 2 1
|
# -Sum I:36
|
||||||
|
|
||||||
rsi_data
|
summary(mic_data)
|
||||||
# Class 'rsi': 880 isolates
|
# Mode:mic
|
||||||
#
|
# <NA>:0
|
||||||
# <NA>: 0
|
# Min.:<=0.128
|
||||||
# Sum of S: 474
|
# Max.:>=32
|
||||||
# Sum of IR: 406
|
|
||||||
# - Sum of R: 370
|
|
||||||
# - Sum of I: 36
|
|
||||||
#
|
|
||||||
# %S %IR %I %R
|
|
||||||
# 53.9 46.1 4.1 42.0
|
|
||||||
```
|
```
|
||||||
|
|
||||||
A plot of `rsi_data`:
|
A plot of `rsi_data`:
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
\code{\link{antibiotics}}
|
\code{\link{antibiotics}}
|
||||||
}
|
}
|
||||||
\usage{
|
\usage{
|
||||||
abname(abcode, from = c("guess", "atc", "molis", "umcg"), to = "official",
|
abname(abcode, from = c("guess", "atc", "molis", "umcg"),
|
||||||
textbetween = " + ", tolower = FALSE)
|
to = "official", textbetween = " + ", tolower = FALSE)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
\item{abcode}{a code or name, like \code{"AMOX"}, \code{"AMCL"} or \code{"J01CA04"}}
|
\item{abcode}{a code or name, like \code{"AMOX"}, \code{"AMCL"} or \code{"J01CA04"}}
|
||||||
|
@ -9,10 +9,11 @@ Methodology of this function is based on: \strong{M39 Analysis and Presentation
|
|||||||
\usage{
|
\usage{
|
||||||
first_isolate(tbl, col_date, col_patient_id, col_bactid = NA,
|
first_isolate(tbl, col_date, col_patient_id, col_bactid = NA,
|
||||||
col_testcode = NA, col_specimen = NA, col_icu = NA,
|
col_testcode = NA, col_specimen = NA, col_icu = NA,
|
||||||
col_keyantibiotics = NA, episode_days = 365, testcodes_exclude = "",
|
col_keyantibiotics = NA, episode_days = 365,
|
||||||
icu_exclude = FALSE, filter_specimen = NA, output_logical = TRUE,
|
testcodes_exclude = "", icu_exclude = FALSE, filter_specimen = NA,
|
||||||
type = "keyantibiotics", ignore_I = TRUE, points_threshold = 2,
|
output_logical = TRUE, type = "keyantibiotics", ignore_I = TRUE,
|
||||||
info = TRUE, col_genus = NA, col_species = NA)
|
points_threshold = 2, info = TRUE, col_genus = NA,
|
||||||
|
col_species = NA)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
\item{tbl}{a \code{data.frame} containing isolates.}
|
\item{tbl}{a \code{data.frame} containing isolates.}
|
||||||
|
10
man/freq.Rd
10
man/freq.Rd
@ -7,9 +7,9 @@
|
|||||||
\alias{print.frequency_tbl}
|
\alias{print.frequency_tbl}
|
||||||
\title{Frequency table}
|
\title{Frequency table}
|
||||||
\usage{
|
\usage{
|
||||||
frequency_tbl(x, ..., sort.count = TRUE, nmax = getOption("max.print.freq"),
|
frequency_tbl(x, ..., sort.count = TRUE,
|
||||||
na.rm = TRUE, row.names = TRUE, markdown = FALSE, digits = 2,
|
nmax = getOption("max.print.freq"), na.rm = TRUE, row.names = TRUE,
|
||||||
sep = " ")
|
markdown = FALSE, digits = 2, sep = " ")
|
||||||
|
|
||||||
freq(x, ..., sort.count = TRUE, nmax = getOption("max.print.freq"),
|
freq(x, ..., sort.count = TRUE, nmax = getOption("max.print.freq"),
|
||||||
na.rm = TRUE, row.names = TRUE, markdown = FALSE, digits = 2,
|
na.rm = TRUE, row.names = TRUE, markdown = FALSE, digits = 2,
|
||||||
@ -17,8 +17,8 @@ freq(x, ..., sort.count = TRUE, nmax = getOption("max.print.freq"),
|
|||||||
|
|
||||||
top_freq(f, n)
|
top_freq(f, n)
|
||||||
|
|
||||||
\method{print}{frequency_tbl}(x, nmax = getOption("max.print.freq", default =
|
\method{print}{frequency_tbl}(x, nmax = getOption("max.print.freq",
|
||||||
15), ...)
|
default = 15), ...)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
\item{x}{vector of any class or a \code{\link{data.frame}}, \code{\link{tibble}} or \code{\link{table}}}
|
\item{x}{vector of any class or a \code{\link{data.frame}}, \code{\link{tibble}} or \code{\link{table}}}
|
||||||
|
@ -12,7 +12,8 @@ This code is almost identical to \code{\link{chisq.test}}, except that:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
\usage{
|
\usage{
|
||||||
g.test(x, y = NULL, p = rep(1/length(x), length(x)), rescale.p = FALSE)
|
g.test(x, y = NULL, p = rep(1/length(x), length(x)),
|
||||||
|
rescale.p = FALSE)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
\item{x}{a numeric vector or matrix. \code{x} and \code{y} can also
|
\item{x}{a numeric vector or matrix. \code{x} and \code{y} can also
|
||||||
|
77
man/ggplot_rsi.Rd
Normal file
77
man/ggplot_rsi.Rd
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
% Generated by roxygen2: do not edit by hand
|
||||||
|
% Please edit documentation in R/ggplot_rsi.R
|
||||||
|
\name{ggplot_rsi}
|
||||||
|
\alias{ggplot_rsi}
|
||||||
|
\alias{geom_rsi}
|
||||||
|
\alias{facet_rsi}
|
||||||
|
\alias{scale_y_percent}
|
||||||
|
\alias{scale_rsi_colours}
|
||||||
|
\alias{theme_rsi}
|
||||||
|
\title{AMR bar plots with \code{ggplot}}
|
||||||
|
\usage{
|
||||||
|
ggplot_rsi(data, x = "Antibiotic", facet = NULL)
|
||||||
|
|
||||||
|
geom_rsi(position = "stack", x = c("Antibiotic", "Interpretation"))
|
||||||
|
|
||||||
|
facet_rsi(facet = c("Interpretation", "Antibiotic"))
|
||||||
|
|
||||||
|
scale_y_percent()
|
||||||
|
|
||||||
|
scale_rsi_colours()
|
||||||
|
|
||||||
|
theme_rsi()
|
||||||
|
}
|
||||||
|
\arguments{
|
||||||
|
\item{data}{a \code{data.frame} with column(s) of class \code{"rsi"} (see \code{\link{as.rsi}})}
|
||||||
|
|
||||||
|
\item{x}{parameter to show on x axis, either \code{"Antibiotic"} (default) or \code{"Interpretation"}}
|
||||||
|
|
||||||
|
\item{facet}{parameter to split plots by, either \code{"Interpretation"} (default) or \code{"Antibiotic"}}
|
||||||
|
|
||||||
|
\item{position}{position adjustment of bars, either \code{"stack"} (default) or \code{"dodge"}}
|
||||||
|
}
|
||||||
|
\description{
|
||||||
|
Use these functions to create bar plots for antimicrobial resistance analysis. All functions rely on internal \code{\link{ggplot}} functions.
|
||||||
|
}
|
||||||
|
\details{
|
||||||
|
At default, the names of antibiotics will be shown on the plots using \code{\link{abname}}. This can be set with the option \code{get_antibiotic_names} (a logical value), so change it e.g. to \code{FALSE} with \code{options(get_antibiotic_names = FALSE)}.
|
||||||
|
|
||||||
|
\strong{The functions}\cr
|
||||||
|
\code{geom_rsi} will take any variable from the data that has an \code{rsi} class (created with \code{\link{as.rsi}}) using \code{\link{portion_df}} and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis.
|
||||||
|
|
||||||
|
\code{facet_rsi} creates 2d plots (at default based on S/I/R) using \code{\link{facet_wrap}}.
|
||||||
|
|
||||||
|
\code{scale_y_percent} transforms the y axis to a 0 to 100% range.
|
||||||
|
|
||||||
|
\code{scale_rsi_colours} sets colours to the bars: green for S, yellow for I and red for R.
|
||||||
|
|
||||||
|
\code{theme_rsi} is a \code{\link{theme}} with minimal distraction.
|
||||||
|
|
||||||
|
\code{ggplot_rsi} is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (\code{\%>\%}). See Examples.
|
||||||
|
}
|
||||||
|
\examples{
|
||||||
|
library(dplyr)
|
||||||
|
library(ggplot2)
|
||||||
|
|
||||||
|
# get antimicrobial results for drugs against a UTI:
|
||||||
|
ggplot(septic_patients \%>\% select(amox, nitr, fosf, trim, cipr)) +
|
||||||
|
geom_rsi()
|
||||||
|
|
||||||
|
# prettify it using some additional functions
|
||||||
|
df <- septic_patients[, c("amox", "nitr", "fosf", "trim", "cipr")]
|
||||||
|
ggplot(df) +
|
||||||
|
geom_rsi(x = "Interpretation") +
|
||||||
|
facet_rsi(facet = "Antibiotic") +
|
||||||
|
scale_y_percent() +
|
||||||
|
scale_rsi_colours() +
|
||||||
|
theme_rsi()
|
||||||
|
|
||||||
|
# or better yet, simplify this using the wrapper function - a single command:
|
||||||
|
septic_patients \%>\%
|
||||||
|
select(amox, nitr, fosf, trim, cipr) \%>\%
|
||||||
|
ggplot_rsi()
|
||||||
|
|
||||||
|
septic_patients \%>\%
|
||||||
|
select(amox, nitr, fosf, trim, cipr) \%>\%
|
||||||
|
ggplot_rsi(x = "Interpretation", facet = "Antibiotic")
|
||||||
|
}
|
@ -7,6 +7,7 @@
|
|||||||
\alias{portion_I}
|
\alias{portion_I}
|
||||||
\alias{portion_SI}
|
\alias{portion_SI}
|
||||||
\alias{portion_S}
|
\alias{portion_S}
|
||||||
|
\alias{portion_df}
|
||||||
\title{Calculate resistance of isolates}
|
\title{Calculate resistance of isolates}
|
||||||
\source{
|
\source{
|
||||||
\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/}.
|
\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/}.
|
||||||
@ -21,6 +22,8 @@ portion_I(ab1, minimum = 30, as_percent = FALSE)
|
|||||||
portion_SI(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
portion_SI(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
portion_S(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
portion_S(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
|
portion_df(data, translate = getOption("get_antibiotic_names", TRUE))
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
\item{ab1}{vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}} if needed}
|
\item{ab1}{vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}} if needed}
|
||||||
@ -30,6 +33,10 @@ portion_S(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
|||||||
\item{minimum}{minimal amount of available isolates. Any number lower than \code{minimum} will return \code{NA}. The default number of \code{30} isolates is advised by the CLSI as best practice, see Source.}
|
\item{minimum}{minimal amount of available isolates. Any number lower than \code{minimum} will return \code{NA}. The default number of \code{30} isolates is advised by the CLSI as best practice, see Source.}
|
||||||
|
|
||||||
\item{as_percent}{logical to indicate whether the output must be returned as percent (text), will else be a double}
|
\item{as_percent}{logical to indicate whether the output must be returned as percent (text), will else be a double}
|
||||||
|
|
||||||
|
\item{data}{a code{data.frame} containing columns with class \code{rsi} (see \code{\link{as.rsi}})}
|
||||||
|
|
||||||
|
\item{translate}{a logical value to indicate whether antibiotic abbreviations should be translated with \code{\link{abname}}}
|
||||||
}
|
}
|
||||||
\value{
|
\value{
|
||||||
Double or, when \code{as_percent = TRUE}, a character.
|
Double or, when \code{as_percent = TRUE}, a character.
|
||||||
@ -42,6 +49,8 @@ These functions can be used to calculate the (co-)resistance of microbial isolat
|
|||||||
\details{
|
\details{
|
||||||
\strong{Remember that you should filter your table to let it contain only first isolates!} Use \code{\link{first_isolate}} to determine them in your data set.
|
\strong{Remember that you should filter your table to let it contain only first isolates!} Use \code{\link{first_isolate}} to determine them in your data set.
|
||||||
|
|
||||||
|
\code{portion_df} takes any variable from \code{data} that has an \code{"rsi"} class (created with \code{\link{as.rsi}}) and calculates the portions R, I and S. The resulting \code{data.frame} will have three rows (for R/I/S) and a column for each variable with class \code{"rsi"}.
|
||||||
|
|
||||||
The old \code{\link{rsi}} function is still available for backwards compatibility but is deprecated.
|
The old \code{\link{rsi}} function is still available for backwards compatibility but is deprecated.
|
||||||
\if{html}{
|
\if{html}{
|
||||||
\cr\cr
|
\cr\cr
|
||||||
|
@ -5,9 +5,10 @@
|
|||||||
\alias{rsi_predict}
|
\alias{rsi_predict}
|
||||||
\title{Predict antimicrobial resistance}
|
\title{Predict antimicrobial resistance}
|
||||||
\usage{
|
\usage{
|
||||||
resistance_predict(tbl, col_ab, col_date, year_min = NULL, year_max = NULL,
|
resistance_predict(tbl, col_ab, col_date, year_min = NULL,
|
||||||
year_every = 1, minimum = 30, model = "binomial", I_as_R = TRUE,
|
year_max = NULL, year_every = 1, minimum = 30,
|
||||||
preserve_measurements = TRUE, info = TRUE)
|
model = "binomial", I_as_R = TRUE, preserve_measurements = TRUE,
|
||||||
|
info = TRUE)
|
||||||
|
|
||||||
rsi_predict(tbl, col_ab, col_date, year_min = NULL, year_max = NULL,
|
rsi_predict(tbl, col_ab, col_date, year_min = NULL, year_max = NULL,
|
||||||
year_every = 1, minimum = 30, model = "binomial", I_as_R = TRUE,
|
year_every = 1, minimum = 30, model = "binomial", I_as_R = TRUE,
|
||||||
|
@ -1,54 +0,0 @@
|
|||||||
// Generated by using Rcpp::compileAttributes() -> do not edit by hand
|
|
||||||
// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393
|
|
||||||
|
|
||||||
#include <Rcpp.h>
|
|
||||||
|
|
||||||
using namespace Rcpp;
|
|
||||||
|
|
||||||
// rsi_calc_S
|
|
||||||
int rsi_calc_S(DoubleVector x, bool include_I);
|
|
||||||
RcppExport SEXP _AMR_rsi_calc_S(SEXP xSEXP, SEXP include_ISEXP) {
|
|
||||||
BEGIN_RCPP
|
|
||||||
Rcpp::RObject rcpp_result_gen;
|
|
||||||
Rcpp::RNGScope rcpp_rngScope_gen;
|
|
||||||
Rcpp::traits::input_parameter< DoubleVector >::type x(xSEXP);
|
|
||||||
Rcpp::traits::input_parameter< bool >::type include_I(include_ISEXP);
|
|
||||||
rcpp_result_gen = Rcpp::wrap(rsi_calc_S(x, include_I));
|
|
||||||
return rcpp_result_gen;
|
|
||||||
END_RCPP
|
|
||||||
}
|
|
||||||
// rsi_calc_I
|
|
||||||
int rsi_calc_I(DoubleVector x);
|
|
||||||
RcppExport SEXP _AMR_rsi_calc_I(SEXP xSEXP) {
|
|
||||||
BEGIN_RCPP
|
|
||||||
Rcpp::RObject rcpp_result_gen;
|
|
||||||
Rcpp::RNGScope rcpp_rngScope_gen;
|
|
||||||
Rcpp::traits::input_parameter< DoubleVector >::type x(xSEXP);
|
|
||||||
rcpp_result_gen = Rcpp::wrap(rsi_calc_I(x));
|
|
||||||
return rcpp_result_gen;
|
|
||||||
END_RCPP
|
|
||||||
}
|
|
||||||
// rsi_calc_R
|
|
||||||
int rsi_calc_R(DoubleVector x, bool include_I);
|
|
||||||
RcppExport SEXP _AMR_rsi_calc_R(SEXP xSEXP, SEXP include_ISEXP) {
|
|
||||||
BEGIN_RCPP
|
|
||||||
Rcpp::RObject rcpp_result_gen;
|
|
||||||
Rcpp::RNGScope rcpp_rngScope_gen;
|
|
||||||
Rcpp::traits::input_parameter< DoubleVector >::type x(xSEXP);
|
|
||||||
Rcpp::traits::input_parameter< bool >::type include_I(include_ISEXP);
|
|
||||||
rcpp_result_gen = Rcpp::wrap(rsi_calc_R(x, include_I));
|
|
||||||
return rcpp_result_gen;
|
|
||||||
END_RCPP
|
|
||||||
}
|
|
||||||
|
|
||||||
static const R_CallMethodDef CallEntries[] = {
|
|
||||||
{"_AMR_rsi_calc_S", (DL_FUNC) &_AMR_rsi_calc_S, 2},
|
|
||||||
{"_AMR_rsi_calc_I", (DL_FUNC) &_AMR_rsi_calc_I, 1},
|
|
||||||
{"_AMR_rsi_calc_R", (DL_FUNC) &_AMR_rsi_calc_R, 2},
|
|
||||||
{NULL, NULL, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
RcppExport void R_init_AMR(DllInfo *dll) {
|
|
||||||
R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
|
|
||||||
R_useDynamicSymbols(dll, FALSE);
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
#include <Rcpp.h>
|
|
||||||
|
|
||||||
using namespace Rcpp;
|
|
||||||
|
|
||||||
// [[Rcpp::export]]
|
|
||||||
int rsi_calc_S(DoubleVector x, bool include_I) {
|
|
||||||
return count_if(x.begin(),
|
|
||||||
x.end(),
|
|
||||||
bind2nd(std::less_equal<double>(),
|
|
||||||
1 + include_I));
|
|
||||||
}
|
|
||||||
|
|
||||||
// [[Rcpp::export]]
|
|
||||||
int rsi_calc_I(DoubleVector x) {
|
|
||||||
return count_if(x.begin(),
|
|
||||||
x.end(),
|
|
||||||
bind2nd(std::equal_to<double>(),
|
|
||||||
2));
|
|
||||||
}
|
|
||||||
|
|
||||||
// [[Rcpp::export]]
|
|
||||||
int rsi_calc_R(DoubleVector x, bool include_I) {
|
|
||||||
return count_if(x.begin(),
|
|
||||||
x.end(),
|
|
||||||
bind2nd(std::greater_equal<double>(),
|
|
||||||
3 - include_I));
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user