From f05e7178cb21ff07282b4247fd39f58a752febc2 Mon Sep 17 00:00:00 2001 From: "Matthijs S. Berends" Date: Wed, 9 May 2018 11:44:46 +0200 Subject: [PATCH] added vignette of freq --- .gitignore | 1 + DESCRIPTION | 9 +- NEWS.md | 11 +- R/freq.R | 135 +++++++------- README.md | 2 +- data/septic_patients.rda | Bin 35366 -> 35579 bytes man/freq.Rd | 20 +- tests/testthat/test-eucast.R | 2 +- tests/testthat/test-freq.R | 8 +- tests/testthat/test-mdro.R | 2 +- vignettes/freq.R | 91 +++++++++ vignettes/freq.Rmd | 183 +++++++++++++++++++ vignettes/freq.html | 344 +++++++++++++++++++++++++++++++++++ 13 files changed, 726 insertions(+), 82 deletions(-) create mode 100644 vignettes/freq.R create mode 100644 vignettes/freq.Rmd create mode 100644 vignettes/freq.html diff --git a/.gitignore b/.gitignore index e4a31cd9..d7381655 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ .Ruserdata AMR.Rproj tests/testthat/Rplots.pdf +inst/doc diff --git a/DESCRIPTION b/DESCRIPTION index f06f8f3f..26eb8ac1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 0.2.0 -Date: 2018-05-02 +Version: 0.2.0.9000 +Date: 2018-05-09 Title: Antimicrobial Resistance Analysis Authors@R: c( person( @@ -37,7 +37,10 @@ Imports: tibble Suggests: testthat (>= 1.0.2), - covr (>= 3.0.1) + covr (>= 3.0.1), + knitr, + rmarkdown +VignetteBuilder: knitr URL: https://github.com/msberends/AMR BugReports: https://github.com/msberends/AMR/issues License: GPL-2 | file LICENSE diff --git a/NEWS.md b/NEWS.md index 51194f3d..cffdf5e7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,13 @@ -# 0.2.0 +# 0.2.9000 (development version) +#### New +* Vignettes about frequency tables: [vignettes/freq.html](vignettes/freq.html) +* Possibility to globally set the default for the amount of items to print in frequency tables (`freq` function), with `options(max.print.freq = n)` + +#### Changed +* Renamed `toConsole` parameter of `freq` to `as.data.frame` +* Small translational improvements to the `septic_patients` dataset + +# 0.2.0 (latest stable version) #### New * Full support for Windows, Linux and macOS * Full support for old R versions, only R-3.0.0 (April 2013) or later is needed (needed packages may have other dependencies) diff --git a/R/freq.R b/R/freq.R index bb592c0e..00a791ad 100644 --- a/R/freq.R +++ b/R/freq.R @@ -21,10 +21,10 @@ #' Create a frequency table of a vector of data, a single column or a maximum of 9 columns of a data frame. Supports markdown for reports. #' @param x data #' @param sort.count Sort on count. Use \code{FALSE} to sort alphabetically on item. -#' @param nmax number of row to print. Use \code{nmax = 0} or \code{nmax = NA} to print all rows. -#' @param na.rm a logical value indicating whether NA values should be removed from the frequency table. The header will always print the amount of\code{NA}s. +#' @param nmax number of row to print. The default, \code{15}, uses \code{\link[base]{getOption}("max.print.freq")}. Use \code{nmax = 0} or \code{nmax = NA} to print all rows. +#' @param na.rm a logical value indicating whether NA values should be removed from the frequency table. The header will always print the amount of \code{NA}s. #' @param markdown print table in markdown format (this forces \code{nmax = NA}) -#' @param toConsole Print table to the console. Use \code{FALSE} to assign the table to an object. +#' @param as.data.frame return frequency table without header as a \code{data.frame} (e.g. to assign the table to an object) #' @param digits how many significant digits are to be used for numeric values (not for the items themselves, that depends on \code{\link{getOption}("digits")}) #' @param sep a character string to separate the terms when selecting multiple columns #' @details For numeric values, the next values will be calculated and shown into the header: @@ -32,7 +32,7 @@ #' \item{Mean, using \code{\link[base]{mean}}} #' \item{Standard deviation, using \code{\link[stats]{sd}}} #' \item{Five numbers of Tukey (min, Q1, median, Q3, max), using \code{\link[stats]{fivenum}}} -#' \item{Outliers (count and list), using \code{\link{boxplot.stats}}} +#' \item{Outliers (total count and unique count), using \code{\link{boxplot.stats}}} #' \item{Coefficient of variation (CV), the standard deviation divided by the mean} #' \item{Coefficient of quartile variation (CQV, sometimes called coefficient of dispersion), calculated as \code{(Q3 - Q1) / (Q3 + Q1)} using \code{\link{quantile}} with \code{type = 6} as quantile algorithm to comply with SPSS standards} #' } @@ -63,13 +63,13 @@ #' years <- septic_patients %>% #' mutate(year = format(date, "%Y")) %>% #' select(year) %>% -#' freq(toConsole = FALSE) +#' freq(as.data.frame = TRUE) freq <- function(x, sort.count = TRUE, - nmax = 15, + nmax = getOption("max.print.freq"), na.rm = TRUE, markdown = FALSE, - toConsole = TRUE, + as.data.frame = FALSE, digits = 2, sep = " ") { @@ -156,8 +156,8 @@ freq <- function(x, stop('A maximum of 9 columns can be analysed at the same time.', call. = FALSE) } } - if (markdown == TRUE & toConsole == FALSE) { - warning('`toConsole = FALSE` will be ignored when `markdown = TRUE`.') + if (markdown == TRUE & as.data.frame == TRUE) { + warning('`as.data.frame = TRUE` will be ignored when `markdown = TRUE`.') } if (mult.columns > 1) { @@ -232,7 +232,7 @@ freq <- function(x, x <- x %>% format(formatdates) } - if (toConsole == TRUE) { + if (as.data.frame == FALSE) { cat(header) } @@ -244,22 +244,30 @@ freq <- function(x, warning('All observations are unique.', call. = FALSE) } - if (nmax == 0 | is.na(nmax)) { + nmax.set <- !missing(nmax) + if (is.null(nmax) & is.null(base::getOption("max.print.freq", default = NULL))) { + # default for max print setting + nmax <- 15 + } + + if (nmax == 0 | is.na(nmax) | is.null(nmax)) { nmax <- length(x) } nmax.1 <- min(length(x), nmax + 1) # create table with counts and percentages + column_names <- c('Item', 'Count', 'Percent', 'Cum. Count', 'Cum. Percent', '(Factor Level)') + column_names_df <- c('item', 'count', 'percent', 'cum_count', 'cum_percent', 'factor_level') if (any(class(x) == 'factor')) { df <- tibble::tibble(Item = x, Fctlvl = x %>% as.integer()) %>% group_by(Item, Fctlvl) - column_names <- c('Item', 'Count', 'Percent', 'Cum. Count', 'Cum. Percent', '(Factor Level)') column_align <- c('l', 'r', 'r', 'r', 'r', 'r') } else { df <- tibble::tibble(Item = x) %>% group_by(Item) - column_names <- c('Item', 'Count', 'Percent', 'Cum. Count', 'Cum. Percent') + column_names <- column_names[1:5] # strip factor lvl + column_names_df <- column_names_df[1:5] # strip factor lvl column_align <- c(x_align, 'r', 'r', 'r', 'r') } df <- df %>% @@ -276,10 +284,10 @@ freq <- function(x, # sort according to setting if (sort.count == TRUE) { - df <- df %>% arrange(desc(Count)) + df <- df %>% arrange(desc(Count), Item) } else { if (any(class(x) == 'factor')) { - df <- df %>% arrange(Fctlvl) + df <- df %>% arrange(Fctlvl, Item) } else { df <- df %>% arrange(Item) } @@ -295,65 +303,68 @@ freq <- function(x, df <- df %>% select(Item, Count, Percent, Cum, CumTot, Fctlvl) } + if (as.data.frame == TRUE) { + # assign to object + df[, 3] <- df[, 2] / sum(df[, 2], na.rm = TRUE) + df[, 4] <- cumsum(df[, 2]) + df[, 5] <- df[, 4] / sum(df[, 2], na.rm = TRUE) + colnames(df) <- column_names_df + return(as.data.frame(df, stringsAsFactors = FALSE)) + } + if (markdown == TRUE) { tblformat <- 'markdown' } else { tblformat <- 'pandoc' } - if (toConsole == FALSE) { - # assign to object - df[, 3] <- df[, 2] / sum(df[, 2], na.rm = TRUE) - df[, 4] <- cumsum(df[, 2]) - df[, 5] <- df[, 4] / sum(df[, 2], na.rm = TRUE) - return(df) + # save old NA setting for kable + opt.old <- options()$knitr.kable.NA + options(knitr.kable.NA = "") - } else { + Count.rest <- sum(df[nmax.1:nrow(df), 'Count'], na.rm = TRUE) + if (any(class(x) %in% c('double', 'integer', 'numeric', 'raw', 'single'))) { + df <- df %>% mutate(Item = format(Item)) + } + df <- df %>% mutate(Count = format(Count)) - # save old NA setting for kable - opt.old <- options()$knitr.kable.NA - options(knitr.kable.NA = "") - - Count.rest <- sum(df[nmax.1:nrow(df), 'Count'], na.rm = TRUE) - if (any(class(x) %in% c('double', 'integer', 'numeric', 'raw', 'single'))) { - df <- df %>% mutate(Item = format(Item)) - } - df <- df %>% mutate(Count = format(Count)) - - if (nrow(df) > nmax.1 & markdown == FALSE) { - df2 <- df[1:nmax,] - print( - knitr::kable(df2, - format = tblformat, - col.names = column_names, - align = column_align, - padding = 1) - ) - cat('... and ', - format(nrow(df) - nmax), - ' more ', - paste0('(n = ', - format(Count.rest), - '; ', - (Count.rest / length(x)) %>% percent(force_zero = TRUE), - ')'), - '. Use `nmax` to show more rows.\n', sep = '') - - } else { - print( - knitr::kable(df, - format = tblformat, - col.names = column_names, - align = column_align, - padding = 1) - ) + if (nrow(df) > nmax.1 & markdown == FALSE) { + df2 <- df[1:nmax,] + print( + knitr::kable(df2, + format = tblformat, + col.names = column_names, + align = column_align, + padding = 1) + ) + cat('... and ', + format(nrow(df) - nmax), + ' more ', + paste0('(n = ', + format(Count.rest), + '; ', + (Count.rest / length(x)) %>% percent(force_zero = TRUE), + ')'), + '.', sep = '') + if (nmax.set == FALSE) { + cat(' Use `nmax` to show more or less rows.') } cat('\n') - # reset old kable setting - options(knitr.kable.NA = opt.old) - return(invisible()) + } else { + print( + knitr::kable(df, + format = tblformat, + col.names = column_names, + align = column_align, + padding = 1) + ) } + cat('\n') + + # reset old kable setting + options(knitr.kable.NA = opt.old) + return(invisible()) } #' @rdname freq diff --git a/README.md b/README.md index 4d889336..8107df26 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![logo_rug](man/figures/logo_rug.png)](https://www.rug.nl)[![logo_umcg](man/figures/logo_umcg.png)](https://www.umcg.nl) -This R package was created for academic research by PhD students of the Faculty of Medical Sciences of the [University of Groningen)](https://www.rug.nl) and the Medical Microbiology & Infection Prevention (MMBI) department of the [University Medical Center Groningen (UMCG)](https://www.umcg.nl). See [Authors](#authors). +This R package was created for academic research by PhD students of the Faculty of Medical Sciences of the [University of Groningen](https://www.rug.nl) and the Medical Microbiology & Infection Prevention (MMBI) department of the [University Medical Center Groningen (UMCG)](https://www.umcg.nl). See [Authors](#authors). ## Why this package? This R package contains functions to make **microbiological, epidemiological data analysis easier**. It allows the use of some new classes to work with MIC values and antimicrobial interpretations (i.e. values S, I and R). diff --git a/data/septic_patients.rda b/data/septic_patients.rda index 272d28f9b8a13e141ae7d01583c4d769157df18f..9a4cb8c3481313dc48ebf95d82fb2fb1728e33c5 100644 GIT binary patch delta 32784 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 delta 32481 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\% years <- septic_patients \%>\% mutate(year = format(date, "\%Y")) \%>\% select(year) \%>\% - freq(toConsole = FALSE) + freq(as.data.frame = TRUE) } \keyword{freq} \keyword{frequency} diff --git a/tests/testthat/test-eucast.R b/tests/testthat/test-eucast.R index a7d8a0e1..666f5970 100644 --- a/tests/testthat/test-eucast.R +++ b/tests/testthat/test-eucast.R @@ -1,7 +1,7 @@ context("eucast.R") test_that("EUCAST rules work", { - a <- EUCAST_rules(septic_patients) + a <- suppressWarnings(EUCAST_rules(septic_patients)) a <- data.frame(bactid = c("KLEPNE", # Klebsiella pneumoniae "PSEAER", # Pseudomonas aeruginosa diff --git a/tests/testthat/test-freq.R b/tests/testthat/test-freq.R index 5aa65cb9..02bf695d 100644 --- a/tests/testthat/test-freq.R +++ b/tests/testthat/test-freq.R @@ -1,12 +1,12 @@ context("freq.R") test_that("frequency table works", { - expect_equal(nrow(freq(c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5), toConsole = FALSE)), 5) - expect_equal(nrow(frequency_tbl(c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5), toConsole = FALSE)), 5) + expect_equal(nrow(freq(c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5), as.data.frame = TRUE)), 5) + expect_equal(nrow(frequency_tbl(c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5), as.data.frame = TRUE)), 5) # date column of septic_patients should contain 1662 unique dates - expect_equal(nrow(freq(septic_patients$date, toConsole = FALSE)), 1662) - expect_equal(nrow(freq(septic_patients$date, toConsole = FALSE)), + expect_equal(nrow(freq(septic_patients$date, as.data.frame = TRUE)), 1662) + expect_equal(nrow(freq(septic_patients$date, as.data.frame = TRUE)), length(unique(septic_patients$date))) expect_output(freq(septic_patients$age)) diff --git a/tests/testthat/test-mdro.R b/tests/testthat/test-mdro.R index a8fc1a00..d2d38986 100644 --- a/tests/testthat/test-mdro.R +++ b/tests/testthat/test-mdro.R @@ -13,7 +13,7 @@ test_that("MDRO works", { expect_equal(outcome %>% class(), c('ordered', 'factor')) # septic_patients should have these finding using Dutch guidelines - expect_equal(outcome %>% freq(toConsole = FALSE) %>% pull(Count), c(3, 21)) + expect_equal(outcome %>% freq(as.data.frame = TRUE) %>% pull(count), c(3, 21)) expect_equal(BRMO(septic_patients, info = FALSE), MDRO(septic_patients, "nl", info = FALSE)) diff --git a/vignettes/freq.R b/vignettes/freq.R new file mode 100644 index 00000000..84ddea08 --- /dev/null +++ b/vignettes/freq.R @@ -0,0 +1,91 @@ +## ----setup, include = FALSE, results = 'markup'-------------------------- +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#" +) +library(dplyr) +library(AMR) + +## ---- echo = TRUE, results = 'hide'-------------------------------------- +# # just using base R +freq(septic_patients$sex) + +# # using base R to select the variable and pass it on with a pipe +septic_patients$sex %>% freq() + +# # do it all with pipes, using the `select` function of the dplyr package +septic_patients %>% + select(sex) %>% + freq() + +## ---- echo = TRUE-------------------------------------------------------- +freq(septic_patients$sex) + +## ---- echo = TRUE, results = 'hide'-------------------------------------- +my_patients <- septic_patients %>% + left_join_microorganisms() + +## ---- echo = TRUE-------------------------------------------------------- +colnames(microorganisms) + +## ---- echo = TRUE-------------------------------------------------------- +dim(septic_patients) +dim(my_patients) + +## ---- echo = TRUE-------------------------------------------------------- +my_patients %>% + select(genus, species) %>% + freq() + +## ---- echo = TRUE-------------------------------------------------------- +# # get age distribution of unique patients +septic_patients %>% + distinct(patient_id, .keep_all = TRUE) %>% + select(age) %>% + freq(nmax = 5) + +## ---- echo = TRUE-------------------------------------------------------- +septic_patients %>% + select(hospital_id) %>% + freq() + +## ---- echo = TRUE-------------------------------------------------------- +septic_patients %>% + select(hospital_id) %>% + freq(sort.count = TRUE) + +## ---- echo = TRUE-------------------------------------------------------- +septic_patients %>% + select(amox) %>% + freq() + +## ---- echo = TRUE-------------------------------------------------------- +septic_patients %>% + select(date) %>% + freq(nmax = 5) + +## ---- echo = TRUE-------------------------------------------------------- +septic_patients %>% + select(amox) %>% + freq(na.rm = FALSE) + +## ---- echo = TRUE-------------------------------------------------------- +septic_patients %>% + select(hospital_id) %>% + freq(markdown = TRUE) + +## ---- echo = TRUE-------------------------------------------------------- +my_df <- septic_patients %>% + select(hospital_id) %>% + freq(as.data.frame = TRUE) + +my_df + +class(my_df) + +## ---- echo = FALSE------------------------------------------------------- +# this will print "2018" in 2018, and "2018-yyyy" after 2018. +yrs <- c(2018:format(Sys.Date(), "%Y")) +yrs <- c(min(yrs), max(yrs)) +yrs <- paste(unique(yrs), collapse = "-") + diff --git a/vignettes/freq.Rmd b/vignettes/freq.Rmd new file mode 100644 index 00000000..7eb895e7 --- /dev/null +++ b/vignettes/freq.Rmd @@ -0,0 +1,183 @@ +--- +title: "Creating Frequency Tables" +author: "Matthijs S. Berends" +output: + rmarkdown::html_vignette: + toc: true +vignette: > + %\VignetteIndexEntry{Vignette Title} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include = FALSE, results = 'markup'} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#" +) +library(dplyr) +library(AMR) +``` + +## Introduction + +Frequency tables (or frequency distributions) are summaries of the distribution of values in a sample. With the `freq` function, you can create univariate frequency tables. Multiple variables will be pasted into one variable, so it forces a univariate distribution. We take the `septic_patients` dataset (included in this AMR package) as example. + +## Frequencies of one variable + +To only show and quickly review the content of one variable, you can just select this variable in various ways. Let's say we want to get the frequencies of the `sex` variable of the `septic_patients` dataset: +```{r, echo = TRUE, results = 'hide'} +# # just using base R +freq(septic_patients$sex) + +# # using base R to select the variable and pass it on with a pipe +septic_patients$sex %>% freq() + +# # do it all with pipes, using the `select` function of the dplyr package +septic_patients %>% + select(sex) %>% + freq() +``` +This will all lead to the following table: +```{r, echo = TRUE} +freq(septic_patients$sex) +``` +This immediately shows the class of the variable, its length and availability (i.e. the amount of `NA`), the amount of unique values and (most importantly) that among septic patients men are more prevalent than women. + +## Frequencies of more than one variable + +Multiple variables will be pasted into one variable to review individual cases, keeping a univariate frequency table. + +For illustration, we could add some more variables to the `septic_patients` dataset to learn about bacterial properties: +```{r, echo = TRUE, results = 'hide'} +my_patients <- septic_patients %>% + left_join_microorganisms() +``` +Now all variables of the `microorganisms` dataset have been joined to the `septic_patients` dataset. The `microorganisms` dataset consists of the following variables: +```{r, echo = TRUE} +colnames(microorganisms) +``` + +If we compare the dimensions between the old and new dataset, we can see that these `r ncol(my_patients) - ncol(septic_patients)` variables were added: +```{r, echo = TRUE} +dim(septic_patients) +dim(my_patients) +``` + +So now the `genus` and `species` variables are available. A frequency table of these combined variables can be created like this: +```{r, echo = TRUE} +my_patients %>% + select(genus, species) %>% + freq() +``` + +## Frequencies of numeric values + +Frequency tables can be created of any input. + +In case of numeric values (like integers, doubles, etc.) additional descriptive statistics will be calculated and shown into the header: + +```{r, echo = TRUE} +# # get age distribution of unique patients +septic_patients %>% + distinct(patient_id, .keep_all = TRUE) %>% + select(age) %>% + freq(nmax = 5) +``` + +So the following properties are determined, where `NA` values are always ignored: + +* **Mean** + +* **Standard deviation** + +* **Coefficient of variation** (CV), the standard deviation divided by the mean + +* **Five numbers of Tukey** (min, Q1, median, Q3, max) + +* **Coefficient of quartile variation** (CQV, sometimes called coefficient of dispersion), calculated as (Q3 - Q1) / (Q3 + Q1) using quantile with `type = 6` as quantile algorithm to comply with SPSS standards + +* **Outliers** (total count and unique count) + +So for example, the above frequency table quickly shows the median age of patients being `r my_patients %>% distinct(patient_id, .keep_all = TRUE) %>% pull(age) %>% median(na.rm = TRUE)`. + +## Frequencies of factors + +Frequencies of factors will be sorted on factor level instead of item count by default. This can be changed with the `sort.count` parameter. Frequency tables of factors always show the factor level as an additional last column. + +`sort.count` is `TRUE` by default, except for factors. Compare this default behaviour: + +```{r, echo = TRUE} +septic_patients %>% + select(hospital_id) %>% + freq() +``` + +To this, where items are now sorted on item count: + +```{r, echo = TRUE} +septic_patients %>% + select(hospital_id) %>% + freq(sort.count = TRUE) +``` + +All classes will be printed into the header. Variables with the new `rsi` class of this AMR package are actually ordered factors and have three classes (look at `Class` in the header): + +```{r, echo = TRUE} +septic_patients %>% + select(amox) %>% + freq() +``` + +## Frequencies of dates + +Frequencies of dates will show the oldest and newest date in the data, and the amount of days between them: + +```{r, echo = TRUE} +septic_patients %>% + select(date) %>% + freq(nmax = 5) +``` + +## Additional parameters + +### Parameter `na.rm` +With the `na.rm` parameter (defaults to `TRUE`, but they will always be shown into the header), you can include `NA` values in the frequency table: +```{r, echo = TRUE} +septic_patients %>% + select(amox) %>% + freq(na.rm = FALSE) +``` + +### Parameter `markdown` +The `markdown` parameter can be used in reports created with R Markdown. This will always print all rows: + +```{r, echo = TRUE} +septic_patients %>% + select(hospital_id) %>% + freq(markdown = TRUE) +``` + +### Parameter `as.data.frame` +With the `as.data.frame` parameter you can assign the frequency table to an object, or just print it as a `data.frame` to the console: + +```{r, echo = TRUE} +my_df <- septic_patients %>% + select(hospital_id) %>% + freq(as.data.frame = TRUE) + +my_df + +class(my_df) +``` + +---- +```{r, echo = FALSE} +# this will print "2018" in 2018, and "2018-yyyy" after 2018. +yrs <- c(2018:format(Sys.Date(), "%Y")) +yrs <- c(min(yrs), max(yrs)) +yrs <- paste(unique(yrs), collapse = "-") +``` +AMR, (c) `r yrs`, `r packageDescription("AMR")$URL` + +Licensed under the [GNU General Public License v2.0](https://github.com/msberends/AMR/blob/master/LICENSE). diff --git a/vignettes/freq.html b/vignettes/freq.html new file mode 100644 index 00000000..f956a698 --- /dev/null +++ b/vignettes/freq.html @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + +Creating Frequency Tables + + + + + + + + + + + + + + + + + +

Creating Frequency Tables

+

Matthijs S. Berends

+ + +
+ +
+

Introduction

+

Frequency tables (or frequency distributions) are summaries of the distribution of values in a sample. With the freq function, you can create univariate frequency tables. Multiple variables will be pasted into one variable, so it forces a univariate distribution. We take the septic_patients dataset (included in this AMR package) as example.

+
+
+

Frequencies of one variable

+

To only show and quickly review the content of one variable, you can just select this variable in various ways. Let’s say we want to get the frequencies of the sex variable of the septic_patients dataset:

+
# # just using base R
+freq(septic_patients$sex)
+
+# # using base R to select the variable and pass it on with a pipe
+septic_patients$sex %>% freq()
+
+# # do it all with pipes, using the `select` function of the dplyr package
+septic_patients %>%
+  select(sex) %>%
+  freq()
+

This will all lead to the following table:

+
freq(septic_patients$sex)
+# Class:     character
+# Length:    2000 (of which NA: 0 = 0.0%)
+# Unique:    2
+# 
+# Item    Count   Percent   Cum. Count   Cum. Percent
+# -----  ------  --------  -----------  -------------
+# M        1112     55.6%         1112          55.6%
+# F         888     44.4%         2000         100.0%
+

This immediately shows the class of the variable, its length and availability (i.e. the amount of NA), the amount of unique values and (most importantly) that among septic patients men are more prevalent than women.

+
+
+

Frequencies of more than one variable

+

Multiple variables will be pasted into one variable to review individual cases, keeping a univariate frequency table.

+

For illustration, we could add some more variables to the septic_patients dataset to learn about bacterial properties:

+
my_patients <- septic_patients %>% 
+  left_join_microorganisms()
+

Now all variables of the microorganisms dataset have been joined to the septic_patients dataset. The microorganisms dataset consists of the following variables:

+
colnames(microorganisms)
+#  [1] "bactid"       "bactsys"      "family"       "genus"       
+#  [5] "species"      "subspecies"   "fullname"     "type"        
+#  [9] "gramstain"    "aerobic"      "type_nl"      "gramstain_nl"
+

If we compare the dimensions between the old and new dataset, we can see that these 11 variables were added:

+
dim(septic_patients)
+# [1] 2000   47
+dim(my_patients)
+# [1] 2000   58
+

So now the genus and species variables are available. A frequency table of these combined variables can be created like this:

+
my_patients %>%
+  select(genus, species) %>%
+  freq()
+# Columns:   2
+# Length:    2000 (of which NA: 0 = 0.0%)
+# Unique:    137
+# 
+# Item                                 Count   Percent   Cum. Count   Cum. Percent
+# ----------------------------------  ------  --------  -----------  -------------
+# Escherichia coli                       485     24.2%          485          24.2%
+# Staphylococcus coagulase negatief      297     14.8%          782          39.1%
+# Staphylococcus aureus                  200     10.0%          982          49.1%
+# Staphylococcus epidermidis             150      7.5%         1132          56.6%
+# Streptococcus pneumoniae                97      4.9%         1229          61.5%
+# Staphylococcus hominis                  67      3.4%         1296          64.8%
+# Klebsiella pneumoniae                   65      3.2%         1361          68.0%
+# Enterococcus faecalis                   44      2.2%         1405          70.2%
+# Proteus mirabilis                       33      1.7%         1438          71.9%
+# Pseudomonas aeruginosa                  31      1.6%         1469          73.5%
+# Streptococcus pyogenes                  30      1.5%         1499          75.0%
+# Enterococcus faecium                    27      1.4%         1526          76.3%
+# Bacteroides fragilis                    26      1.3%         1552          77.6%
+# Enterobacter cloacae                    25      1.2%         1577          78.8%
+# Klebsiella oxytoca                      23      1.1%         1600          80.0%
+# ... and 122 more (n = 400; 20.0%). Use `nmax` to show more or less rows.
+
+
+

Frequencies of numeric values

+

Frequency tables can be created of any input.

+

In case of numeric values (like integers, doubles, etc.) additional descriptive statistics will be calculated and shown into the header:

+
# # get age distribution of unique patients
+septic_patients %>% 
+  distinct(patient_id, .keep_all = TRUE) %>% 
+  select(age) %>% 
+  freq(nmax = 5)
+# Class:     integer
+# Length:    1920 (of which NA: 0 = 0.0%)
+# Unique:    94
+#   
+# Mean:      68
+# Std. dev.: 18 (CV: 0.27)
+# Five-Num:  0  |  61  |  72  |  80  |  101 (CQV: 0.13)
+# Outliers:  94 (unique: 26)
+# 
+#  Item   Count   Percent   Cum. Count   Cum. Percent
+# -----  ------  --------  -----------  -------------
+#     0      34      1.8%           34           1.8%
+#     1       5      0.3%           39           2.0%
+#     2       5      0.3%           44           2.3%
+#     3       2      0.1%           46           2.4%
+#     4       1      0.1%           47           2.4%
+# ... and 89 more (n = 1873; 97.6%).
+

So the following properties are determined, where NA values are always ignored:

+
    +
  • Mean

  • +
  • Standard deviation

  • +
  • Coefficient of variation (CV), the standard deviation divided by the mean

  • +
  • Five numbers of Tukey (min, Q1, median, Q3, max)

  • +
  • Coefficient of quartile variation (CQV, sometimes called coefficient of dispersion), calculated as (Q3 - Q1) / (Q3 + Q1) using quantile with type = 6 as quantile algorithm to comply with SPSS standards

  • +
  • Outliers (total count and unique count)

  • +
+

So for example, the above frequency table quickly shows the median age of patients being 72.

+
+
+

Frequencies of factors

+

Frequencies of factors will be sorted on factor level instead of item count by default. This can be changed with the sort.count parameter. Frequency tables of factors always show the factor level as an additional last column.

+

sort.count is TRUE by default, except for factors. Compare this default behaviour:

+
septic_patients %>%
+  select(hospital_id) %>% 
+  freq()
+# Class:     factor
+# Length:    2000 (of which NA: 0 = 0.0%)
+# Unique:    5
+# 
+# Item    Count   Percent   Cum. Count   Cum. Percent   (Factor Level)
+# -----  ------  --------  -----------  -------------  ---------------
+# A         233     11.7%          233          11.7%                1
+# B         583     29.1%          816          40.8%                2
+# C         221     11.1%         1037          51.8%                3
+# D         650     32.5%         1687          84.4%                4
+# E         313     15.7%         2000         100.0%                5
+

To this, where items are now sorted on item count:

+
septic_patients %>%
+  select(hospital_id) %>% 
+  freq(sort.count = TRUE)
+# Class:     factor
+# Length:    2000 (of which NA: 0 = 0.0%)
+# Unique:    5
+# 
+# Item    Count   Percent   Cum. Count   Cum. Percent   (Factor Level)
+# -----  ------  --------  -----------  -------------  ---------------
+# D         650     32.5%          650          32.5%                4
+# B         583     29.1%         1233          61.7%                2
+# E         313     15.7%         1546          77.3%                5
+# A         233     11.7%         1779          88.9%                1
+# C         221     11.1%         2000         100.0%                3
+

All classes will be printed into the header. Variables with the new rsi class of this AMR package are actually ordered factors and have three classes (look at Class in the header):

+
septic_patients %>%
+  select(amox) %>% 
+  freq()
+# Class:     factor > ordered > rsi
+# Length:    2000 (of which NA: 678 = 33.9%)
+# Unique:    3
+# 
+# Item    Count   Percent   Cum. Count   Cum. Percent   (Factor Level)
+# -----  ------  --------  -----------  -------------  ---------------
+# S         561     42.4%          561          42.4%                1
+# I          49      3.7%          610          46.1%                2
+# R         712     53.9%         1322         100.0%                3
+
+
+

Frequencies of dates

+

Frequencies of dates will show the oldest and newest date in the data, and the amount of days between them:

+
septic_patients %>%
+  select(date) %>% 
+  freq(nmax = 5)
+# Class:     Date
+# Length:    2000 (of which NA: 0 = 0.0%)
+# Unique:    1662
+# 
+# Oldest:    2 januari 2001
+# Newest:    18 oktober 2017 (+6133)
+# 
+# Item          Count   Percent   Cum. Count   Cum. Percent
+# -----------  ------  --------  -----------  -------------
+# 2008-12-24        5      0.2%            5           0.2%
+# 2010-12-10        4      0.2%            9           0.4%
+# 2011-03-03        4      0.2%           13           0.6%
+# 2013-06-24        4      0.2%           17           0.8%
+# 2017-09-01        4      0.2%           21           1.1%
+# ... and 1657 more (n = 1979; 99.0%).
+
+
+

Additional parameters

+
+

Parameter na.rm

+

With the na.rm parameter (defaults to TRUE, but they will always be shown into the header), you can include NA values in the frequency table:

+
septic_patients %>%
+  select(amox) %>% 
+  freq(na.rm = FALSE)
+# Class:     factor > ordered > rsi
+# Length:    2678 (of which NA: 678 = 25.3%)
+# Unique:    4
+# 
+# Item    Count   Percent   Cum. Count   Cum. Percent   (Factor Level)
+# -----  ------  --------  -----------  -------------  ---------------
+# S         561     28.1%          561          28.1%                1
+# I          49      2.5%          610          30.5%                2
+# R         712     35.6%         1322          66.1%                3
+# <NA>      678     33.9%         2000         100.0%             <NA>
+
+
+

Parameter markdown

+

The markdown parameter can be used in reports created with R Markdown. This will always print all rows:

+
septic_patients %>%
+  select(hospital_id) %>% 
+  freq(markdown = TRUE)
+# 
+# Class:     factor
+# 
+# Length:    2000 (of which NA: 0 = 0.0%)
+# 
+# Unique:    5
+# 
+# |Item | Count| Percent| Cum. Count| Cum. Percent| (Factor Level)|
+# |:----|-----:|-------:|----------:|------------:|--------------:|
+# |A    |   233|   11.7%|        233|        11.7%|              1|
+# |B    |   583|   29.1%|        816|        40.8%|              2|
+# |C    |   221|   11.1%|       1037|        51.8%|              3|
+# |D    |   650|   32.5%|       1687|        84.4%|              4|
+# |E    |   313|   15.7%|       2000|       100.0%|              5|
+
+
+

Parameter as.data.frame

+

With the as.data.frame parameter you can assign the frequency table to an object, or just print it as a data.frame to the console:

+
my_df <- septic_patients %>%
+  select(hospital_id) %>% 
+  freq(as.data.frame = TRUE)
+
+my_df
+#   item count percent cum_count cum_percent factor_level
+# 1    A   233  0.1165       233      0.1165            1
+# 2    B   583  0.2915       816      0.4080            2
+# 3    C   221  0.1105      1037      0.5185            3
+# 4    D   650  0.3250      1687      0.8435            4
+# 5    E   313  0.1565      2000      1.0000            5
+
+class(my_df)
+# [1] "data.frame"
+
+

AMR, (c) 2018, https://github.com/msberends/AMR

+

Licensed under the GNU General Public License v2.0.

+
+
+ + + + + + + +