2018-09-08 16:06:47 +02:00
|
|
|
# ==================================================================== #
|
|
|
|
# TITLE #
|
2020-10-08 11:16:03 +02:00
|
|
|
# Antimicrobial Resistance (AMR) 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 #
|
2020-12-27 00:30:28 +01:00
|
|
|
# (c) 2018-2021 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 #
|
|
|
|
# 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 #
|
|
|
|
# how to conduct AMR 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)
|
|
|
|
|
2018-04-19 14:10:57 +02:00
|
|
|
.onLoad <- function(libname, pkgname) {
|
2020-12-17 16:22:25 +01:00
|
|
|
|
2020-09-18 16:05:53 +02:00
|
|
|
assign(x = "AB_lookup",
|
|
|
|
value = create_AB_lookup(),
|
|
|
|
envir = asNamespace("AMR"))
|
|
|
|
|
2020-05-16 13:05:47 +02:00
|
|
|
assign(x = "MO_lookup",
|
|
|
|
value = create_MO_lookup(),
|
2019-03-12 12:19:27 +01:00
|
|
|
envir = asNamespace("AMR"))
|
2020-06-22 11:18:40 +02:00
|
|
|
|
2020-05-16 13:05:47 +02:00
|
|
|
assign(x = "MO.old_lookup",
|
|
|
|
value = create_MO.old_lookup(),
|
2019-03-12 12:19:27 +01:00
|
|
|
envir = asNamespace("AMR"))
|
2020-08-26 11:33:54 +02:00
|
|
|
|
2020-12-07 16:06:42 +01:00
|
|
|
assign(x = "INTRINSIC_R",
|
|
|
|
value = create_intr_resistance(),
|
|
|
|
envir = asNamespace("AMR"))
|
|
|
|
|
2020-09-03 12:31:48 +02:00
|
|
|
assign(x = "LANGUAGES_SUPPORTED",
|
2020-09-03 20:59:21 +02:00
|
|
|
value = sort(c("en", unique(translations_file$lang))),
|
2020-09-03 12:31:48 +02:00
|
|
|
envir = asNamespace("AMR"))
|
2020-09-29 23:35:46 +02:00
|
|
|
|
|
|
|
assign(x = "MO_CONS",
|
|
|
|
value = create_species_cons_cops("CoNS"),
|
|
|
|
envir = asNamespace("AMR"))
|
|
|
|
|
|
|
|
assign(x = "MO_COPS",
|
|
|
|
value = create_species_cons_cops("CoPS"),
|
|
|
|
envir = asNamespace("AMR"))
|
2020-09-03 12:31:48 +02:00
|
|
|
|
2020-09-29 23:35:46 +02:00
|
|
|
# Support for tibble headers (type_sum) and tibble columns content (pillar_shaft)
|
|
|
|
# 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")
|
2020-09-29 23:35:46 +02:00
|
|
|
# Support from skim() from the skimr package
|
2020-09-28 01:08:55 +02:00
|
|
|
s3_register("skimr::get_skimmers", "mo")
|
|
|
|
s3_register("skimr::get_skimmers", "rsi")
|
|
|
|
s3_register("skimr::get_skimmers", "mic")
|
|
|
|
s3_register("skimr::get_skimmers", "disk")
|
2020-12-24 23:29:10 +01:00
|
|
|
|
|
|
|
# if mo source exists, fire it up (see mo_source())
|
|
|
|
try({
|
|
|
|
if (file.exists(getOption("AMR_mo_source", "~/mo_source.rds"))) {
|
|
|
|
invisible(get_mo_source())
|
|
|
|
}
|
|
|
|
}, silent = TRUE)
|
2018-04-19 14:10:57 +02:00
|
|
|
}
|
2019-02-21 23:32:30 +01:00
|
|
|
|
2020-08-10 11:44:58 +02:00
|
|
|
.onAttach <- function(...) {
|
2020-09-29 23:35:46 +02:00
|
|
|
# show notice in 10% of cases in interactive session
|
2020-09-03 20:59:21 +02:00
|
|
|
if (!interactive() || stats::runif(1) > 0.1 || isTRUE(as.logical(getOption("AMR_silentstart", FALSE)))) {
|
2020-08-10 11:44:58 +02:00
|
|
|
return()
|
|
|
|
}
|
2020-11-10 16:35:56 +01:00
|
|
|
packageStartupMessage(word_wrap("Thank you for using the AMR package! ",
|
|
|
|
"If you have a minute, please anonymously fill in this short questionnaire to improve the package and its functionalities: ",
|
|
|
|
font_blue("https://msberends.github.io/AMR/survey.html\n"),
|
|
|
|
"[prevent his notice with ",
|
|
|
|
font_bold("suppressPackageStartupMessages(library(AMR))"),
|
|
|
|
" or use ",
|
|
|
|
font_bold("options(AMR_silentstart = TRUE)"), "]"))
|
2020-08-10 11:44:58 +02:00
|
|
|
}
|
2019-06-07 22:47:37 +02:00
|
|
|
|
2020-12-07 16:06:42 +01:00
|
|
|
create_intr_resistance <- function() {
|
|
|
|
# for mo_is_intrinsic_resistant() - saves a lot of time when executed on this vector
|
|
|
|
paste(AMR::microorganisms[match(AMR::intrinsic_resistant$microorganism, AMR::microorganisms$fullname), "mo", drop = TRUE],
|
|
|
|
AMR::antibiotics[match(AMR::intrinsic_resistant$antibiotic, AMR::antibiotics$name), "ab", drop = TRUE])
|
|
|
|
}
|
|
|
|
|
2020-09-29 23:35:46 +02:00
|
|
|
create_species_cons_cops <- function(type = c("CoNS", "CoPS")) {
|
2020-10-20 21:00:57 +02:00
|
|
|
# Determination of which staphylococcal species are CoNS/CoPS according to:
|
|
|
|
# - Becker et al. 2014, PMID 25278577
|
|
|
|
# - Becker et al. 2019, PMID 30872103
|
|
|
|
# - Becker et al. 2020, PMID 32056452
|
2020-10-08 11:16:03 +02:00
|
|
|
# this function returns class <mo>
|
2020-09-29 23:35:46 +02:00
|
|
|
MO_staph <- AMR::microorganisms
|
|
|
|
MO_staph <- MO_staph[which(MO_staph$genus == "Staphylococcus"), , drop = FALSE]
|
|
|
|
if (type == "CoNS") {
|
2020-10-20 21:00:57 +02:00
|
|
|
MO_staph[which(MO_staph$species %in% c("coagulase-negative", "argensis", "arlettae",
|
|
|
|
"auricularis", "caeli", "capitis", "caprae",
|
|
|
|
"carnosus", "chromogenes", "cohnii", "condimenti",
|
|
|
|
"debuckii", "devriesei", "edaphicus", "epidermidis",
|
|
|
|
"equorum", "felis", "fleurettii", "gallinarum",
|
|
|
|
"haemolyticus", "hominis", "jettensis", "kloosii",
|
|
|
|
"lentus", "lugdunensis", "massiliensis", "microti",
|
2020-09-29 23:35:46 +02:00
|
|
|
"muscae", "nepalensis", "pasteuri", "petrasii",
|
2020-10-20 21:00:57 +02:00
|
|
|
"pettenkoferi", "piscifermentans", "pseudoxylosus",
|
|
|
|
"rostri", "saccharolyticus", "saprophyticus",
|
|
|
|
"sciuri", "simulans", "stepanovicii", "succinus",
|
2020-09-29 23:35:46 +02:00
|
|
|
"vitulinus", "warneri", "xylosus")
|
|
|
|
| (MO_staph$species == "schleiferi" & MO_staph$subspecies %in% c("schleiferi", ""))),
|
|
|
|
"mo", drop = TRUE]
|
|
|
|
} else if (type == "CoPS") {
|
|
|
|
MO_staph[which(MO_staph$species %in% c("coagulase-positive",
|
|
|
|
"simiae", "agnetis",
|
|
|
|
"delphini", "lutrae",
|
|
|
|
"hyicus", "intermedius",
|
|
|
|
"pseudintermedius", "pseudointermedius",
|
|
|
|
"schweitzeri", "argenteus")
|
|
|
|
| (MO_staph$species == "schleiferi" & MO_staph$subspecies == "coagulans")),
|
|
|
|
"mo", drop = TRUE]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-18 16:05:53 +02:00
|
|
|
create_AB_lookup <- function() {
|
|
|
|
AB_lookup <- AMR::antibiotics
|
|
|
|
AB_lookup$generalised_name <- generalise_antibiotic_name(AB_lookup$name)
|
|
|
|
AB_lookup$generalised_synonyms <- lapply(AB_lookup$synonyms, generalise_antibiotic_name)
|
|
|
|
AB_lookup$generalised_abbreviations <- lapply(AB_lookup$abbreviations, generalise_antibiotic_name)
|
|
|
|
AB_lookup$generalised_loinc <- lapply(AB_lookup$loinc, generalise_antibiotic_name)
|
|
|
|
AB_lookup
|
|
|
|
}
|
|
|
|
|
2020-05-16 13:05:47 +02:00
|
|
|
create_MO_lookup <- function() {
|
|
|
|
MO_lookup <- AMR::microorganisms
|
|
|
|
|
2020-09-18 16:05:53 +02:00
|
|
|
MO_lookup$kingdom_index <- NA_real_
|
2020-05-16 13:05:47 +02:00
|
|
|
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
|
2020-09-18 16:05:53 +02:00
|
|
|
# all the rest
|
|
|
|
MO_lookup[which(is.na(MO_lookup$kingdom_index)), "kingdom_index"] <- 5
|
|
|
|
|
2020-07-22 10:24:23 +02:00
|
|
|
# use this paste instead of `fullname` to work with Viridans Group Streptococci, etc.
|
2020-05-16 13:05:47 +02:00
|
|
|
MO_lookup$fullname_lower <- tolower(trimws(paste(MO_lookup$genus,
|
2020-06-22 11:18:40 +02:00
|
|
|
MO_lookup$species,
|
|
|
|
MO_lookup$subspecies)))
|
2020-08-28 21:55:47 +02:00
|
|
|
ind <- MO_lookup$genus == "" | grepl("^[(]unknown ", MO_lookup$fullname)
|
|
|
|
MO_lookup[ind, "fullname_lower"] <- tolower(MO_lookup[ind, "fullname"])
|
2020-09-25 14:44:50 +02:00
|
|
|
MO_lookup$fullname_lower <- trimws(gsub("[^.a-z0-9/ \\-]+", "", MO_lookup$fullname_lower, perl = TRUE))
|
2020-05-16 13:05:47 +02:00
|
|
|
|
|
|
|
# add a column with only "e coli" like combinations
|
2020-09-25 14:44:50 +02:00
|
|
|
MO_lookup$g_species <- gsub("^([a-z])[a-z]+ ([a-z]+) ?.*", "\\1 \\2", MO_lookup$fullname_lower, perl = TRUE)
|
2019-11-15 16:50:46 +01:00
|
|
|
|
2019-11-15 15:25:03 +01:00
|
|
|
# so arrange data on prevalence first, then kingdom, then full name
|
2020-05-18 13:59:34 +02:00
|
|
|
MO_lookup[order(MO_lookup$prevalence, MO_lookup$kingdom_index, MO_lookup$fullname_lower), ]
|
2019-02-21 23:32:30 +01:00
|
|
|
}
|
|
|
|
|
2020-05-16 13:05:47 +02:00
|
|
|
create_MO.old_lookup <- function() {
|
|
|
|
MO.old_lookup <- AMR::microorganisms.old
|
2020-08-28 21:55:47 +02:00
|
|
|
MO.old_lookup$fullname_lower <- trimws(gsub("[^.a-z0-9/ \\-]+", "", tolower(trimws(MO.old_lookup$fullname))))
|
2020-05-16 13:05:47 +02:00
|
|
|
|
2020-08-28 21:55:47 +02:00
|
|
|
# add a column with only "e coli"-like combinations
|
|
|
|
MO.old_lookup$g_species <- trimws(gsub("^([a-z])[a-z]+ ([a-z]+) ?.*", "\\1 \\2", MO.old_lookup$fullname_lower))
|
2019-12-21 10:56:06 +01:00
|
|
|
|
|
|
|
# so arrange data on prevalence first, then full name
|
2020-05-18 13:59:34 +02:00
|
|
|
MO.old_lookup[order(MO.old_lookup$prevalence, MO.old_lookup$fullname_lower), ]
|
2019-12-21 10:56:06 +01:00
|
|
|
}
|