From 74e0ae21fd7c54fda72cc41b6ae13e8dd7b14be8 Mon Sep 17 00:00:00 2001
From: "Matthijs S. Berends"
Date: Tue, 5 Mar 2019 22:47:42 +0100
Subject: [PATCH] con WHONET, filter ab class
---
.gitlab-ci.yml | 2 +-
DESCRIPTION | 4 +-
NAMESPACE | 12 +
R/filter_ab_class.R | 268 ++++++++++
R/mo.R | 51 +-
R/mo_source.R | 43 +-
docs/LICENSE-text.html | 2 +-
docs/articles/AMR.html | 467 +++++++++---------
.../AMR_files/figure-html/plot 1-1.png | Bin 35509 -> 35640 bytes
.../AMR_files/figure-html/plot 3-1.png | Bin 21133 -> 21140 bytes
.../AMR_files/figure-html/plot 4-1.png | Bin 69624 -> 69626 bytes
.../AMR_files/figure-html/plot 5-1.png | Bin 51368 -> 51370 bytes
docs/articles/EUCAST.html | 4 +-
docs/articles/G_test.html | 4 +-
docs/articles/SPSS.html | 2 +-
docs/articles/WHONET.html | 4 +-
docs/articles/atc_property.html | 4 +-
docs/articles/benchmarks.html | 78 +--
.../figure-html/unnamed-chunk-5-1.png | Bin 28890 -> 28582 bytes
docs/articles/freq.html | 4 +-
docs/articles/index.html | 2 +-
docs/articles/mo_property.html | 4 +-
docs/articles/resistance_predict.html | 4 +-
docs/authors.html | 2 +-
docs/index.html | 2 +-
docs/news/index.html | 2 +-
docs/reference/AMR-deprecated.html | 2 +-
docs/reference/AMR.html | 2 +-
docs/reference/WHOCC.html | 2 +-
docs/reference/WHONET.html | 2 +-
docs/reference/abname.html | 2 +-
docs/reference/age.html | 2 +-
docs/reference/age_groups.html | 2 +-
docs/reference/antibiotics.html | 2 +-
docs/reference/as.atc.html | 2 +-
docs/reference/as.mic.html | 2 +-
docs/reference/as.mo.html | 2 +-
docs/reference/as.rsi.html | 2 +-
docs/reference/atc_online.html | 2 +-
docs/reference/atc_property.html | 2 +-
docs/reference/availability.html | 2 +-
docs/reference/catalogue_of_life.html | 2 +-
docs/reference/catalogue_of_life_version.html | 2 +-
docs/reference/count.html | 2 +-
docs/reference/eucast_rules.html | 2 +-
docs/reference/filter_ab_class.html | 369 ++++++++++++++
docs/reference/first_isolate.html | 2 +-
docs/reference/freq.html | 2 +-
docs/reference/g.test.html | 2 +-
docs/reference/get_locale.html | 2 +-
docs/reference/ggplot_rsi.html | 2 +-
docs/reference/guess_ab_col.html | 2 +-
docs/reference/index.html | 2 +-
docs/reference/join.html | 2 +-
docs/reference/key_antibiotics.html | 2 +-
docs/reference/kurtosis.html | 2 +-
docs/reference/like.html | 2 +-
docs/reference/mdro.html | 2 +-
docs/reference/microorganisms.codes.html | 2 +-
docs/reference/microorganisms.html | 2 +-
docs/reference/microorganisms.old.html | 2 +-
docs/reference/mo_property.html | 2 +-
docs/reference/mo_source.html | 2 +-
docs/reference/p.symbol.html | 2 +-
docs/reference/portion.html | 2 +-
docs/reference/read.4D.html | 2 +-
docs/reference/resistance_predict.html | 2 +-
docs/reference/rsi.html | 2 +-
docs/reference/septic_patients.html | 2 +-
docs/reference/skewness.html | 2 +-
docs/sitemap.xml | 3 +
man/filter_ab_class.Rd | 82 +++
tests/testthat/test-filter_ab_class.R | 44 ++
73 files changed, 1174 insertions(+), 375 deletions(-)
create mode 100644 R/filter_ab_class.R
create mode 100644 docs/reference/filter_ab_class.html
create mode 100644 man/filter_ab_class.Rd
create mode 100644 tests/testthat/test-filter_ab_class.R
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f57d3bae..a4051166 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -97,7 +97,7 @@ pages:
script:
#- Rscript -e "install.packages('pkgdown', repos = 'https://cran.rstudio.com')"
- Rscript -e "devtools::install(build = TRUE, upgrade = FALSE)"
- - R -e "pkgdown::build_site(examples = FALSE, override = list(destination = 'public'))"
+ - R -e "pkgdown::build_site(examples = FALSE, lazy = TRUE, override = list(destination = 'public'))"
artifacts:
paths:
- public
diff --git a/DESCRIPTION b/DESCRIPTION
index dd487ba3..f00fe5e6 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,6 +1,6 @@
Package: AMR
-Version: 0.5.0.9020
-Date: 2019-03-02
+Version: 0.5.0.9021
+Date: 2019-03-05
Title: Antimicrobial Resistance Analysis
Authors@R: c(
person(
diff --git a/NAMESPACE b/NAMESPACE
index 44c0422e..f55cd80c 100755
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -81,8 +81,20 @@ export(count_df)
export(eucast_exceptional_phenotypes)
export(eucast_rules)
export(facet_rsi)
+export(filter_1st_cephalosporins)
+export(filter_2nd_cephalosporins)
+export(filter_3rd_cephalosporins)
+export(filter_4th_cephalosporins)
+export(filter_ab_class)
+export(filter_aminoglycosides)
+export(filter_carbapenems)
+export(filter_cephalosporins)
export(filter_first_isolate)
export(filter_first_weighted_isolate)
+export(filter_fluoroquinolones)
+export(filter_glycopeptides)
+export(filter_macrolides)
+export(filter_tetracyclines)
export(first_isolate)
export(freq)
export(frequency_tbl)
diff --git a/R/filter_ab_class.R b/R/filter_ab_class.R
new file mode 100644
index 00000000..fed9838a
--- /dev/null
+++ b/R/filter_ab_class.R
@@ -0,0 +1,268 @@
+# ==================================================================== #
+# TITLE #
+# Antimicrobial Resistance (AMR) Analysis #
+# #
+# SOURCE #
+# https://gitlab.com/msberends/AMR #
+# #
+# LICENCE #
+# (c) 2019 Berends MS (m.s.berends@umcg.nl), Luz CF (c.f.luz@umcg.nl) #
+# #
+# This R package is free software; you can freely use and distribute #
+# it for both personal and commercial purposes under the terms of the #
+# GNU General Public License version 2.0 (GNU GPL-2), as published by #
+# the Free Software Foundation. #
+# #
+# This R package was created for academic research and was publicly #
+# released in the hope that it will be useful, but it comes WITHOUT #
+# ANY WARRANTY OR LIABILITY. #
+# Visit our website for more info: https://msberends.gitab.io/AMR. #
+# ==================================================================== #
+
+#' Filter on antibiotic class
+#'
+#' Filter on specific antibiotic variables based on their class (ATC groups).
+#' @param tbl a data set
+#' @param ab_class an antimicrobial class, like \code{"carbapenems"}
+#' @param result an antibiotic result: S, I or R (or a combination of more of them)
+#' @param scope the scope to check which variables to check, can be \code{"any"} (default) or \code{"all"}
+#' @param ... parameters passed on to \code{\link[dplyr]{filter_at}}
+#' @details The \code{\code{antibiotics}} data set will be searched for \code{ab_class} in the columns \code{atc_group1} and \code{atc_group2} (case-insensitive). Next, \code{tbl} will be checked for column names with a value in any abbreviations, codes or official names found in the \code{antibiotics} data set.
+#' @rdname filter_ab_class
+#' @importFrom dplyr filter_at %>% select vars any_vars all_vars
+#' @importFrom crayon bold blue
+#' @export
+#' @examples
+#' library(dplyr)
+#'
+#' # filter on isolates that have any result for any aminoglycoside
+#' septic_patients %>% filter_aminoglycosides()
+#'
+#' # this is essentially the same as:
+#' septic_patients %>%
+#' filter_at(.vars = vars(c("gent", "tobr", "amik", "kana")),
+#' .vars_predicate = any_vars(. %in% c("S", "I", "R")))
+#'
+#'
+#' # filter on isolates that show resistance to ANY aminoglycoside
+#' septic_patients %>% filter_aminoglycosides("R")
+#'
+#' # filter on isolates that show resistance to ALL aminoglycosides
+#' septic_patients %>% filter_aminoglycosides("R", "all")
+#'
+#' # filter on isolates that show resistance to
+#' # any aminoglycoside and any fluoroquinolone
+#' septic_patients %>%
+#' filter_aminoglycosides("R", "any") %>%
+#' filter_fluoroquinolones("R", "any")
+filter_ab_class <- function(tbl,
+ ab_class,
+ result = NULL,
+ scope = "any",
+ ...) {
+ scope <- scope[1L]
+ if (is.null(result)) {
+ result <- c("S", "I", "R")
+ }
+
+ if (!all(result %in% c("S", "I", "R"))) {
+ stop("`result` must be one or more of: S, I, R", call. = FALSE)
+ }
+ if (!all(scope %in% c("any", "all"))) {
+ stop("`scope` must be one of: any, all", call. = FALSE)
+ }
+
+ vars_df <- colnames(tbl)[tolower(colnames(tbl)) %in% tolower(ab_class_vars(ab_class))]
+ atc_groups <- ab_class_atcgroups(ab_class)
+
+ if (length(vars_df) > 0) {
+ if (length(result) == 1) {
+ operator <- " is "
+ } else {
+ operator <- " is one of "
+ }
+ if (scope == "any") {
+ scope_txt <- " or "
+ scope_fn <- any_vars
+ } else {
+ scope_txt <- " and "
+ scope_fn <- all_vars
+ }
+ message(blue(paste0("Filtering on ", atc_groups, ": ", scope, " of ",
+ paste(bold(vars_df), collapse = scope_txt), operator, toString(result))))
+ tbl %>%
+ filter_at(.vars = vars(vars_df),
+ .vars_predicate = scope_fn(. %in% result),
+ ...)
+ } else {
+ warning(paste0("no antibiotics of class ", atc_groups, " found, leaving data unchanged"), call. = FALSE)
+ tbl
+ }
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_aminoglycosides <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "aminoglycoside",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_carbapenems <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "carbapenem",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_cephalosporins <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "cephalosporin",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_1st_cephalosporins <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "first-generation cephalosporin",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_2nd_cephalosporins <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "second-generation cephalosporin",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_3rd_cephalosporins <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "third-generation cephalosporin",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_4th_cephalosporins <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "fourth-generation cephalosporin",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_fluoroquinolones <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "fluoroquinolone",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_glycopeptides <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "glycopeptide",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_macrolides <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "macrolide",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @rdname filter_ab_class
+#' @export
+filter_tetracyclines <- function(tbl,
+ result = NULL,
+ scope = "any",
+ ...) {
+ filter_ab_class(tbl = tbl,
+ ab_class = "tetracycline",
+ result = result,
+ scope = scope,
+ ...)
+}
+
+#' @importFrom dplyr %>% filter_at any_vars select
+ab_class_vars <- function(ab_class) {
+ ab_vars <- AMR::antibiotics %>%
+ filter_at(vars(c("atc_group1", "atc_group2")), any_vars(. %like% ab_class)) %>%
+ select(atc:trade_name) %>%
+ as.matrix() %>%
+ as.character() %>%
+ paste(collapse = "|") %>%
+ strsplit("|", fixed = TRUE) %>%
+ unlist() %>%
+ unique()
+ ab_vars[!is.na(ab_vars)]
+}
+
+#' @importFrom dplyr %>% filter pull
+ab_class_atcgroups <- function(ab_class) {
+ AMR::antibiotics %>%
+ filter(atc %in% ab_class_vars(ab_class)) %>%
+ pull("atc_group2") %>%
+ unique() %>%
+ tolower() %>%
+ paste(collapse = "/")
+}
diff --git a/R/mo.R b/R/mo.R
index 856f68ba..b15f0268 100755
--- a/R/mo.R
+++ b/R/mo.R
@@ -174,14 +174,26 @@ as.mo <- function(x, Becker = FALSE, Lancefield = FALSE, allow_uncertain = TRUE,
# check onLoad() in R/zzz.R: data tables are created there.
}
- if (deparse(substitute(reference_df)) == "get_mo_source()"
+ if (mo_source_isvalid(reference_df)
& isFALSE(Becker)
& isFALSE(Lancefield)
& !is.null(reference_df)
- & all(x %in% reference_df[,1])) {
+ & all(x %in% reference_df[,1][[1]])) {
+
# has valid own reference_df
# (data.table not faster here)
+ reference_df <- reference_df %>% filter(!is.na(mo))
+ # keep only first two columns, second must be mo
+ if (colnames(reference_df)[1] == "mo") {
+ reference_df <- reference_df[, c(2, 1)]
+ } else {
+ reference_df <- reference_df[, c(1, 2)]
+ }
colnames(reference_df)[1] <- "x"
+ # remove factors, just keep characters
+ suppressWarnings(
+ reference_df[] <- lapply(reference_df, as.character)
+ )
suppressWarnings(
y <- data.frame(x = x, stringsAsFactors = FALSE) %>%
left_join(reference_df, by = "x") %>%
@@ -277,8 +289,12 @@ exec_as.mo <- function(x, Becker = FALSE, Lancefield = FALSE,
# only check the uniques, which is way faster
x <- unique(x)
# remove empty values (to later fill them in again with NAs)
- # ("xxx" is WHONET code for 'no growth')
- x <- x[!is.na(x) & !is.null(x) & !identical(x, "") & !identical(x, "xxx")]
+ # ("xxx" is WHONET code for 'no growth' and "con" is WHONET code for 'contamination')
+ x <- x[!is.na(x)
+ & !is.null(x)
+ & !identical(x, "")
+ & !identical(x, "xxx")
+ & !identical(x, "con")]
# conversion of old MO codes from v0.5.0 (ITIS) to later versions (Catalogue of Life)
if (any(x %like% "^[BFP]_[A-Z]{3,7}") & !all(x %in% microorganisms$mo)) {
@@ -292,14 +308,18 @@ exec_as.mo <- function(x, Becker = FALSE, Lancefield = FALSE,
# defined df to check for
if (!is.null(reference_df)) {
- if (!is.data.frame(reference_df) | NCOL(reference_df) < 2) {
- stop('`reference_df` must be a data.frame with at least two columns.', call. = FALSE)
- }
- if (!"mo" %in% colnames(reference_df)) {
+ if (!mo_source_isvalid(reference_df)) {
stop("`reference_df` must contain a column `mo` with values from the 'microorganisms' data set.", call. = FALSE)
}
reference_df <- reference_df %>% filter(!is.na(mo))
- # # remove factors, just keep characters
+ # keep only first two columns, second must be mo
+ if (colnames(reference_df)[1] == "mo") {
+ reference_df <- reference_df[, c(2, 1)]
+ } else {
+ reference_df <- reference_df[, c(1, 2)]
+ }
+ colnames(reference_df)[1] <- "x"
+ # remove factors, just keep characters
suppressWarnings(
reference_df[] <- lapply(reference_df, as.character)
)
@@ -314,8 +334,7 @@ exec_as.mo <- function(x, Becker = FALSE, Lancefield = FALSE,
return(rep(NA_character_, length(x_input)))
}
- } else if (all(x %in% reference_df[, 1])
- & all(reference_df[, "mo"] %in% AMR::microorganisms$mo)) {
+ } else if (all(x %in% reference_df[, 1][[1]])) {
# all in reference df
colnames(reference_df)[1] <- "x"
suppressWarnings(
@@ -420,12 +439,12 @@ exec_as.mo <- function(x, Becker = FALSE, Lancefield = FALSE,
next
}
- if (any(x_trimmed[i] %in% c(NA, ""))) {
+ if (any(x_trimmed[i] %in% c(NA, "", "xxx", "con"))) {
x[i] <- NA_character_
next
}
- if (tolower(x_trimmed[i]) %in% c("xxx", "other", "none", "unknown")) {
+ if (tolower(x_trimmed[i]) %in% c("other", "none", "unknown")) {
# empty and nonsense values, ignore without warning
x[i] <- microorganismsDT[mo == "UNKNOWN", ..property][[1]]
next
@@ -959,7 +978,11 @@ exec_as.mo <- function(x, Becker = FALSE, Lancefield = FALSE,
# Wrap up ----------------------------------------------------------------
# comply to x, which is also unique and without empty values
- x_input_unique_nonempty <- unique(x_input[!is.na(x_input) & !is.null(x_input) & !identical(x_input, "") & !identical(x_input, "xxx")])
+ x_input_unique_nonempty <- unique(x_input[!is.na(x_input)
+ & !is.null(x_input)
+ & !identical(x_input, "")
+ & !identical(x_input, "xxx")
+ & !identical(x_input, "con")])
# left join the found results to the original input values (x_input)
df_found <- data.frame(input = as.character(x_input_unique_nonempty),
diff --git a/R/mo_source.R b/R/mo_source.R
index 4a3ae099..34f5f940 100644
--- a/R/mo_source.R
+++ b/R/mo_source.R
@@ -117,22 +117,6 @@ set_mo_source <- function(path) {
stop("File not found: ", path)
}
- is_valid <- function(df) {
- valid <- TRUE
- if (!is.data.frame(df)) {
- valid <- FALSE
- } else if (!"mo" %in% colnames(df)) {
- valid <- FALSE
- } else if (all(as.data.frame(df)[, 1] == "")) {
- valid <- FALSE
- } else if (!all(df$mo %in% c("", AMR::microorganisms$mo))) {
- valid <- FALSE
- } else if (NCOL(df) < 2) {
- valid <- FALSE
- }
- valid
- }
-
if (path %like% '[.]rds$') {
df <- readRDS(path)
@@ -151,13 +135,13 @@ set_mo_source <- function(path) {
try(
df <- utils::read.table(header = TRUE, sep = ",", stringsAsFactors = FALSE),
silent = TRUE)
- if (!is_valid(df)) {
+ if (!mo_source_isvalid(df)) {
# try tab
try(
df <- utils::read.table(header = TRUE, sep = "\t", stringsAsFactors = FALSE),
silent = TRUE)
}
- if (!is_valid(df)) {
+ if (!mo_source_isvalid(df)) {
# try pipe
try(
df <- utils::read.table(header = TRUE, sep = "|", stringsAsFactors = FALSE),
@@ -165,10 +149,12 @@ set_mo_source <- function(path) {
}
}
- if (!is_valid(df)) {
+ if (!mo_source_isvalid(df)) {
stop("File must contain a column with self-defined values and a reference column `mo` with valid values from the `microorganisms` data set.")
}
+ df <- df %>% filter(!is.na(mo))
+
# keep only first two columns, second must be mo
if (colnames(df)[1] == "mo") {
df <- df[, c(2, 1)]
@@ -213,3 +199,22 @@ get_mo_source <- function() {
readRDS("~/.mo_source.rds")
}
+
+mo_source_isvalid <- function(x) {
+ if (deparse(substitute(x)) == "get_mo_source()") {
+ return(TRUE)
+ }
+ if (identical(x, get_mo_source())) {
+ return(TRUE)
+ }
+ if (is.null(x)) {
+ return(TRUE)
+ }
+ if (!is.data.frame(x)) {
+ return(FALSE)
+ }
+ if (!"mo" %in% colnames(x)) {
+ return(FALSE)
+ }
+ all(x$mo %in% c("", AMR::microorganisms$mo))
+}
diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html
index 17b48a67..f4aca6a7 100644
--- a/docs/LICENSE-text.html
+++ b/docs/LICENSE-text.html
@@ -78,7 +78,7 @@
AMR (for R)
- 0.5.0.9020
+ 0.5.0.9021
diff --git a/docs/articles/AMR.html b/docs/articles/AMR.html
index ca96704e..e0076c6e 100644
--- a/docs/articles/AMR.html
+++ b/docs/articles/AMR.html
@@ -40,7 +40,7 @@
AMR (for R)
- 0.5.0.9020
+ 0.5.0.9021
@@ -192,7 +192,7 @@
How to conduct AMR analysis
Matthijs S. Berends
- 02 March 2019
+ 05 March 2019
AMR.Rmd
@@ -201,7 +201,7 @@
-Note: values on this page will change with every website update since they are based on randomly created values and the page was written in RMarkdown. However, the methodology remains unchanged. This page was generated on 02 March 2019.
+Note: values on this page will change with every website update since they are based on randomly created values and the page was written in RMarkdown. However, the methodology remains unchanged. This page was generated on 05 March 2019.
Introduction
@@ -217,21 +217,21 @@
-2019-03-02 |
+2019-03-05 |
abcd |
Escherichia coli |
S |
S |
-2019-03-02 |
+2019-03-05 |
abcd |
Escherichia coli |
S |
R |
-2019-03-02 |
+2019-03-05 |
efgh |
Escherichia coli |
R |
@@ -327,30 +327,52 @@
-2012-06-30 |
+2010-01-23 |
+E2 |
+Hospital B |
+Staphylococcus aureus |
+I |
+S |
+S |
+S |
+M |
+
+
+2017-12-07 |
+L8 |
+Hospital B |
+Staphylococcus aureus |
+S |
+S |
+S |
+S |
+M |
+
+
+2012-07-19 |
W5 |
Hospital A |
Staphylococcus aureus |
S |
-S |
+R |
S |
S |
F |
-2012-07-07 |
-T4 |
-Hospital B |
+2013-11-26 |
+L7 |
+Hospital A |
Escherichia coli |
-R |
-R |
+S |
+S |
R |
S |
-F |
+M |
-2011-02-19 |
-H3 |
+2016-01-24 |
+M7 |
Hospital B |
Escherichia coli |
S |
@@ -360,37 +382,15 @@
M |
-2012-12-15 |
-G10 |
-Hospital C |
-Klebsiella pneumoniae |
-R |
-S |
-R |
-S |
-M |
-
-
-2010-09-11 |
-L4 |
-Hospital D |
-Staphylococcus aureus |
-S |
-S |
-S |
-S |
-M |
-
-
-2011-03-27 |
-H5 |
+2016-11-13 |
+V10 |
Hospital A |
Escherichia coli |
S |
S |
S |
-R |
-M |
+S |
+F |
@@ -411,8 +411,8 @@
#>
#> Item Count Percent Cum. Count Cum. Percent
#> --- ----- ------- -------- ----------- -------------
-#> 1 M 10,433 52.2% 10,433 52.2%
-#> 2 F 9,567 47.8% 20,000 100.0%
+#> 1 M 10,562 52.8% 10,562 52.8%
+#> 2 F 9,438 47.2% 20,000 100.0%
So, we can draw at least two conclusions immediately. From a data scientist perspective, the data looks clean: only values M
and F
. From a researcher perspective: there are slightly more men. Nothing we didn’t already know.
The data is already quite clean, but we still need to transform some variables. The bacteria
column now consists of text, and we want to add more variables based on microbial IDs later on. So, we will transform this column to valid IDs. The mutate()
function of the dplyr
package makes this really easy:
data <- data %>%
@@ -443,10 +443,10 @@
#> Kingella kingae (no changes)
#>
#> EUCAST Expert Rules, Intrinsic Resistance and Exceptional Phenotypes (v3.1, 2016)
-#> Table 1: Intrinsic resistance in Enterobacteriaceae (1323 changes)
+#> Table 1: Intrinsic resistance in Enterobacteriaceae (1344 changes)
#> Table 2: Intrinsic resistance in non-fermentative Gram-negative bacteria (no changes)
#> Table 3: Intrinsic resistance in other Gram-negative bacteria (no changes)
-#> Table 4: Intrinsic resistance in Gram-positive bacteria (2834 changes)
+#> Table 4: Intrinsic resistance in Gram-positive bacteria (2767 changes)
#> Table 8: Interpretive rules for B-lactam agents and Gram-positive cocci (no changes)
#> Table 9: Interpretive rules for B-lactam agents and Gram-negative rods (no changes)
#> Table 10: Interpretive rules for B-lactam agents and other Gram-negative bacteria (no changes)
@@ -462,9 +462,9 @@
#> Non-EUCAST: piperacillin/tazobactam = S where piperacillin = S (no changes)
#> Non-EUCAST: trimethoprim/sulfa = S where trimethoprim = S (no changes)
#>
-#> => EUCAST rules affected 7,524 out of 20,000 rows
+#> => EUCAST rules affected 7,383 out of 20,000 rows
#> -> added 0 test results
-#> -> changed 4,157 test results (0 to S; 0 to I; 4,157 to R)
+
#> -> changed 4,111 test results (0 to S; 0 to I; 4,111 to R)
-So only 28.5% is suitable for resistance analysis! We can now filter on it with the filter()
function, also from the dplyr
package:
+#> => Found 5,676 first isolates (28.4% of total)
+So only 28.4% is suitable for resistance analysis! We can now filter on it with the filter()
function, also from the dplyr
package:
For future use, the above two syntaxes can be shortened with the filter_first_isolate()
function:
@@ -516,21 +516,21 @@
1 |
-2010-01-18 |
-C7 |
+2010-01-20 |
+L10 |
B_ESCHR_COL |
-S |
-S |
+I |
+R |
S |
S |
TRUE |
2 |
-2010-02-27 |
-C7 |
+2010-03-26 |
+L10 |
B_ESCHR_COL |
-S |
+R |
S |
S |
S |
@@ -538,8 +538,8 @@
3 |
-2010-04-22 |
-C7 |
+2010-05-05 |
+L10 |
B_ESCHR_COL |
S |
S |
@@ -549,8 +549,8 @@
4 |
-2010-06-09 |
-C7 |
+2010-06-20 |
+L10 |
B_ESCHR_COL |
S |
S |
@@ -560,19 +560,19 @@
5 |
-2011-04-13 |
-C7 |
+2010-07-10 |
+L10 |
B_ESCHR_COL |
-R |
S |
S |
S |
-TRUE |
+S |
+FALSE |
6 |
-2011-04-25 |
-C7 |
+2010-08-01 |
+L10 |
B_ESCHR_COL |
S |
S |
@@ -582,32 +582,32 @@
7 |
-2011-08-02 |
-C7 |
+2010-08-27 |
+L10 |
B_ESCHR_COL |
R |
S |
-R |
+S |
S |
FALSE |
8 |
-2011-10-19 |
-C7 |
+2010-09-09 |
+L10 |
B_ESCHR_COL |
R |
-I |
+S |
S |
S |
FALSE |
9 |
-2011-10-23 |
-C7 |
+2010-09-26 |
+L10 |
B_ESCHR_COL |
-S |
+R |
S |
S |
S |
@@ -615,18 +615,18 @@
10 |
-2011-11-10 |
-C7 |
+2010-10-11 |
+L10 |
B_ESCHR_COL |
-S |
-S |
R |
S |
+S |
+S |
FALSE |
-Only 2 isolates are marked as ‘first’ according to CLSI guideline. But when reviewing the antibiogram, it is obvious that some isolates are absolutely different strains and should be included too. This is why we weigh isolates, based on their antibiogram. The key_antibiotics()
function adds a vector with 18 key antibiotics: 6 broad spectrum ones, 6 small spectrum for Gram negatives and 6 small spectrum for Gram positives. These can be defined by the user.
+Only 1 isolates are marked as ‘first’ according to CLSI guideline. But when reviewing the antibiogram, it is obvious that some isolates are absolutely different strains and should be included too. This is why we weigh isolates, based on their antibiogram. The key_antibiotics()
function adds a vector with 18 key antibiotics: 6 broad spectrum ones, 6 small spectrum for Gram negatives and 6 small spectrum for Gram positives. These can be defined by the user.
If a column exists with a name like ‘key(…)ab’ the first_isolate()
function will automatically use it and determine the first weighted isolates. Mind the NOTEs in below output:
+#> => Found 15,767 first weighted isolates (78.8% of total)
1 |
-2010-01-18 |
-C7 |
+2010-01-20 |
+L10 |
B_ESCHR_COL |
-S |
-S |
+I |
+R |
S |
S |
TRUE |
@@ -666,32 +666,32 @@
2 |
-2010-02-27 |
-C7 |
+2010-03-26 |
+L10 |
B_ESCHR_COL |
-S |
+R |
S |
S |
S |
FALSE |
-FALSE |
+TRUE |
3 |
-2010-04-22 |
-C7 |
+2010-05-05 |
+L10 |
B_ESCHR_COL |
S |
S |
S |
S |
FALSE |
-FALSE |
+TRUE |
4 |
-2010-06-09 |
-C7 |
+2010-06-20 |
+L10 |
B_ESCHR_COL |
S |
S |
@@ -702,83 +702,83 @@
5 |
-2011-04-13 |
-C7 |
-B_ESCHR_COL |
-R |
-S |
-S |
-S |
-TRUE |
-TRUE |
-
-
-6 |
-2011-04-25 |
-C7 |
+2010-07-10 |
+L10 |
B_ESCHR_COL |
S |
S |
S |
S |
FALSE |
-TRUE |
+FALSE |
+
+
+6 |
+2010-08-01 |
+L10 |
+B_ESCHR_COL |
+S |
+S |
+S |
+S |
+FALSE |
+FALSE |
7 |
-2011-08-02 |
-C7 |
+2010-08-27 |
+L10 |
B_ESCHR_COL |
R |
S |
-R |
+S |
S |
FALSE |
TRUE |
8 |
-2011-10-19 |
-C7 |
+2010-09-09 |
+L10 |
B_ESCHR_COL |
R |
-I |
+S |
S |
S |
FALSE |
-TRUE |
+FALSE |
9 |
-2011-10-23 |
-C7 |
+2010-09-26 |
+L10 |
B_ESCHR_COL |
-S |
+R |
S |
S |
S |
FALSE |
-TRUE |
+FALSE |
10 |
-2011-11-10 |
-C7 |
+2010-10-11 |
+L10 |
B_ESCHR_COL |
-S |
-S |
R |
S |
+S |
+S |
+FALSE |
FALSE |
-TRUE |
-Instead of 2, now 7 isolates are flagged. In total, 79.1% of all isolates are marked ‘first weighted’ - 50.6% more than when using the CLSI guideline. In real life, this novel algorithm will yield 5-10% more isolates than the classic CLSI guideline.
+Instead of 1, now 4 isolates are flagged. In total, 78.8% of all isolates are marked ‘first weighted’ - 50.5% more than when using the CLSI guideline. In real life, this novel algorithm will yield 5-10% more isolates than the classic CLSI guideline.
As with filter_first_isolate()
, there’s a shortcut for this new algorithm too:
-So we end up with 15,826 isolates for analysis.
+So we end up with 15,767 isolates for analysis.
We can remove unneeded columns:
@@ -786,7 +786,6 @@
-2 |
-2012-07-07 |
-T4 |
+2010-01-23 |
+E2 |
Hospital B |
-B_ESCHR_COL |
-R |
-R |
-R |
+B_STPHY_AUR |
+I |
S |
-F |
-Gram negative |
-Escherichia |
-coli |
+S |
+S |
+M |
+Gram positive |
+Staphylococcus |
+aureus |
TRUE |
-3 |
-2011-02-19 |
-H3 |
+2017-12-07 |
+L8 |
Hospital B |
-B_ESCHR_COL |
-S |
-S |
-S |
-S |
-M |
-Gram negative |
-Escherichia |
-coli |
-TRUE |
-
-
-4 |
-2012-12-15 |
-G10 |
-Hospital C |
-B_KLBSL_PNE |
-R |
-S |
-R |
-S |
-M |
-Gram negative |
-Klebsiella |
-pneumoniae |
-TRUE |
-
-
-6 |
-2011-03-27 |
-H5 |
-Hospital A |
-B_ESCHR_COL |
-S |
-S |
-S |
-R |
-M |
-Gram negative |
-Escherichia |
-coli |
-TRUE |
-
-
-7 |
-2012-06-22 |
-Q8 |
-Hospital A |
B_STPHY_AUR |
S |
S |
+S |
+S |
+M |
+Gram positive |
+Staphylococcus |
+aureus |
+TRUE |
+
+
+2012-07-19 |
+W5 |
+Hospital A |
+B_STPHY_AUR |
+S |
R |
-R |
+S |
+S |
F |
Gram positive |
Staphylococcus |
@@ -883,12 +847,41 @@
TRUE |
-8 |
-2015-06-27 |
-Q2 |
+2013-11-26 |
+L7 |
+Hospital A |
+B_ESCHR_COL |
+S |
+S |
+R |
+S |
+M |
+Gram negative |
+Escherichia |
+coli |
+TRUE |
+
+
+2016-01-24 |
+M7 |
Hospital B |
B_ESCHR_COL |
-R |
+S |
+S |
+S |
+S |
+M |
+Gram negative |
+Escherichia |
+coli |
+TRUE |
+
+
+2016-11-13 |
+V10 |
+Hospital A |
+B_ESCHR_COL |
+S |
S |
S |
S |
@@ -915,9 +908,9 @@
Or can be used like the dplyr
way, which is easier readable:
-Frequency table of genus
and species
from a data.frame
(15,826 x 13)
+Frequency table of genus
and species
from a data.frame
(15,767 x 13)
Columns: 2
-Length: 15,826 (of which NA: 0 = 0.00%)
+Length: 15,767 (of which NA: 0 = 0.00%)
Unique: 4
Shortest: 16
Longest: 24
@@ -934,33 +927,33 @@ Longest: 24
1 |
Escherichia coli |
-7,714 |
-48.7% |
-7,714 |
-48.7% |
+7,762 |
+49.2% |
+7,762 |
+49.2% |
2 |
Staphylococcus aureus |
-3,977 |
-25.1% |
-11,691 |
-73.9% |
+4,014 |
+25.5% |
+11,776 |
+74.7% |
3 |
Streptococcus pneumoniae |
-2,514 |
-15.9% |
-14,205 |
-89.8% |
+2,450 |
+15.5% |
+14,226 |
+90.2% |
4 |
Klebsiella pneumoniae |
-1,621 |
-10.2% |
-15,826 |
+1,541 |
+9.8% |
+15,767 |
100.0% |
@@ -971,7 +964,7 @@ Longest: 24
Resistance percentages
The functions portion_R()
, portion_RI()
, portion_I()
, portion_IS()
and portion_S()
can be used to determine the portion of a specific antimicrobial outcome. They can be used on their own:
+#> [1] 0.4762479
Or can be used in conjuction with group_by()
and summarise()
, both from the dplyr
package:
@@ -1014,23 +1007,23 @@ Longest: 24
Hospital A |
-0.4798820 |
-4747 |
+0.4717496 |
+4761 |
Hospital B |
-0.4792835 |
-5527 |
+0.4754662 |
+5523 |
Hospital C |
-0.4863714 |
-2348 |
+0.4748170 |
+2323 |
Hospital D |
-0.4915730 |
-3204 |
+0.4854430 |
+3160 |
@@ -1050,27 +1043,27 @@ Longest: 24
Escherichia |
-0.7313975 |
-0.8940887 |
-0.9752398 |
+0.7333162 |
+0.9035043 |
+0.9748776 |
Klebsiella |
-0.7143738 |
-0.8994448 |
-0.9697717 |
+0.7352369 |
+0.9104478 |
+0.9733939 |
Staphylococcus |
-0.7301986 |
-0.9104853 |
-0.9786271 |
+0.7416542 |
+0.9160438 |
+0.9763328 |
Streptococcus |
-0.7430390 |
+0.7473469 |
0.0000000 |
-0.7430390 |
+0.7473469 |
diff --git a/docs/articles/AMR_files/figure-html/plot 1-1.png b/docs/articles/AMR_files/figure-html/plot 1-1.png
index e7062639ffd89f81eddf401db9683c83a394f00a..49a734cc42d6830128d117b8274df142774659c6 100644
GIT binary patch
literal 35640
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