From d9e68e0a505838bc452ace1626b7d2a164ae1847 Mon Sep 17 00:00:00 2001 From: "Matthijs S. Berends" Date: Wed, 29 Aug 2018 16:25:57 +0200 Subject: [PATCH] ggplot_rsi example update, more unit tests --- NEWS.md | 7 ++--- R/ggplot_rsi.R | 22 ++++++++++----- README.md | 8 ++++-- man/figures/rsi_example2.png | Bin 7874 -> 8358 bytes man/figures/rsi_example3.png | Bin 7160 -> 29836 bytes man/ggplot_rsi.Rd | 16 ++++++++++- tests/testthat/test-atc.R | 5 +++- tests/testthat/test-bactid.R | 8 ++++++ tests/testthat/test-eucast.R | 31 ++++++++++++++++++++ tests/testthat/test-first_isolate.R | 42 ++++++++++++++++++++++++++-- 10 files changed, 121 insertions(+), 18 deletions(-) diff --git a/NEWS.md b/NEWS.md index 1d940162..6acab483 100755 --- a/NEWS.md +++ b/NEWS.md @@ -6,7 +6,7 @@ * Function `is.rsi.eligible` to check for columns that have valid antimicrobial results, but do not have the `rsi` class yet. Transform the columns of your raw data with: `data %>% mutate_if(is.rsi.eligible, as.rsi)` * Functions `as.atc` and `is.atc` to transform/look up antibiotic ATC codes as defined by the WHO. The existing function `guess_atc` is now an alias of `as.atc`. * Aliases for existing function `mo_property`: `mo_aerobic`, `mo_family`, `mo_fullname`, `mo_genus`, `mo_gramstain`, `mo_gramstain_nl`, `mo_property`, `mo_species`, `mo_subspecies`, `mo_type`, `mo_type_nl` -* Function `ab_property` and its aliases: `ab_certe`, `ab_official`, `ab_official_nl`, `ab_property`, `ab_trivial_nl`, `ab_umcg` +* Function `ab_property` and its aliases: `ab_certe`, `ab_official`, `ab_official_nl`, `ab_property`, `ab_trivial_nl`, `ab_umcg`, `ab_tradenames` * Introduction to AMR as a vignette #### Changed @@ -22,7 +22,7 @@ # [1] "R01AX06" "J01CA04" "J01FA10" "J01CF05" ``` * Removed function `ratio` as it is not really the scope of this package -* Fix in `as.mic` for values ending in zeroes after a real number +* Fix for `as.mic` for values ending in zeroes after a real number * Huge speed improvement for `as.bactid` * Added parameters `minimum` and `as_percent` to `portion_df` * Support for quasiquotation in the functions series `count_*` and `portions_*`, and `n_rsi`. This allows to check for more than 2 vectors or columns. @@ -46,8 +46,7 @@ my_list %>% freq(age) my_list %>% freq(sex) ``` -* Added "Furabid" as a trade name to Nitrofurantoine in the `antibiotics` data set - + #### Other * More unit tests to ensure better integrity of functions diff --git a/R/ggplot_rsi.R b/R/ggplot_rsi.R index 89e6ffce..fb8163df 100644 --- a/R/ggplot_rsi.R +++ b/R/ggplot_rsi.R @@ -23,7 +23,6 @@ #' @param position position adjustment of bars, either \code{"stack"} (default when \code{fun} is \code{\link{portion_df}}) or \code{"dodge"} (default when \code{fun} is \code{\link{count_df}}) #' @param x variable to show on x axis, either \code{"Antibiotic"} (default) or \code{"Interpretation"} or a grouping variable #' @param fill variable to categorise using the plots legend, either \code{"Antibiotic"} (default) or \code{"Interpretation"} or a grouping variable -# @param params a list with parameters passed on to the new \code{geom_rsi} layer, like \code{alpha} and \code{width} #' @param facet variable to split plots by, either \code{"Interpretation"} (default) or \code{"Antibiotic"} or a grouping variable #' @param translate_ab a column name of the \code{\link{antibiotics}} data set to translate the antibiotic abbreviations into, using \code{\link{abname}}. Default behaviour is to translate to official names according to the WHO. Use \code{translate_ab = FALSE} to disable translation. #' @param fun function to transform \code{data}, either \code{\link{portion_df}} (default) or \code{\link{count_df}} @@ -66,10 +65,24 @@ #' select(amox, nitr, fosf, trim, cipr) %>% #' ggplot_rsi() #' +#' # for colourblind mode, use divergent colours from the viridis package: +#' septic_patients %>% +#' select(amox, nitr, fosf, trim, cipr) %>% +#' ggplot_rsi() + scale_fill_viridis_d() +#' #' # get counts instead of percentages: #' septic_patients %>% #' select(amox, nitr, fosf, trim, cipr) %>% #' ggplot_rsi(fun = count_df) +#' +#' # add other ggplot2 parameters as you like: +#' septic_patients %>% +#' select(amox, nitr, fosf, trim, cipr) %>% +#' ggplot_rsi(width = 0.5, +#' colour = "black", +#' size = 1, +#' linetype = 2, +#' alpha = 0.25) #' \donttest{ #' # it also supports groups (don't forget to use the group on `x` or `facet`): #' septic_patients %>% @@ -98,7 +111,7 @@ #' left_join_microorganisms() %>% #' # select full name and some antiseptic drugs #' select(mo = fullname, -#' cfur, gent, cipr) %>% +#' cfur, gent, cipr) %>% #' # group by MO #' group_by(mo) %>% #' # plot the thing, putting MOs on the facet @@ -152,7 +165,6 @@ ggplot_rsi <- function(data, geom_rsi <- function(position = NULL, x = c("Antibiotic", "Interpretation"), fill = "Interpretation", - # params = list(), translate_ab = "official", fun = portion_df, ...) { @@ -182,10 +194,6 @@ geom_rsi <- function(position = NULL, options(get_antibiotic_names = translate_ab) - # if (!is.list(params)) { - # params <- as.list(params) - # } - ggplot2::layer(geom = "bar", stat = "identity", position = position, mapping = ggplot2::aes_string(x = x, y = y, fill = fill), data = fun, params = list(...)) diff --git a/README.md b/README.md index 5c3f144b..a02317a0 100755 --- a/README.md +++ b/README.md @@ -151,16 +151,18 @@ library(dplyr) library(ggplot2) septic_patients %>% - select(amox, cipr) %>% + select(amox, nitr, fosf, trim, cipr) %>% ggplot_rsi() ``` ![example_2_rsi](man/figures/rsi_example2.png) +Adjust it with any parameter you know from the `ggplot2` package: + ```r septic_patients %>% - select(amox, cipr) %>% - ggplot_rsi(x = "Interpretation", facet = "Antibiotic") + select(amox, nitr, fosf, trim, cipr) %>% + ggplot_rsi(width = 0.5, colour = "black", size = 1, linetype = 2, alpha = 0.25) ``` ![example_3_rsi](man/figures/rsi_example3.png) diff --git a/man/figures/rsi_example2.png b/man/figures/rsi_example2.png index d9240011e779f57055c1e4314a0c02e0a8fdc6cf..87f4d8b55e44e751a8cbabba5893c1f2873ccaec 100644 GIT binary patch literal 8358 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 Op?ls?JLl~6yZ-^N6zKf` literal 7874 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 diff --git a/man/figures/rsi_example3.png b/man/figures/rsi_example3.png index 36857cc5738418c4d01b58f4a3c5b4a4b146023b..b2136dfa800663465789df06613e05a829f143e6 100644 GIT binary patch literal 29836 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%0Asj5Mg4|pxbh2QN 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 Kl6uVW+J68PK*o^( literal 7160 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 diff --git a/man/ggplot_rsi.Rd b/man/ggplot_rsi.Rd index d0029d50..3590696b 100644 --- a/man/ggplot_rsi.Rd +++ b/man/ggplot_rsi.Rd @@ -83,10 +83,24 @@ septic_patients \%>\% select(amox, nitr, fosf, trim, cipr) \%>\% ggplot_rsi() +# for colourblind mode, use divergent colours from the viridis package: +septic_patients \%>\% + select(amox, nitr, fosf, trim, cipr) \%>\% + ggplot_rsi() + scale_fill_viridis_d() + # get counts instead of percentages: septic_patients \%>\% select(amox, nitr, fosf, trim, cipr) \%>\% ggplot_rsi(fun = count_df) + +# add other ggplot2 parameters as you like: +septic_patients \%>\% + select(amox, nitr, fosf, trim, cipr) \%>\% + ggplot_rsi(width = 0.5, + colour = "black", + size = 1, + linetype = 2, + alpha = 0.25) \donttest{ # it also supports groups (don't forget to use the group on `x` or `facet`): septic_patients \%>\% @@ -115,7 +129,7 @@ septic_patients \%>\% left_join_microorganisms() \%>\% # select full name and some antiseptic drugs select(mo = fullname, - cfur, gent, cipr) \%>\% + cfur, gent, cipr) \%>\% # group by MO group_by(mo) \%>\% # plot the thing, putting MOs on the facet diff --git a/tests/testthat/test-atc.R b/tests/testthat/test-atc.R index 5c09d22a..342aed7f 100755 --- a/tests/testthat/test-atc.R +++ b/tests/testthat/test-atc.R @@ -33,10 +33,13 @@ test_that("guess_atc works", { rep("J01FA01", 8)) expect_identical(class(as.atc("amox")), "atc") - + expect_identical(class(pull(antibiotics, atc)), "atc") expect_identical(ab_trivial_nl("Cefmenoxim"), "Cefmenoxim") expect_warning(as.atc("Z00ZZ00")) # not yet available in data set + expect_warning(as.atc("UNKNOWN")) + + expect_output(print(as.atc("amox"))) # first 5 chars of official name expect_equal(as.character(as.atc(c("nitro", "cipro"))), diff --git a/tests/testthat/test-bactid.R b/tests/testthat/test-bactid.R index a86f58dc..8210b3bc 100644 --- a/tests/testthat/test-bactid.R +++ b/tests/testthat/test-bactid.R @@ -10,10 +10,13 @@ test_that("as.bactid works", { expect_equal(as.character(as.bactid("Escherichia species")), "ESC") expect_equal(as.character(as.bactid(" ESCCOL ")), "ESCCOL") expect_equal(as.character(as.bactid("klpn")), "KLEPNE") + expect_equal(as.character(as.bactid("Klebsiella")), "KLE") + expect_equal(as.character(as.bactid("coagulase negative")), "STACNS") expect_equal(as.character(as.bactid("P. aer")), "PSEAER") # not Pasteurella aerogenes expect_equal(as.character(as.bactid("Negative rods")), "GNR") + expect_equal(as.character(as.bactid("Gram negative rods")), "GNR") # GLIMS expect_equal(as.character(as.bactid("shiboy")), "SHIBOY") @@ -65,6 +68,8 @@ test_that("as.bactid works", { expect_identical(as.character(guess_bactid("S. salivarius", Lancefield = FALSE)), "STCSAL") expect_identical(as.character(guess_bactid("S. salivarius", Lancefield = TRUE)), "STCGRK") # group K + library(dplyr) + # select with one column expect_identical( septic_patients[1:10,] %>% @@ -88,6 +93,9 @@ test_that("as.bactid works", { # unknown results expect_warning(as.bactid(c("INVALID", "Yeah, unknown"))) + # too many columns + expect_error(septic_patients %>% select(1:3) %>% as.bactid()) + # print expect_output(print(as.bactid(c("ESCCOL", NA)))) diff --git a/tests/testthat/test-eucast.R b/tests/testthat/test-eucast.R index 2efc363c..d2f977b6 100755 --- a/tests/testthat/test-eucast.R +++ b/tests/testthat/test-eucast.R @@ -1,6 +1,10 @@ context("eucast.R") test_that("EUCAST rules work", { + + expect_error(EUCAST_rules(septic_patients, col_bactid = "Non-existing")) + + expect_identical(colnames(septic_patients), colnames(suppressWarnings(EUCAST_rules(septic_patients)))) @@ -31,4 +35,31 @@ test_that("EUCAST rules work", { coli = "R", # Colistin stringsAsFactors = FALSE) expect_equal(suppressWarnings(EUCAST_rules(a, info = FALSE)), b) + + # pita must be R in Enterobacteriaceae when tica is R + library(dplyr) + expect_equal(suppressWarnings( + septic_patients %>% + mutate(tica = as.rsi("R"), + pita = as.rsi("S")) %>% + EUCAST_rules(col_bactid = "bactid") %>% + left_join_microorganisms() %>% + filter(family == "Enterobacteriaceae") %>% + pull(pita) %>% + unique() %>% + as.character()), + "R") + # azit and clar must be equal to eryt + expect_equal(suppressWarnings( + septic_patients %>% + mutate(azit = as.rsi("R"), + clar = as.rsi("R")) %>% + EUCAST_rules(col_bactid = "bactid") %>% + pull(clar)), + suppressWarnings( + septic_patients %>% + EUCAST_rules(col_bactid = "bactid") %>% + left_join_microorganisms() %>% + pull(eryt))) + }) diff --git a/tests/testthat/test-first_isolate.R b/tests/testthat/test-first_isolate.R index 2bd1f38f..5f1f973e 100755 --- a/tests/testthat/test-first_isolate.R +++ b/tests/testthat/test-first_isolate.R @@ -25,6 +25,20 @@ test_that("first isolates work", { info = TRUE), na.rm = TRUE)), 1426) + # and 1449 when not ignoring I + expect_equal( + suppressWarnings( + sum( + first_isolate(tbl = septic_patients %>% mutate(keyab = key_antibiotics(.)), + col_date = "date", + col_patient_id = "patient_id", + col_bactid = "bactid", + col_keyantibiotics = "keyab", + ignore_I = FALSE, + type = "keyantibiotics", + info = TRUE), + na.rm = TRUE)), + 1449) # and 1430 when using points expect_equal( suppressWarnings( @@ -86,10 +100,34 @@ test_that("first isolates work", { na.rm = TRUE), 1501) + # "No isolates found" expect_message(septic_patients %>% mutate(specimen = "test") %>% mutate(first = first_isolate(., "date", "patient_id", - col_bactid = "bactid", col_specimen = "specimen", - filter_specimen = "something_unexisting"))) + col_bactid = "bactid", + col_specimen = "specimen", + filter_specimen = "something_unexisting", + output_logical = FALSE))) + + # printing of exclusion message + expect_output(septic_patients %>% + first_isolate(col_date = "date", + col_bactid = "bactid", + col_patient_id = "patient_id", + col_testcode = "sex", + testcodes_exclude = "M")) + + # errors expect_error(first_isolate("date", "patient_id", col_bactid = "bactid")) + expect_error(first_isolate(septic_patients)) + expect_error(first_isolate(septic_patients, + col_date = "non-existing col", + col_bactid = "bactid")) + + expect_warning(septic_patients %>% + mutate(bactid = as.character(bactid)) %>% + first_isolate(col_date = "date", + col_bactid = "bactid", + col_patient_id = "patient_id")) + })