diff --git a/DESCRIPTION b/DESCRIPTION index 7a5ff1a3..7de12b7f 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 0.2.0.9011 -Date: 2018-07-15 +Version: 0.2.0.9012 +Date: 2018-07-16 Title: Antimicrobial Resistance Analysis Authors@R: c( person( diff --git a/NAMESPACE b/NAMESPACE index 5787295f..c143ac82 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,6 +8,7 @@ S3method(as.vector,frequency_tbl) S3method(as_tibble,frequency_tbl) S3method(barplot,mic) S3method(barplot,rsi) +S3method(format,frequency_tbl) S3method(hist,frequency_tbl) S3method(kurtosis,data.frame) S3method(kurtosis,default) @@ -74,6 +75,7 @@ exportMethods(as.vector.frequency_tbl) exportMethods(as_tibble.frequency_tbl) exportMethods(barplot.mic) exportMethods(barplot.rsi) +exportMethods(format.frequency_tbl) exportMethods(hist.frequency_tbl) exportMethods(kurtosis) exportMethods(kurtosis.data.frame) @@ -97,12 +99,15 @@ importFrom(clipr,read_clip_tbl) importFrom(clipr,write_clip) importFrom(curl,nslookup) importFrom(dplyr,"%>%") +importFrom(dplyr,all_vars) +importFrom(dplyr,any_vars) importFrom(dplyr,arrange) importFrom(dplyr,arrange_at) importFrom(dplyr,as_tibble) importFrom(dplyr,between) importFrom(dplyr,desc) importFrom(dplyr,filter) +importFrom(dplyr,filter_at) importFrom(dplyr,group_by) importFrom(dplyr,group_by_at) importFrom(dplyr,if_else) @@ -118,6 +123,7 @@ importFrom(dplyr,slice) importFrom(dplyr,summarise) importFrom(dplyr,tibble) importFrom(dplyr,top_n) +importFrom(dplyr,vars) importFrom(grDevices,boxplot.stats) importFrom(graphics,axis) importFrom(graphics,barplot) diff --git a/NEWS.md b/NEWS.md index 27d5fe6f..7deef81d 100755 --- a/NEWS.md +++ b/NEWS.md @@ -14,7 +14,7 @@ ratio(c(772, 1611, 737), ratio = "1:2:1") * A vignette to explain its usage * Support for `table` to use as input: `freq(table(x, y))` * Support for existing functions `hist` and `plot` to use a frequency table as input: `hist(freq(df$age))` - * Support for `as.vector`, `as.data.frame` and `as_tibble` + * Support for `as.vector`, `as.data.frame`, `as_tibble` and `format` * Support for quasiquotation: `freq(mydata, mycolumn)` is the same as `mydata %>% freq(mycolumn)` * Function `top_freq` function to return the top/below *n* items as vector * Header of frequency tables now also show Mean Absolute Deviaton (MAD) and Interquartile Range (IQR) diff --git a/R/clipboard.R b/R/clipboard.R index bbe95558..d199daf7 100644 --- a/R/clipboard.R +++ b/R/clipboard.R @@ -7,6 +7,7 @@ #' This also supports automatic column type transformation, with AMR classes \code{\link{as.rsi}} and \code{\link{as.mic}}. #' @rdname clipboard #' @name clipboard +#' @inheritParams base::data.frame #' @inheritParams utils::read.table #' @inheritParams utils::write.table #' @inheritParams readr::locale @@ -20,6 +21,10 @@ #' @importFrom utils read.delim write.table object.size #' @importFrom readr parse_guess locale #' @details +#' The parameter \code{stringsAsFactors} defaults to \code{FALSE}, as opposed to most base \R methods. +#' +#' The parameters \code{date_format} and \code{time_format} also support generic date and time formats like \code{"dd-mm-yyyy"} like Excel. +#' #' \if{html}{ #' \strong{Example for copying from Excel:} #' \out{
}\figure{clipboard_copy.png}\out{
} @@ -36,10 +41,27 @@ #' \out{
}\figure{clipboard_rsi.png}\out{
} #' } #' @export +#' @examples +#' \dontrun{ +#' +#' df1 <- data.frame(a = letters[1:12], +#' b = runif(n = 12, min = 1000, max = 2000), +#' stringsAsFactors = FALSE) +#' clipboard_export(df1) +#' df2 <- clipboard_import() +#' identical(df1, df2) +#' +#' # send frequency table to clipboard (e.g. for pasting in Excel) +#' septic_patients %>% +#' freq(age) %>% +#' format() %>% # this will format the percentages +#' clipboard_export() +#' } clipboard_import <- function(sep = '\t', header = TRUE, dec = ".", na = c("", "NA", "NULL"), + stringsAsFactors = FALSE, startrow = 1, as_vector = TRUE, guess_col_types = TRUE, @@ -58,7 +80,7 @@ clipboard_import <- function(sep = '\t', dec = dec, na.strings = na, encoding = 'UTF-8', - stringsAsFactors = FALSE) + stringsAsFactors = stringsAsFactors) # use tibble, so column types will be translated correctly import_tbl <- as_tibble(import_tbl) @@ -91,6 +113,9 @@ clipboard_import <- function(sep = '\t', import_tbl <- import_tbl %>% pull(1) } + # and transform back to data.frame + import_tbl <- as.data.frame(import_tbl, stringsAsFactors = stringsAsFactors) + if (info == TRUE) { cat("Successfully imported from clipboard:", NROW(import_tbl), "obs. of", NCOL(import_tbl), "variables.\n") } diff --git a/R/freq.R b/R/freq.R index f73640ef..9d88c560 100755 --- a/R/freq.R +++ b/R/freq.R @@ -100,10 +100,13 @@ #' # show only the top 5 #' years %>% print(nmax = 5) #' +#' # save to an object with formatted percentages +#' years <- format(years) +#' #' # print a histogram of numeric values #' septic_patients %>% #' freq(age) %>% -#' hist() # prettier: ggplot(septic_patients, aes(age)) + geom_histogram() +#' hist() # prettier: ggplot(septic_patients, aes(age)) + geom_histogram() #' #' # or print all points to a regular plot #' septic_patients %>% @@ -124,13 +127,20 @@ #' freq(age) %>% #' as.vector() %>% #' sort(), -#' sort(septic_patients$age) -#' ) # TRUE +#' sort(septic_patients$age)) # TRUE #' -#' # also supports table: +#' # it also supports `table` objects: #' table(septic_patients$sex, #' septic_patients$age) %>% -#' freq() +#' freq(sep = " **sep** ") +#' +#' \dontrun{ +#' # send frequency table to clipboard (e.g. for pasting in Excel) +#' septic_patients %>% +#' freq(age) %>% +#' format() %>% # this will format the percentages +#' clipboard_export() +#' } frequency_tbl <- function(x, ..., sort.count = TRUE, @@ -603,3 +613,20 @@ plot.frequency_tbl <- function(x, y, ...) { as.vector.frequency_tbl <- function(x, mode = "any") { as.vector(rep(x$item, x$count), mode = mode) } + +#' @noRd +#' @exportMethod format.frequency_tbl +#' @export +format.frequency_tbl <- function(x, digits = 1, ...) { + opt <- attr(x, 'opt') + if (opt$nmax.set == TRUE) { + nmax <- opt$nmax + } else { + nmax <- getOption("max.print.freq", default = 15) + } + + x <- x[1:nmax,] + x$percent <- percent(x$percent, round = digits, force_zero = TRUE) + x$cum_percent <- percent(x$cum_percent, round = digits, force_zero = TRUE) + base::format.data.frame(x, ...) +} diff --git a/man/clipboard.Rd b/man/clipboard.Rd index 945853cf..e730ab56 100644 --- a/man/clipboard.Rd +++ b/man/clipboard.Rd @@ -7,9 +7,10 @@ \title{Import/export from clipboard} \usage{ clipboard_import(sep = "\\t", header = TRUE, dec = ".", na = c("", "NA", - "NULL"), startrow = 1, as_vector = TRUE, guess_col_types = TRUE, - date_names = "en", date_format = "\%Y-\%m-\%d", time_format = "\%H:\%M", - tz = Sys.timezone(), encoding = "UTF-8", info = TRUE) + "NULL"), stringsAsFactors = FALSE, startrow = 1, as_vector = TRUE, + guess_col_types = TRUE, date_names = "en", date_format = "\%Y-\%m-\%d", + time_format = "\%H:\%M", tz = Sys.timezone(), encoding = "UTF-8", + info = TRUE) clipboard_export(x, sep = "\\t", dec = ".", na = "", header = TRUE, info = TRUE) @@ -30,6 +31,11 @@ clipboard_export(x, sep = "\\t", dec = ".", na = "", header = TRUE, \item{na}{the string to use for missing values in the data.} +\item{stringsAsFactors}{logical: should character vectors be converted + to factors? The \sQuote{factory-fresh} default is \code{TRUE}, but + this can be changed by setting \code{\link{options}(stringsAsFactors + = FALSE)}.} + \item{startrow}{\emph{n}th row to start importing from. When \code{header = TRUE}, the import will start on row \code{startrow} \emph{below} the header.} \item{as_vector}{a logical value indicating whether data consisting of only one column should be imported as vector using \code{\link[dplyr]{pull}}. This will strip off the header.} @@ -80,7 +86,11 @@ The data will be read and written as tab-separated by default, which makes it po This also supports automatic column type transformation, with AMR classes \code{\link{as.rsi}} and \code{\link{as.mic}}. } \details{ -\if{html}{ +The parameter \code{stringsAsFactors} defaults to \code{FALSE}, as opposed to most base \R methods. + +The parameters \code{date_format} and \code{time_format} also support generic date and time formats like \code{"dd-mm-yyyy"} like Excel. + + \if{html}{ \strong{Example for copying from Excel:} \out{
}\figure{clipboard_copy.png}\out{
} \cr @@ -96,6 +106,23 @@ This also supports automatic column type transformation, with AMR classes \code{ \out{
}\figure{clipboard_rsi.png}\out{
} } } +\examples{ +\dontrun{ + +df1 <- data.frame(a = letters[1:12], + b = runif(n = 12, min = 1000, max = 2000), + stringsAsFactors = FALSE) +clipboard_export(df1) +df2 <- clipboard_import() +identical(df1, df2) + +# send frequency table to clipboard (e.g. for pasting in Excel) +septic_patients \%>\% + freq(age) \%>\% + format() \%>\% # this will format the percentages + clipboard_export() +} +} \keyword{clipboard} \keyword{clipboard_export} \keyword{clipboard_import} diff --git a/man/freq.Rd b/man/freq.Rd index f4745802..7bbc2099 100755 --- a/man/freq.Rd +++ b/man/freq.Rd @@ -111,10 +111,13 @@ years <- septic_patients \%>\% # show only the top 5 years \%>\% print(nmax = 5) +# save to an object with formatted percentages +years <- format(years) + # print a histogram of numeric values septic_patients \%>\% freq(age) \%>\% - hist() # prettier: ggplot(septic_patients, aes(age)) + geom_histogram() + hist() # prettier: ggplot(septic_patients, aes(age)) + geom_histogram() # or print all points to a regular plot septic_patients \%>\% @@ -135,13 +138,20 @@ identical(septic_patients \%>\% freq(age) \%>\% as.vector() \%>\% sort(), - sort(septic_patients$age) -) # TRUE + sort(septic_patients$age)) # TRUE -# also supports table: +# it also supports `table` objects: table(septic_patients$sex, septic_patients$age) \%>\% - freq() + freq(sep = " **sep** ") + +\dontrun{ +# send frequency table to clipboard (e.g. for pasting in Excel) +septic_patients \%>\% + freq(age) \%>\% + format() \%>\% # this will format the percentages + clipboard_export() +} } \keyword{freq} \keyword{frequency}