2018-09-08 16:06:47 +02:00
|
|
|
# ==================================================================== #
|
|
|
|
# TITLE #
|
2021-02-02 23:57:35 +01:00
|
|
|
# Antimicrobial Resistance (AMR) Data Analysis for R #
|
2018-09-08 16:06:47 +02:00
|
|
|
# #
|
2019-01-02 23:24:07 +01:00
|
|
|
# SOURCE #
|
2020-07-08 14:48:06 +02:00
|
|
|
# https://github.com/msberends/AMR #
|
2018-09-08 16:06:47 +02:00
|
|
|
# #
|
|
|
|
# LICENCE #
|
2021-12-23 18:56:28 +01:00
|
|
|
# (c) 2018-2022 Berends MS, Luz CF et al. #
|
2020-10-08 11:16:03 +02:00
|
|
|
# Developed at the University of Groningen, the Netherlands, in #
|
|
|
|
# collaboration with non-profit organisations Certe Medical #
|
2022-08-28 10:31:50 +02:00
|
|
|
# Diagnostics & Advice, and University Medical Center Groningen. #
|
2018-09-08 16:06:47 +02:00
|
|
|
# #
|
2019-01-02 23:24:07 +01:00
|
|
|
# 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. #
|
2020-01-05 17:22:09 +01:00
|
|
|
# We created this package for both routine data analysis and academic #
|
|
|
|
# research and it was publicly released in the hope that it will be #
|
|
|
|
# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY. #
|
2020-10-08 11:16:03 +02:00
|
|
|
# #
|
|
|
|
# Visit our website for the full manual and a complete tutorial about #
|
2021-02-02 23:57:35 +01:00
|
|
|
# how to conduct AMR data analysis: https://msberends.github.io/AMR/ #
|
2018-09-08 16:06:47 +02:00
|
|
|
# ==================================================================== #
|
|
|
|
|
2020-12-29 21:23:01 +01:00
|
|
|
# set up package environment, used by numerous AMR functions
|
|
|
|
pkg_env <- new.env(hash = FALSE)
|
2021-01-12 22:08:04 +01:00
|
|
|
pkg_env$mo_failed <- character(0)
|
2022-09-16 23:15:23 +02:00
|
|
|
pkg_env$mo_uncertainties <- data.frame(
|
|
|
|
uncertainty = integer(0),
|
|
|
|
input = character(0),
|
|
|
|
fullname = character(0),
|
|
|
|
mo = character(0),
|
|
|
|
candidates = character(0),
|
|
|
|
stringsAsFactors = FALSE
|
|
|
|
)
|
|
|
|
pkg_env$mo_previously_coerced <- data.frame(
|
|
|
|
x = character(0),
|
|
|
|
mo = character(0),
|
|
|
|
stringsAsFactors = FALSE
|
2022-08-28 10:31:50 +02:00
|
|
|
)
|
2022-09-01 15:20:57 +02:00
|
|
|
pkg_env$rsi_interpretation_history <- data.frame(
|
|
|
|
datetime = Sys.time()[0],
|
|
|
|
index = integer(0),
|
|
|
|
ab_input = character(0),
|
|
|
|
ab_considered = character(0),
|
|
|
|
mo_input = character(0),
|
|
|
|
mo_considered = character(0),
|
|
|
|
guideline = character(0),
|
|
|
|
ref_table = character(0),
|
|
|
|
method = character(0),
|
|
|
|
breakpoint_S = double(0),
|
|
|
|
breakpoint_R = double(0),
|
|
|
|
input = double(0),
|
|
|
|
interpretation = character(0),
|
|
|
|
stringsAsFactors = FALSE
|
|
|
|
)
|
2020-12-29 21:23:01 +01:00
|
|
|
|
2021-05-12 18:15:03 +02:00
|
|
|
# determine info icon for messages
|
|
|
|
utf8_supported <- isTRUE(base::l10n_info()$`UTF-8`)
|
|
|
|
is_latex <- tryCatch(import_fn("is_latex_output", "knitr", error_on_fail = FALSE)(),
|
2022-08-28 10:31:50 +02:00
|
|
|
error = function(e) FALSE
|
|
|
|
)
|
2021-05-12 18:15:03 +02:00
|
|
|
if (utf8_supported && !is_latex) {
|
|
|
|
# \u2139 is a symbol officially named 'information source'
|
|
|
|
pkg_env$info_icon <- "\u2139"
|
|
|
|
} else {
|
|
|
|
pkg_env$info_icon <- "i"
|
|
|
|
}
|
|
|
|
|
2022-09-16 23:15:23 +02:00
|
|
|
.onLoad <- function(lib, pkg) {
|
2020-09-29 23:35:46 +02:00
|
|
|
# Support for tibble headers (type_sum) and tibble columns content (pillar_shaft)
|
2022-08-28 10:31:50 +02:00
|
|
|
# without the need to depend on other packages. This was suggested by the
|
|
|
|
# developers of the vctrs package:
|
2020-09-12 08:49:01 +02:00
|
|
|
# https://github.com/r-lib/vctrs/blob/05968ce8e669f73213e3e894b5f4424af4f46316/R/register-s3.R
|
2020-08-26 15:34:12 +02:00
|
|
|
s3_register("pillar::pillar_shaft", "ab")
|
2020-08-26 11:33:54 +02:00
|
|
|
s3_register("pillar::pillar_shaft", "mo")
|
|
|
|
s3_register("pillar::pillar_shaft", "rsi")
|
|
|
|
s3_register("pillar::pillar_shaft", "mic")
|
|
|
|
s3_register("pillar::pillar_shaft", "disk")
|
2020-10-08 11:16:03 +02:00
|
|
|
s3_register("tibble::type_sum", "ab")
|
|
|
|
s3_register("tibble::type_sum", "mo")
|
|
|
|
s3_register("tibble::type_sum", "rsi")
|
|
|
|
s3_register("tibble::type_sum", "mic")
|
2020-08-26 11:33:54 +02:00
|
|
|
s3_register("tibble::type_sum", "disk")
|
2020-09-29 23:35:46 +02:00
|
|
|
# Support for frequency tables from the cleaner package
|
2020-08-28 21:55:47 +02:00
|
|
|
s3_register("cleaner::freq", "mo")
|
|
|
|
s3_register("cleaner::freq", "rsi")
|
2021-07-23 21:42:11 +02:00
|
|
|
# Support for skim() from the skimr package
|
2021-12-23 13:38:25 +01:00
|
|
|
if (pkg_is_available("skimr", also_load = FALSE, min_version = "2.0.0")) {
|
|
|
|
s3_register("skimr::get_skimmers", "mo")
|
|
|
|
s3_register("skimr::get_skimmers", "rsi")
|
|
|
|
s3_register("skimr::get_skimmers", "mic")
|
|
|
|
s3_register("skimr::get_skimmers", "disk")
|
|
|
|
}
|
2021-07-23 21:42:11 +02:00
|
|
|
# Support for autoplot() from the ggplot2 package
|
2021-06-14 22:04:04 +02:00
|
|
|
s3_register("ggplot2::autoplot", "rsi")
|
|
|
|
s3_register("ggplot2::autoplot", "mic")
|
|
|
|
s3_register("ggplot2::autoplot", "disk")
|
|
|
|
s3_register("ggplot2::autoplot", "resistance_predict")
|
2021-11-01 13:51:13 +01:00
|
|
|
# Support for fortify from the ggplot2 package
|
|
|
|
s3_register("ggplot2::fortify", "rsi")
|
|
|
|
s3_register("ggplot2::fortify", "mic")
|
|
|
|
s3_register("ggplot2::fortify", "disk")
|
2021-07-23 21:42:11 +02:00
|
|
|
# Support vctrs package for use in e.g. dplyr verbs
|
|
|
|
s3_register("vctrs::vec_ptype2", "ab.character")
|
|
|
|
s3_register("vctrs::vec_ptype2", "character.ab")
|
|
|
|
s3_register("vctrs::vec_cast", "character.ab")
|
|
|
|
s3_register("vctrs::vec_ptype2", "mo.character")
|
|
|
|
s3_register("vctrs::vec_ptype2", "character.mo")
|
|
|
|
s3_register("vctrs::vec_cast", "character.mo")
|
|
|
|
s3_register("vctrs::vec_ptype2", "ab_selector.character")
|
|
|
|
s3_register("vctrs::vec_ptype2", "character.ab_selector")
|
|
|
|
s3_register("vctrs::vec_cast", "character.ab_selector")
|
2022-08-21 16:37:20 +02:00
|
|
|
s3_register("vctrs::vec_ptype2", "ab_selector_any_all.logical")
|
|
|
|
s3_register("vctrs::vec_ptype2", "logical.ab_selector_any_all")
|
|
|
|
s3_register("vctrs::vec_cast", "logical.ab_selector_any_all")
|
2021-07-23 21:42:11 +02:00
|
|
|
s3_register("vctrs::vec_ptype2", "disk.integer")
|
|
|
|
s3_register("vctrs::vec_ptype2", "integer.disk")
|
|
|
|
s3_register("vctrs::vec_cast", "integer.disk")
|
2022-08-30 21:48:02 +02:00
|
|
|
s3_register("vctrs::vec_cast", "character.mic")
|
|
|
|
s3_register("vctrs::vec_cast", "double.mic")
|
|
|
|
s3_register("vctrs::vec_math", "mic")
|
2022-08-28 10:31:50 +02:00
|
|
|
|
2020-12-24 23:29:10 +01:00
|
|
|
# if mo source exists, fire it up (see mo_source())
|
2022-08-28 10:31:50 +02:00
|
|
|
try(
|
|
|
|
{
|
|
|
|
if (file.exists(getOption("AMR_mo_source", "~/mo_source.rds"))) {
|
|
|
|
invisible(get_mo_source())
|
|
|
|
}
|
|
|
|
},
|
|
|
|
silent = TRUE
|
|
|
|
)
|
|
|
|
|
2022-08-27 20:49:37 +02:00
|
|
|
# be sure to print tibbles as tibbles
|
|
|
|
if (pkg_is_available("tibble", also_load = FALSE)) {
|
|
|
|
loadNamespace("tibble")
|
|
|
|
}
|
2022-08-28 10:31:50 +02:00
|
|
|
|
2021-05-30 22:14:38 +02:00
|
|
|
# reference data - they have additional columns compared to `antibiotics` and `microorganisms` to improve speed
|
2022-08-27 20:49:37 +02:00
|
|
|
# they cannot be part of R/sysdata.rda since CRAN thinks it would make the package too large (+3 MB)
|
2021-05-30 22:14:38 +02:00
|
|
|
assign(x = "AB_lookup", value = create_AB_lookup(), envir = asNamespace("AMR"))
|
|
|
|
assign(x = "MO_lookup", value = create_MO_lookup(), envir = asNamespace("AMR"))
|
|
|
|
# for mo_is_intrinsic_resistant() - saves a lot of time when executed on this vector
|
|
|
|
assign(x = "INTRINSIC_R", value = create_intr_resistance(), envir = asNamespace("AMR"))
|
|
|
|
}
|
|
|
|
|
|
|
|
# Helper functions --------------------------------------------------------
|
|
|
|
|
|
|
|
create_AB_lookup <- function() {
|
2022-03-14 16:36:10 +01:00
|
|
|
cbind(AMR::antibiotics, AB_LOOKUP)
|
2021-05-30 22:14:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
create_MO_lookup <- function() {
|
|
|
|
MO_lookup <- AMR::microorganisms
|
2022-08-28 10:31:50 +02:00
|
|
|
|
2021-05-30 22:14:38 +02:00
|
|
|
MO_lookup$kingdom_index <- NA_real_
|
|
|
|
MO_lookup[which(MO_lookup$kingdom == "Bacteria" | MO_lookup$mo == "UNKNOWN"), "kingdom_index"] <- 1
|
|
|
|
MO_lookup[which(MO_lookup$kingdom == "Fungi"), "kingdom_index"] <- 2
|
|
|
|
MO_lookup[which(MO_lookup$kingdom == "Protozoa"), "kingdom_index"] <- 3
|
|
|
|
MO_lookup[which(MO_lookup$kingdom == "Archaea"), "kingdom_index"] <- 4
|
|
|
|
# all the rest
|
|
|
|
MO_lookup[which(is.na(MO_lookup$kingdom_index)), "kingdom_index"] <- 5
|
2022-08-28 10:31:50 +02:00
|
|
|
|
2022-09-16 23:15:23 +02:00
|
|
|
# # use this paste instead of `fullname` to work with Viridans Group Streptococci, etc.
|
|
|
|
# if (length(MO_FULLNAME_LOWER) == nrow(MO_lookup)) {
|
|
|
|
# MO_lookup$fullname_lower <- MO_FULLNAME_LOWER
|
|
|
|
# } else {
|
|
|
|
# MO_lookup$fullname_lower <- ""
|
|
|
|
# warning("MO table updated - Run: source(\"data-raw/_pre_commit_hook.R\")", call. = FALSE)
|
|
|
|
# }
|
2022-08-28 10:31:50 +02:00
|
|
|
|
2022-09-16 23:15:23 +02:00
|
|
|
MO_lookup$fullname_lower <- create_MO_fullname_lower()
|
|
|
|
MO_lookup$full_first <- substr(MO_lookup$fullname_lower, 1, 1)
|
|
|
|
MO_lookup$species_first <- substr(MO_lookup$species, 1, 1)
|
2022-08-28 10:31:50 +02:00
|
|
|
|
2021-05-30 22:14:38 +02:00
|
|
|
# so arrange data on prevalence first, then kingdom, then full name
|
2022-08-27 20:49:37 +02:00
|
|
|
MO_lookup[order(MO_lookup$prevalence, MO_lookup$kingdom_index, MO_lookup$fullname_lower), , drop = FALSE]
|
2021-05-30 22:14:38 +02:00
|
|
|
}
|
|
|
|
|
2022-09-16 23:15:23 +02:00
|
|
|
create_MO_fullname_lower <- function() {
|
|
|
|
MO_lookup <- AMR::microorganisms
|
|
|
|
# use this paste instead of `fullname` to work with Viridans Group Streptococci, etc.
|
|
|
|
MO_lookup$fullname_lower <- tolower(trimws(paste(
|
|
|
|
MO_lookup$genus,
|
|
|
|
MO_lookup$species,
|
|
|
|
MO_lookup$subspecies
|
|
|
|
)))
|
|
|
|
ind <- MO_lookup$genus == "" | grepl("^[(]unknown ", MO_lookup$fullname, perl = TRUE)
|
|
|
|
MO_lookup[ind, "fullname_lower"] <- tolower(MO_lookup[ind, "fullname", drop = TRUE])
|
|
|
|
MO_lookup$fullname_lower <- trimws(gsub("[^.a-z0-9/ \\-]+", "", MO_lookup$fullname_lower, perl = TRUE))
|
|
|
|
MO_lookup$fullname_lower
|
2021-05-30 22:14:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
create_intr_resistance <- function() {
|
|
|
|
# for mo_is_intrinsic_resistant() - saves a lot of time when executed on this vector
|
2021-12-14 21:47:14 +01:00
|
|
|
paste(AMR::intrinsic_resistant$mo, AMR::intrinsic_resistant$ab)
|
2018-04-19 14:10:57 +02:00
|
|
|
}
|