Title: | Tools to Format Numbers for Publication |
---|---|
Description: | Format numbers and plots for publication; includes the removal of leading zeros, standardization of number of digits, addition of affixes, and a p-value formatter. These tools combine the functionality of several 'base' functions such as 'paste()', 'format()', and 'sprintf()' into specific use case functions that are named in a way that is consistent with usage, making their names easy to remember and easy to deploy. |
Authors: | Tyler Rinker [aut, cre] |
Maintainer: | Tyler Rinker <[email protected]> |
License: | GPL-2 |
Version: | 0.7.1 |
Built: | 2024-10-31 16:32:45 UTC |
Source: | https://github.com/trinker/numform |
Many of the specialized functions in numform can change the type of the data from numeric to character causing the table formatting functions in various add-on packages to improperly align the elements. This function passes the columns with a regular expression to detect alignment regardless of column class.
alignment( x, left = "left", right = ifelse(left == "l", "r", "right"), additional.numeric = paste0("^((<b>(–|\\+)</b>)|(<?([0-9.%-]+)", "|(\\$?\\s*\\d+[KBM])))|(NaN|NA|Inf)$"), sep = NULL, ... )
alignment( x, left = "left", right = ifelse(left == "l", "r", "right"), additional.numeric = paste0("^((<b>(–|\\+)</b>)|(<?([0-9.%-]+)", "|(\\$?\\s*\\d+[KBM])))|(NaN|NA|Inf)$"), sep = NULL, ... )
x |
A |
left |
A value to print for left aligned columns. |
right |
A value to print for right aligned columns. If |
additional.numeric |
An additional regex to consider as numeric. To turn
off this feature use |
sep |
A string to collapse the vector on. |
... |
ignored. |
Returns a vector of lefts and rights or a string (if sep
is not
NULL
.
CO <- CO2 CO[] <- lapply(CO, as.character) alignment(CO) head(CO2) ## Not run: library(dplyr) library(pander) library(xtable) set.seed(10) dat <- data_frame( Team = rep(c("West Coast", "East Coast"), each = 4), Year = rep(2012:2015, 2), YearStart = round(rnorm(8, 2e6, 1e6) + sample(1:10/100, 8, TRUE), 2), Won = round(rnorm(8, 4e5, 2e5) + sample(1:10/100, 8, TRUE), 2), Lost = round(rnorm(8, 4.4e5, 2e5) + sample(1:10/100, 8, TRUE), 2), WinLossRate = Won/Lost, PropWon = Won/YearStart, PropLost = Lost/YearStart ) dat %>% group_by(Team) %>% mutate( `%ΔWinLoss` = fv_percent_diff(WinLossRate, 0), `ΔWinLoss` = f_sign(Won - Lost, '<b>+</b>', '<b>–</b>') ) %>% ungroup() %>% mutate_at(vars(Won:Lost), .funs = ff_denom(relative = -1, prefix = '$')) %>% mutate_at(vars(PropWon, PropLost), .funs = ff_prop2percent(digits = 0)) %>% mutate( YearStart = f_denom(YearStart, 1, prefix = '$'), Team = fv_runs(Team), WinLossRate = f_num(WinLossRate, 1) ) %>% as.data.frame() %>% pander::pander(split.tables = Inf, justify = alignment(.)) alignment(CO, 'l', 'r') CO %>% xtable(align = c('', alignment(CO, 'l', 'r'))) %>% print(include.rownames = FALSE) CO %>% xtable(align = c('', alignment(CO, 'l|', 'r|'))) %>% print(include.rownames = FALSE) ## End(Not run)
CO <- CO2 CO[] <- lapply(CO, as.character) alignment(CO) head(CO2) ## Not run: library(dplyr) library(pander) library(xtable) set.seed(10) dat <- data_frame( Team = rep(c("West Coast", "East Coast"), each = 4), Year = rep(2012:2015, 2), YearStart = round(rnorm(8, 2e6, 1e6) + sample(1:10/100, 8, TRUE), 2), Won = round(rnorm(8, 4e5, 2e5) + sample(1:10/100, 8, TRUE), 2), Lost = round(rnorm(8, 4.4e5, 2e5) + sample(1:10/100, 8, TRUE), 2), WinLossRate = Won/Lost, PropWon = Won/YearStart, PropLost = Lost/YearStart ) dat %>% group_by(Team) %>% mutate( `%ΔWinLoss` = fv_percent_diff(WinLossRate, 0), `ΔWinLoss` = f_sign(Won - Lost, '<b>+</b>', '<b>–</b>') ) %>% ungroup() %>% mutate_at(vars(Won:Lost), .funs = ff_denom(relative = -1, prefix = '$')) %>% mutate_at(vars(PropWon, PropLost), .funs = ff_prop2percent(digits = 0)) %>% mutate( YearStart = f_denom(YearStart, 1, prefix = '$'), Team = fv_runs(Team), WinLossRate = f_num(WinLossRate, 1) ) %>% as.data.frame() %>% pander::pander(split.tables = Inf, justify = alignment(.)) alignment(CO, 'l', 'r') CO %>% xtable(align = c('', alignment(CO, 'l', 'r'))) %>% print(include.rownames = FALSE) CO %>% xtable(align = c('', alignment(CO, 'l|', 'r|'))) %>% print(include.rownames = FALSE) ## End(Not run)
Convert month and weekday and weekday types to factor with correctly ordered
levels. Note that the 'forcats' package imported by the 'tidyverse' package,
has an as_factor
function that can compete with numform's version.
If in doubt, prefix with numform::as_factor
.
as_factor(x, shift = 0, ...)
as_factor(x, shift = 0, ...)
x |
A vector of weekdays or months. |
shift |
Shift the levels to the right or left. Useful for setting the week beginning to something besides Sunday. Use -1 to set to Monday instead. |
... |
ignored. |
Returns a factor vector with levels set.
dat <- structure(list(month1 = c("Jan", "Nov", "Mar", "Jul", "Aug", "Jan", "Aug", "May", "Dec", "Apr"), month2 = c("March", "May", "March", "July", "May", "October", "March", "November", "April", "January"), weekday1 = c("Th", "F", "M", "Su", "Th", "Su", "M", "Th", "W", "T"), weekday2 = c("We", "Th", "Fr", "Sa", "We", "Su", "Tu", "Su", "Su", "Th"), weekday3 = c("Sat", "Wed", "Mon", "Wed", "Wed", "Wed", "Wed", "Sun", "Fri", "Thu"), weekday4 = c("Sunday", "Sunday", "Thursday", "Saturday", "Monday", "Wednesday", "Friday", "Thursday", "Sunday", "Saturday")), .Names = c("month1", "month2", "weekday1", "weekday2", "weekday3", "weekday4")) ## Note that the 'forcats' package imported by the 'tidyverse' package, has an ## `as_factor` function that can compete with numform's version. If in doubt ## prefix with `numform::as_factor` as_factor(dat$month1) as_factor(dat$month2) as_factor(dat$weekday1) as_factor(dat$weekday2) as_factor(dat$weekday3) as_factor(dat$weekday4) ## shift levels as_factor(dat$weekday4, -1) as_factor(dat$weekday4, -2) as_factor(dat$weekday4, 1) as_factor(dat$weekday4, 2) ## Not run: library(tidyverse) data_frame( revenue = rnorm(10000, 500000, 50000), date = sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 10000, TRUE), site = sample(paste("Site", 1:5), 10000, TRUE) ) %>% mutate( dollar = f_comma(f_dollar(revenue, digits = -3)), thous = f_thous(revenue), thous_dollars = f_thous(revenue, prefix = '$'), abb_month = f_month(date), abb_week = numform::as_factor(f_weekday(date, distinct = TRUE)) ) %T>% print() %>% ggplot(aes(abb_week, revenue)) + geom_jitter(width = .2, height = 0, alpha = .2) + scale_y_continuous(label = ff_thous(prefix = '$'))+ facet_wrap(~site) + theme_bw() ## End(Not run)
dat <- structure(list(month1 = c("Jan", "Nov", "Mar", "Jul", "Aug", "Jan", "Aug", "May", "Dec", "Apr"), month2 = c("March", "May", "March", "July", "May", "October", "March", "November", "April", "January"), weekday1 = c("Th", "F", "M", "Su", "Th", "Su", "M", "Th", "W", "T"), weekday2 = c("We", "Th", "Fr", "Sa", "We", "Su", "Tu", "Su", "Su", "Th"), weekday3 = c("Sat", "Wed", "Mon", "Wed", "Wed", "Wed", "Wed", "Sun", "Fri", "Thu"), weekday4 = c("Sunday", "Sunday", "Thursday", "Saturday", "Monday", "Wednesday", "Friday", "Thursday", "Sunday", "Saturday")), .Names = c("month1", "month2", "weekday1", "weekday2", "weekday3", "weekday4")) ## Note that the 'forcats' package imported by the 'tidyverse' package, has an ## `as_factor` function that can compete with numform's version. If in doubt ## prefix with `numform::as_factor` as_factor(dat$month1) as_factor(dat$month2) as_factor(dat$weekday1) as_factor(dat$weekday2) as_factor(dat$weekday3) as_factor(dat$weekday4) ## shift levels as_factor(dat$weekday4, -1) as_factor(dat$weekday4, -2) as_factor(dat$weekday4, 1) as_factor(dat$weekday4, 2) ## Not run: library(tidyverse) data_frame( revenue = rnorm(10000, 500000, 50000), date = sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 10000, TRUE), site = sample(paste("Site", 1:5), 10000, TRUE) ) %>% mutate( dollar = f_comma(f_dollar(revenue, digits = -3)), thous = f_thous(revenue), thous_dollars = f_thous(revenue, prefix = '$'), abb_month = f_month(date), abb_week = numform::as_factor(f_weekday(date, distinct = TRUE)) ) %T>% print() %>% ggplot(aes(abb_week, revenue)) + geom_jitter(width = .2, height = 0, alpha = .2) + scale_y_continuous(label = ff_thous(prefix = '$'))+ facet_wrap(~site) + theme_bw() ## End(Not run)
constant_months
A constant for ordered month names.
constant_months_abbreviation
- A constant for ordered month abbreviations.
constant_weekdays
- A constant for ordered weekdays.
constant_quarters
- A constant for ordered quarters.
constant_months constant_months_abbreviation constant_weekdays constant_weekdays_abbreviation constant_quarters
constant_months constant_months_abbreviation constant_weekdays constant_weekdays_abbreviation constant_quarters
An object of class character
of length 12.
An object of class character
of length 12.
An object of class character
of length 7.
An object of class character
of length 7.
An object of class character
of length 4.
Format times to the typical 12 hour '
f_12_hour(x = Sys.time(), format = "%I:%M %p", pad.char = "", ...) ## Default S3 method: f_12_hour(x, format = "%I:%M %p", pad.char = "", ...) ## S3 method for class 'integer' f_12_hour(x, format = "%I:%M %p", pad.char = "", ...) ## S3 method for class 'numeric' f_12_hour(x, format = "%I:%M %p", pad.char = "", ...) ## S3 method for class 'hms' f_12_hour(x, format = "%I:%M %p", pad.char = "", ...) ff_12_hour(format = "%I:%M %p", pad.char = "", ...)
f_12_hour(x = Sys.time(), format = "%I:%M %p", pad.char = "", ...) ## Default S3 method: f_12_hour(x, format = "%I:%M %p", pad.char = "", ...) ## S3 method for class 'integer' f_12_hour(x, format = "%I:%M %p", pad.char = "", ...) ## S3 method for class 'numeric' f_12_hour(x, format = "%I:%M %p", pad.char = "", ...) ## S3 method for class 'hms' f_12_hour(x, format = "%I:%M %p", pad.char = "", ...) ff_12_hour(format = "%I:%M %p", pad.char = "", ...)
x |
A vector of coercible times. |
format |
A character string specifying the time output format. |
pad.char |
A character to use for leading padding if lengths of output are unequal. |
... |
Other arguments passed to |
Returns a string of publication ready 12 hour time stamps.
f_12_hour(Sys.time()) f_12_hour(Sys.time(), pad.char ='0') f_12_hour(Sys.time(), pad.char =' ') f_12_hour(Sys.time(), '%I:%M:%S %p') f_12_hour(c(NA, 0:24), '%I %p') set.seed(10) times <- as.POSIXct(sample(seq_len(1e4), 12), origin = '1970-01-01') paste(f_12_hour(range(times)), collapse = ' to ') ## Not run: library(tidyverse) set.seed(10) data_frame( time = as.POSIXct(sample(seq_len(1e4), 12), origin = '1970-01-01'), val = sample(1:20, length(time), TRUE) ) %>% mutate(prop = val/sum(val)) %>% ggplot(aes(time, prop)) + geom_line() + scale_x_time(labels = ff_12_hour(format = '%I %p')) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) ## End(Not run)
f_12_hour(Sys.time()) f_12_hour(Sys.time(), pad.char ='0') f_12_hour(Sys.time(), pad.char =' ') f_12_hour(Sys.time(), '%I:%M:%S %p') f_12_hour(c(NA, 0:24), '%I %p') set.seed(10) times <- as.POSIXct(sample(seq_len(1e4), 12), origin = '1970-01-01') paste(f_12_hour(range(times)), collapse = ' to ') ## Not run: library(tidyverse) set.seed(10) data_frame( time = as.POSIXct(sample(seq_len(1e4), 12), origin = '1970-01-01'), val = sample(1:20, length(time), TRUE) ) %>% mutate(prop = val/sum(val)) %>% ggplot(aes(time, prop)) + geom_line() + scale_x_time(labels = ff_12_hour(format = '%I %p')) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) ## End(Not run)
A wrapper for abbreviate
for abbreviating strings.
f_abbreviation(x, length = 5, ...) ff_abbreviation(...)
f_abbreviation(x, length = 5, ...) ff_abbreviation(...)
x |
A vector of text strings. |
length |
The minimum length of the abbreviations. |
... |
Other arguments passed to |
Returns a string vector with strings abbreviated.
f_abbreviation(state.name) f_abbreviation('Cool Variable')
f_abbreviation(state.name) f_abbreviation('Cool Variable')
Coerce logical (TRUE
, FALSE
) or or dummy coded elements (0/1)
to "Yes"/"No" elements. This function is most useful in plot scales.
f_affirm(x, true = "Yes", false = "No", ...) ff_affirm(...)
f_affirm(x, true = "Yes", false = "No", ...) ff_affirm(...)
x |
A vector of logical or dummy integers. This vector will be coerced to logical. |
true |
A value for |
false |
A value for |
... |
ignored. |
Returns a string of either "Yes" or "No" elements.
f_affirm(c(TRUE, TRUE, FALSE)) f_affirm(c(1, 1, 0, 1, 0, 0, NA)) f_affirm(c(1, 0, 2, .3, -3)) f_affirm(rnorm(20) > 0) f_affirm(rnorm(20) > 0, "A", "B") ## Not run: library(ggplot2) library(dplyr) ## Without labels data_frame(dummy = sample(c(TRUE, FALSE), 30, TRUE)) %>% count(dummy) %>% ggplot(aes(dummy, n)) + geom_bar(stat = 'identity') ## With labels data_frame(dummy = sample(c(TRUE, FALSE), 30, TRUE)) %>% count(dummy) %>% ggplot(aes(dummy, n)) + geom_bar(stat = 'identity') + scale_x_discrete(labels = f_affirm) ## End(Not run)
f_affirm(c(TRUE, TRUE, FALSE)) f_affirm(c(1, 1, 0, 1, 0, 0, NA)) f_affirm(c(1, 0, 2, .3, -3)) f_affirm(rnorm(20) > 0) f_affirm(rnorm(20) > 0, "A", "B") ## Not run: library(ggplot2) library(dplyr) ## Without labels data_frame(dummy = sample(c(TRUE, FALSE), 30, TRUE)) %>% count(dummy) %>% ggplot(aes(dummy, n)) + geom_bar(stat = 'identity') ## With labels data_frame(dummy = sample(c(TRUE, FALSE), 30, TRUE)) %>% count(dummy) %>% ggplot(aes(dummy, n)) + geom_bar(stat = 'identity') + scale_x_discrete(labels = f_affirm) ## End(Not run)
Convenience function to add affixes to strings (prefixes & suffixes).
f_affix(x, prefix = "", suffix = "", ...) ff_affix(...) f_prefix(x, prefix = "$", ...) ff_prefix(...) f_suffix(x, suffix = "%", ...) ff_suffix(...)
f_affix(x, prefix = "", suffix = "", ...) ff_affix(...) f_prefix(x, prefix = "$", ...) ff_prefix(...) f_suffix(x, suffix = "%", ...) ff_suffix(...)
x |
A vector of elements to append with an affix. |
prefix |
A string to append to the front of elements. |
suffix |
A string to append to the back of elements. |
... |
ignored. |
Returns a string of affix appended digits.
f_affix(1:5, "-", "%") f_affix(f_num(1:5, 2), "-", "%") f_prefix(LETTERS[1:5], "_") f_prefix(f_bills(123456789123, -2), "$") f_suffix(LETTERS[1:5], "_") f_suffix(f_num(1:5, 2), "%") ## Not run: f_bills(123456789123, -2) %>% f_prefix("$") ## End(Not run)
f_affix(1:5, "-", "%") f_affix(f_num(1:5, 2), "-", "%") f_prefix(LETTERS[1:5], "_") f_prefix(f_bills(123456789123, -2), "$") f_suffix(LETTERS[1:5], "_") f_suffix(f_num(1:5, 2), "%") ## Not run: f_bills(123456789123, -2) %>% f_prefix("$") ## End(Not run)
f_bin
- Convert binned intervals to symbol form (e.g., "1 < x <= 3"
).
f_bin_text
- Convert binned intervals to text form (e.g., "Greater than or equal to 1 to less than 3"
).
f_bin(x, l = "<", le = "<=", parse = FALSE, ...) f_bin_text( x, greater = "Greater than", middle = "to", less = "less than", equal = "or equal to", ... ) f_bin_text_right(x, l = "up to", le = "to", equal.digits = FALSE, ...) f_bin_right(x, l = "<", le = "<=", equal.digits = FALSE, parse = FALSE, ...) ff_bin(l = "<", le = "<=", parse = TRUE, ...) ff_bin_text( greater = "Greater than", middle = "to", less = "less than", equal = "or equal to", ... ) ff_bin_right(l = "<", le = "<=", equal.digits = FALSE, parse = TRUE, ...) ff_bin_text_right(l = "up to", le = "to", equal.digits = FALSE, ...) f_interval(x, l = "<", le = "<=", parse = FALSE, ...) f_interval_text( x, greater = "Greater than", middle = "to", less = "less than", equal = "or equal to", ... ) f_interval_text_right(x, l = "up to", le = "to", equal.digits = FALSE, ...) f_interval_right( x, l = "<", le = "<=", equal.digits = FALSE, parse = FALSE, ... ) ff_interval(l = "<", le = "<=", parse = TRUE, ...) ff_interval_text( greater = "Greater than", middle = "to", less = "less than", equal = "or equal to", ... ) ff_interval_text_right(l = "up to", le = "to", equal.digits = FALSE, ...) ff_interval_right(l = "<", le = "<=", equal.digits = FALSE, parse = TRUE, ...)
f_bin(x, l = "<", le = "<=", parse = FALSE, ...) f_bin_text( x, greater = "Greater than", middle = "to", less = "less than", equal = "or equal to", ... ) f_bin_text_right(x, l = "up to", le = "to", equal.digits = FALSE, ...) f_bin_right(x, l = "<", le = "<=", equal.digits = FALSE, parse = FALSE, ...) ff_bin(l = "<", le = "<=", parse = TRUE, ...) ff_bin_text( greater = "Greater than", middle = "to", less = "less than", equal = "or equal to", ... ) ff_bin_right(l = "<", le = "<=", equal.digits = FALSE, parse = TRUE, ...) ff_bin_text_right(l = "up to", le = "to", equal.digits = FALSE, ...) f_interval(x, l = "<", le = "<=", parse = FALSE, ...) f_interval_text( x, greater = "Greater than", middle = "to", less = "less than", equal = "or equal to", ... ) f_interval_text_right(x, l = "up to", le = "to", equal.digits = FALSE, ...) f_interval_right( x, l = "<", le = "<=", equal.digits = FALSE, parse = FALSE, ... ) ff_interval(l = "<", le = "<=", parse = TRUE, ...) ff_interval_text( greater = "Greater than", middle = "to", less = "less than", equal = "or equal to", ... ) ff_interval_text_right(l = "up to", le = "to", equal.digits = FALSE, ...) ff_interval_right(l = "<", le = "<=", equal.digits = FALSE, parse = TRUE, ...)
x |
A vector of binned numbers from |
l |
Less than symbol. |
le |
Less than or equal to symbol. |
parse |
logical. If |
greater |
String to use for greater. |
middle |
String to use for middle (defaults to |
less |
String to use for less. |
equal |
String to use for equal to. This is combined with the |
equal.digits |
logical. If |
... |
ignored. |
f_bin
- Returns human readable intervals in symbol form.
f_bin
- Returns human readable intervals in word form.
f_bin_text_right
- Returns human readable right hand of intervals in word form.
f_bin_right
- Returns human readable right hand intervals in symbol form.
x <- cut(-1:5, 3, right = FALSE) y <- cut(-4:10, c(-5, 2, 6, 10), right = TRUE) z <- cut(-4:10, c(-4, 2, 6, 11), right = FALSE) f_bin(x) f_interval(x) #`_interval` and `_bin` are interchangeable aliases in the function names f_bin(y) f_bin(z) ## HTML f_bin(z, le = '≤') f_bin_text(x) f_bin_text(y) f_bin_text(z) f_bin_text(x, middle = 'but') f_bin_text(x, greater = 'Above', middle = '', equal = '', less = 'to') f_bin_text(z, greater = 'From', middle = '', equal = '', less = 'up to') f_bin_text_right(x) f_bin_text_right(y) f_bin_text_right(cut(-4:10, c(-3, 2, 6, 11))) f_bin_text_right(x, equal.digits = TRUE) f_bin_right(x) f_bin_right(y) f_bin_right(x, equal.digits = TRUE) ## HTML f_bin_right(y, le = '≤') ## Not run: library(tidyverse) mtcars %>% mutate(mpg2 = cut(mpg, 3)) %>% ggplot(aes(disp, hp)) + geom_point() + facet_wrap(~ mpg2, labeller = ff_bin() ) mtcars %>% mutate(mpg2 = cut(mpg, 3)) %>% ggplot(aes(disp, hp)) + geom_point() + facet_wrap(~ mpg2, labeller = function(x) f_bin_right(x, parse = TRUE) ) mtcars %>% mutate(mpg2 = cut(mpg, 3, right = FALSE)) %>% ggplot(aes(disp, hp)) + geom_point() + facet_wrap(~ mpg2, labeller = function(x) f_bin_right(x, parse = TRUE) ) mtcars %>% mutate(mpg2 = cut(mpg, 5, right = FALSE)) %>% ggplot(aes(mpg2)) + geom_bar() + scale_x_discrete(labels = ff_bin_text_right(l = 'Up to')) + coord_flip() mtcars %>% mutate(mpg2 = cut(mpg, 10, right = FALSE)) %>% ggplot(aes(mpg2)) + geom_bar(fill = '#33A1DE') + scale_x_discrete(labels = function(x) f_wrap(f_bin_text_right(x, l = 'up to'), width = 8)) + scale_y_continuous(breaks = seq(0, 14, by = 2), limits = c(0, 7)) + theme_minimal() + theme( panel.grid.major.x = element_blank(), axis.text.x = element_text(size = 14, margin = margin(t = -12)), axis.text.y = element_text(size = 14), plot.title = element_text(hjust = .5) ) + labs(title = 'Histogram', x = NULL, y = NULL) ## End(Not run)
x <- cut(-1:5, 3, right = FALSE) y <- cut(-4:10, c(-5, 2, 6, 10), right = TRUE) z <- cut(-4:10, c(-4, 2, 6, 11), right = FALSE) f_bin(x) f_interval(x) #`_interval` and `_bin` are interchangeable aliases in the function names f_bin(y) f_bin(z) ## HTML f_bin(z, le = '≤') f_bin_text(x) f_bin_text(y) f_bin_text(z) f_bin_text(x, middle = 'but') f_bin_text(x, greater = 'Above', middle = '', equal = '', less = 'to') f_bin_text(z, greater = 'From', middle = '', equal = '', less = 'up to') f_bin_text_right(x) f_bin_text_right(y) f_bin_text_right(cut(-4:10, c(-3, 2, 6, 11))) f_bin_text_right(x, equal.digits = TRUE) f_bin_right(x) f_bin_right(y) f_bin_right(x, equal.digits = TRUE) ## HTML f_bin_right(y, le = '≤') ## Not run: library(tidyverse) mtcars %>% mutate(mpg2 = cut(mpg, 3)) %>% ggplot(aes(disp, hp)) + geom_point() + facet_wrap(~ mpg2, labeller = ff_bin() ) mtcars %>% mutate(mpg2 = cut(mpg, 3)) %>% ggplot(aes(disp, hp)) + geom_point() + facet_wrap(~ mpg2, labeller = function(x) f_bin_right(x, parse = TRUE) ) mtcars %>% mutate(mpg2 = cut(mpg, 3, right = FALSE)) %>% ggplot(aes(disp, hp)) + geom_point() + facet_wrap(~ mpg2, labeller = function(x) f_bin_right(x, parse = TRUE) ) mtcars %>% mutate(mpg2 = cut(mpg, 5, right = FALSE)) %>% ggplot(aes(mpg2)) + geom_bar() + scale_x_discrete(labels = ff_bin_text_right(l = 'Up to')) + coord_flip() mtcars %>% mutate(mpg2 = cut(mpg, 10, right = FALSE)) %>% ggplot(aes(mpg2)) + geom_bar(fill = '#33A1DE') + scale_x_discrete(labels = function(x) f_wrap(f_bin_text_right(x, l = 'up to'), width = 8)) + scale_y_continuous(breaks = seq(0, 14, by = 2), limits = c(0, 7)) + theme_minimal() + theme( panel.grid.major.x = element_blank(), axis.text.x = element_text(size = 14, margin = margin(t = -12)), axis.text.y = element_text(size = 14), plot.title = element_text(hjust = .5) ) + labs(title = 'Histogram', x = NULL, y = NULL) ## End(Not run)
Add commas to larger integers.
f_comma(x, mark = ",", prefix = "", ...) ff_comma(...)
f_comma(x, mark = ",", prefix = "", ...) ff_comma(...)
x |
A vector of numbers (or string equivalents). |
mark |
The character to include every n places. |
prefix |
A string to append to the front of elements. |
... |
Other arguments passed to |
Returns a comma separated string of publication ready digits.
set.seed(4) f_comma(sample(4:10, 5)^5) f_comma(c(1234.12345, 1234567890, .000034034, 123000000000, -1234567))
set.seed(4) f_comma(sample(4:10, 5)^5) f_comma(c(1234.12345, 1234567890, .000034034, 123000000000, -1234567))
Convert numeric data to shorter form with unit abbreviations attached. For example, move from 10,000,000,000 (Bytes) to 10GB (Gigabytes) instead.
f_byte
- Force the abbreviation to bytes
unit (B).
f_kilo
- Force the abbreviation to kilobytes
unit (KB).
f_mega
- Force the abbreviation to megabytes
unit (MB).
f_giga
- Force the abbreviation to gigabytes
unit (GB).
f_tera
- Force the abbreviation to terabytes
unit (TB).
f_peta
- Force the abbreviation to petabytes
unit (PB).
f_exa
- Force the abbreviation to exabytes
unit (EB).
f_zetta
- Force the abbreviation to zettabytes
unit (ZB).
f_yotta
- Force the abbreviation to yottabytes
unit (YB).
f_data( x, binary = FALSE, digits = 0, pad.char = " ", less.than.replace = FALSE, sep = "", mix.units = FALSE, from = "B", ... ) ff_data(...) f_byte( x, to = "B", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_byte(...) f_kilo( x, to = "KB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_kilo(...) f_mega( x, to = "MB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_mega(...) f_giga( x, to = "GB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_giga(...) f_tera( x, to = "TB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_tera(...) f_peta( x, to = "PB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_peta(...) f_exa( x, to = "EB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_exa(...) f_zetta( x, to = "ZB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_zetta(...) f_yotta( x, to = "YB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_yotta(...)
f_data( x, binary = FALSE, digits = 0, pad.char = " ", less.than.replace = FALSE, sep = "", mix.units = FALSE, from = "B", ... ) ff_data(...) f_byte( x, to = "B", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_byte(...) f_kilo( x, to = "KB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_kilo(...) f_mega( x, to = "MB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_mega(...) f_giga( x, to = "GB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_giga(...) f_tera( x, to = "TB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_tera(...) f_peta( x, to = "PB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_peta(...) f_exa( x, to = "EB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_exa(...) f_zetta( x, to = "ZB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_zetta(...) f_yotta( x, to = "YB", binary = FALSE, digits = 0, suffix = f_data_abbreviation(to), pad.char = " ", less.than.replace = FALSE, from = "B", sep = "", ... ) ff_yotta(...)
x |
A vector of data units. |
binary |
logical. If |
digits |
The number of digits to round to. . |
pad.char |
A character to use for leading padding if lengths of output
are unequal. Use |
less.than.replace |
logical. If |
sep |
The separator to use between the number and data unit abbreviation. |
mix.units |
logical. If |
from |
The starting unit. Typically, this is assumed to be 'Bytes' ('B'). Must be one of c("Bit", "Byte", "Kilobyte", "Megabyte", "Gigabyte", "Terabyte", "Petabyte", "Exabyte", "Zettabyte", "Yottabyte") or c("b", "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"). These are case sensitive. |
to |
The units to convert to. See the |
suffix |
A suffix to use for the units at the end of the numeric string. Typically the user will not interact with this argument. Meant for internal modularity of functions. |
... |
ignored. |
Returns a converted and abbreviated vector of units of data.
## Not run: x <- c(NA, '3', '-', -233456789, -2334567890, 10^(0:10)) f_data(x) f_data(x, pad.char = NA) f_data(x, mix.units = TRUE) f_data(x, mix.units = TRUE, binary = TRUE) f_data(x, mix.units = TRUE, binary = TRUE, digits = 2) f_byte(100000000, from = 'GB', binary = TRUE) f_giga(10000000000) f_giga(10000000000, suffix = 'Gb') library(tidyverse) set.seed(15) dat <- data_frame( bytes = round(rnorm(7, 1e7, 7.95e6), 0), days = constant_weekdays %>% as_factor() ) dat %>% mutate( data = f_data(bytes, less.than.replace = TRUE), weekday = f_weekday(days, distinct = TRUE) %>% as_factor() ) dat %>% mutate(days = days %>% as_factor()) %>% ggplot(aes(days, bytes, group = 1)) + geom_line() + geom_point() + scale_y_continuous(labels = f_data) + scale_x_discrete(labels = ff_weekday(distinct = TRUE)) ## End(Not run)
## Not run: x <- c(NA, '3', '-', -233456789, -2334567890, 10^(0:10)) f_data(x) f_data(x, pad.char = NA) f_data(x, mix.units = TRUE) f_data(x, mix.units = TRUE, binary = TRUE) f_data(x, mix.units = TRUE, binary = TRUE, digits = 2) f_byte(100000000, from = 'GB', binary = TRUE) f_giga(10000000000) f_giga(10000000000, suffix = 'Gb') library(tidyverse) set.seed(15) dat <- data_frame( bytes = round(rnorm(7, 1e7, 7.95e6), 0), days = constant_weekdays %>% as_factor() ) dat %>% mutate( data = f_data(bytes, less.than.replace = TRUE), weekday = f_weekday(days, distinct = TRUE) %>% as_factor() ) dat %>% mutate(days = days %>% as_factor()) %>% ggplot(aes(days, bytes, group = 1)) + geom_line() + geom_point() + scale_y_continuous(labels = f_data) + scale_x_discrete(labels = ff_weekday(distinct = TRUE)) ## End(Not run)
Convert a data label such as Gigabyte to an abbreviated form like 'GB'.
f_data_abbreviation(x, ...)
f_data_abbreviation(x, ...)
x |
A vector of data labels. One of: "Petabyte", "Exabyte", "Zettabyte", "Yottabyte") ignoring case or retaining c("b", "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") with proper case. |
... |
ignored. |
Returns avector of abbreviated data units.
x <- c("Exabyte", "terabyte", "ZB", "PetaByte", "KB", "byte", "Gigabyte", "Bit", "GB", "b") f_data_abbreviation(x)
x <- c("Exabyte", "terabyte", "ZB", "PetaByte", "KB", "byte", "Gigabyte", "Bit", "GB", "b") f_data_abbreviation(x)
Format dates to the typical '
f_date(x = Sys.Date(), format = "%B %d, %Y", ...) ff_date(...)
f_date(x = Sys.Date(), format = "%B %d, %Y", ...) ff_date(...)
x |
A vector of coercible dates. |
format |
A character string specifying the date output format. |
... |
Other arguments passed to |
Returns a string of publication ready dates.
f_date(Sys.Date()) f_date(Sys.time()) f_date(Sys.time(), '%b-%y') set.seed(10) dates <- as.Date(sample(1:10000, 12), origin = '1970-01-01') paste(f_date(range(dates)), collapse = ' to ')
f_date(Sys.Date()) f_date(Sys.time()) f_date(Sys.time(), '%b-%y') set.seed(10) dates <- as.Date(sample(1:10000, 12), origin = '1970-01-01') paste(f_date(range(dates)), collapse = ' to ')
Use the denomination abbreviations K (thousands), M (millions), and
B (billions) with abbreviated numbers.f_denom
- Auto-detect the
maximum denomination and attempt to use it (if max(x) is < 1K then x is
returned).
f_trills
- Force the abbreviation to the trillions
denomination (B).
f_bills
- Force the abbreviation to the billions
denomination (B).
f_mills
- Force the abbreviation to the millions
denomination (B).
f_thous
- Force the abbreviation to the thousands
denomination (B).
f_denom( x, relative = 0, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, mix.denom = FALSE, ... ) ff_denom(...) f_trills( x, relative = 0, digits = -12, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, ... ) ff_trills(...) f_bills( x, relative = 0, digits = -9, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, ... ) ff_bills(...) f_mills( x, relative = 0, digits = -6, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, ... ) ff_mills(...) f_thous( x, relative = 0, digits = -3, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, ... ) ff_thous(...)
f_denom( x, relative = 0, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, mix.denom = FALSE, ... ) ff_denom(...) f_trills( x, relative = 0, digits = -12, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, ... ) ff_trills(...) f_bills( x, relative = 0, digits = -9, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, ... ) ff_bills(...) f_mills( x, relative = 0, digits = -6, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, ... ) ff_mills(...) f_thous( x, relative = 0, digits = -3, prefix = "", pad.char = ifelse(prefix == "", NA, " "), less.than.replace = FALSE, ... ) ff_thous(...)
x |
A vector of large numbers. |
relative |
A factor relative to the current |
prefix |
A string to append to the front of elements. |
pad.char |
A character to use for leading padding if lengths of output
are unequal. Use |
less.than.replace |
logical. If |
mix.denom |
logical. If |
digits |
The number of digits to round to. Actual |
... |
ignored. |
Returns an abbreviated vector of numbers.
f_denom(c(12345, 12563, 191919), prefix = '$') f_denom(c(12345, 12563, 191919), prefix = '$', pad.char = '') f_denom(c(1234365, 122123563, 12913919), prefix = '$') f_denom(c(12343676215, 122126763563, 1291673919), prefix = '$') f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), prefix = '$') f_denom(c(NA, 2, 123436, 122126763, 1291673919), prefix = '$', mix.denom = TRUE) f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), prefix = '$', pad.char = '') f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), relative = 1, prefix = '$') f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), relative = 9, prefix = '$') f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), less.than.replace = TRUE) f_thous(1234) f_thous(12345) f_thous(123456) f_mills(1234567) f_mills(12345678) f_mills(123456789) f_bills(1234567891) f_bills(12345678912) f_bills(123456789123) f_bills(123456789123, -1) # round to tens f_bills(123456789123, -2) # round to hundreds f_bills(123456789123, +1) # round to tenths f_bills(123456789123, +2) # round to hundreths x <- c(3886902.8696, 4044584.0424, 6591893.2104, 591893.2104, -3454678) f_mills(x) f_mills(x, 1) f_mills(x, 1, prefix = '$') f_mills(x, 1, prefix = '$', pad.char = '0') ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse, magrittr) f_bills(123456789123, -2) %>% f_prefix("$") data_frame( revenue = rnorm(100, 500000, 50000), deals = sample(20:50, 100, TRUE) ) %>% mutate( dollar = f_dollar(revenue, digits = -3), thous = f_thous(revenue), thous_dollars = f_thous(revenue, prefix = '$') ) %T>% print() %>% ggplot(aes(deals, revenue)) + geom_point() + geom_smooth() + scale_y_continuous(label = ff_thous(prefix = '$') ) data_frame( revenue = rnorm(10000, 500000, 50000), date = sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 10000, TRUE), site = sample(paste("Site", 1:5), 10000, TRUE) ) %>% mutate( dollar = f_dollar(revenue, digits = -3), thous = f_thous(revenue), thous_dollars = f_thous(revenue, prefix = '$'), abb_month = f_month(date), abb_week = factor(f_weekday(date, distinct = TRUE), levels = c('Su', 'M', 'T', 'W', 'Th', 'F', 'S')) ) %T>% print() %>% ggplot(aes(abb_week, revenue)) + geom_jitter(width = .2, height = 0, alpha = .2) + scale_y_continuous(label = ff_thous(prefix = '$'))+ facet_wrap(~site) set.seed(10) data_frame( w = paste(constant_months, rep(2016:2017, each = 12))[1:20] , x = rnorm(20, 200000, 75000) ) %>% { a <- . rbind( a, a %>% mutate(w = 'Total') %>% group_by(w) %>% summarize(x = sum(x)) ) } %>% mutate( y = f_denom(x, prefix = '$'), z = f_denom(x, mix.denom = TRUE, prefix = '$') ) %>% data.frame(stringsAsFactors = FALSE, check.names = FALSE) %>% pander::pander(split.tables = Inf, justify = alignment(.)) ## Scale with mixed units library(tidyverse) library(numform) dat <- data_frame( Value = c(111, 2345, 34567, 456789, 1000001, 1000000001), Time = 1:6 ) ## Uniform units ggplot(dat, aes(Time, Value)) + geom_line() + scale_y_continuous(labels = ff_denom( prefix = '$')) ## Mixed units ggplot(dat, aes(Time, Value)) + geom_line() + scale_y_continuous(labels = ff_denom(mix.denom = TRUE, prefix = '$', pad.char = '')) ## End(Not run)
f_denom(c(12345, 12563, 191919), prefix = '$') f_denom(c(12345, 12563, 191919), prefix = '$', pad.char = '') f_denom(c(1234365, 122123563, 12913919), prefix = '$') f_denom(c(12343676215, 122126763563, 1291673919), prefix = '$') f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), prefix = '$') f_denom(c(NA, 2, 123436, 122126763, 1291673919), prefix = '$', mix.denom = TRUE) f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), prefix = '$', pad.char = '') f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), relative = 1, prefix = '$') f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), relative = 9, prefix = '$') f_denom(c(NA, 2, 12343676215, 122126763563, 1291673919), less.than.replace = TRUE) f_thous(1234) f_thous(12345) f_thous(123456) f_mills(1234567) f_mills(12345678) f_mills(123456789) f_bills(1234567891) f_bills(12345678912) f_bills(123456789123) f_bills(123456789123, -1) # round to tens f_bills(123456789123, -2) # round to hundreds f_bills(123456789123, +1) # round to tenths f_bills(123456789123, +2) # round to hundreths x <- c(3886902.8696, 4044584.0424, 6591893.2104, 591893.2104, -3454678) f_mills(x) f_mills(x, 1) f_mills(x, 1, prefix = '$') f_mills(x, 1, prefix = '$', pad.char = '0') ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse, magrittr) f_bills(123456789123, -2) %>% f_prefix("$") data_frame( revenue = rnorm(100, 500000, 50000), deals = sample(20:50, 100, TRUE) ) %>% mutate( dollar = f_dollar(revenue, digits = -3), thous = f_thous(revenue), thous_dollars = f_thous(revenue, prefix = '$') ) %T>% print() %>% ggplot(aes(deals, revenue)) + geom_point() + geom_smooth() + scale_y_continuous(label = ff_thous(prefix = '$') ) data_frame( revenue = rnorm(10000, 500000, 50000), date = sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 10000, TRUE), site = sample(paste("Site", 1:5), 10000, TRUE) ) %>% mutate( dollar = f_dollar(revenue, digits = -3), thous = f_thous(revenue), thous_dollars = f_thous(revenue, prefix = '$'), abb_month = f_month(date), abb_week = factor(f_weekday(date, distinct = TRUE), levels = c('Su', 'M', 'T', 'W', 'Th', 'F', 'S')) ) %T>% print() %>% ggplot(aes(abb_week, revenue)) + geom_jitter(width = .2, height = 0, alpha = .2) + scale_y_continuous(label = ff_thous(prefix = '$'))+ facet_wrap(~site) set.seed(10) data_frame( w = paste(constant_months, rep(2016:2017, each = 12))[1:20] , x = rnorm(20, 200000, 75000) ) %>% { a <- . rbind( a, a %>% mutate(w = 'Total') %>% group_by(w) %>% summarize(x = sum(x)) ) } %>% mutate( y = f_denom(x, prefix = '$'), z = f_denom(x, mix.denom = TRUE, prefix = '$') ) %>% data.frame(stringsAsFactors = FALSE, check.names = FALSE) %>% pander::pander(split.tables = Inf, justify = alignment(.)) ## Scale with mixed units library(tidyverse) library(numform) dat <- data_frame( Value = c(111, 2345, 34567, 456789, 1000001, 1000000001), Time = 1:6 ) ## Uniform units ggplot(dat, aes(Time, Value)) + geom_line() + scale_y_continuous(labels = ff_denom( prefix = '$')) ## Mixed units ggplot(dat, aes(Time, Value)) + geom_line() + scale_y_continuous(labels = ff_denom(mix.denom = TRUE, prefix = '$', pad.char = '')) ## End(Not run)
f_dollar
- A wrapper for f_num
that formats
dollar values as labeled dollars.
f_dollar(x, leading_zero = TRUE, digits = 2, p = "$", ...) ff_dollar(...)
f_dollar(x, leading_zero = TRUE, digits = 2, p = "$", ...) ff_dollar(...)
x |
A vector of values. |
leading_zero |
logical. If |
digits |
The number of digits to use. Defaults to 2. Can be set
globally via: |
p |
A string to paste at the beginning of the output from |
... |
Other values passed to |
Returns a string of publication ready digits.
f_dollar(c(30, 33.45, .1)) ## Not run: library(dplyr) f_dollar(c(0.0, 0, .2, -00.02, 1122222, pi)) %>% f_comma() ## End(Not run)
f_dollar(c(30, 33.45, .1)) ## Not run: library(dplyr) f_dollar(c(0.0, 0, .2, -00.02, 1122222, pi)) %>% f_comma() ## End(Not run)
Format numbers into degree format for strings, text, titles, and scales.
f_fahrenheit( x, digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, type = "scale", symbol = "°", ... ) f_celcius( x, digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, type = "scale", symbol = "°", ... ) f_longitude( x, digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, type = "scale", symbol = "°", ... ) f_latitude( x, digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, type = "scale", symbol = "°", ... ) f_degree( x, type = c("scale", "text", "scale", "title", "string"), digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, symbol = "°", measure = c("fahrenheit", "celcius", "C", "F", "longitude", "latitude"), ... ) ff_degree(...) ff_celcius(...) ff_fahrenheit(...) ff_longitude(...) ff_latitude(...)
f_fahrenheit( x, digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, type = "scale", symbol = "°", ... ) f_celcius( x, digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, type = "scale", symbol = "°", ... ) f_longitude( x, digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, type = "scale", symbol = "°", ... ) f_latitude( x, digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, type = "scale", symbol = "°", ... ) f_degree( x, type = c("scale", "text", "scale", "title", "string"), digits = getOption("numformdigits"), prefix = NULL, suffix = TRUE, absolute.value = suffix, symbol = "°", measure = c("fahrenheit", "celcius", "C", "F", "longitude", "latitude"), ... ) ff_degree(...) ff_celcius(...) ff_fahrenheit(...) ff_longitude(...) ff_latitude(...)
x |
A vector of values. |
digits |
The number of digits to use. Defaults to 1. Can be set
globally via: |
prefix |
A prefix to use before the parenthesis + units when
|
suffix |
logical. If
|
absolute.value |
logical. If |
type |
One of
|
symbol |
A symbol to use for degree when |
measure |
One of |
... |
ignored. |
Returns number string(s) with degree symbols.
Note that this function differs a bit from other f_
functions
in that in needs a type
. This is because other f_
functions
return a plain text representation that is generalizable across usages (titles,
tables, axis, geom_text, etc). This function has notation that requires
special parsing by various usages hence requiring the type
argument.
## used for ggplot2 axis.text & legend scale f_celcius(37, type = 'scale') ## used for ggplot2 geom_text f_celcius(37, type = 'text') ## used for ggplot2 titles f_celcius(prefix = "My Title", type = 'title') ## used for table and string formatting f_celcius(37, type = 'string') f_celcius(37, type = 'string', symbol = '\\textdegree') # LaTeX ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse, maps, viridis, mapproj) states <- map_data("state") arrests <- USArrests names(arrests) <- tolower(names(arrests)) arrests$region <- tolower(rownames(USArrests)) choro <- merge(states, arrests, sort = FALSE, by = "region") choro <- choro[order(choro$order), ] ggplot(choro, aes(long, lat)) + geom_polygon(aes(group = group, fill = assault)) + coord_map("albers", at0 = 45.5, lat1 = 29.5) + scale_y_continuous(labels = f_latitude) + scale_x_continuous(labels = f_longitude) ggplot(choro, aes(long, lat)) + geom_polygon(aes(group = group, fill = assault)) + coord_map("albers", at0 = 45.5, lat1 = 29.5) + scale_y_continuous(labels = ff_latitude(suffix = FALSE)) + scale_x_continuous(labels = ff_longitude(suffix = FALSE)) world <- map_data(map="world") ggplot(world, aes(map_id = region, x = long, y = lat)) + geom_map(map = world, aes(map_id = region), fill = "grey40", colour = "grey70", size = 0.25) + scale_y_continuous(labels = f_latitude) + scale_x_continuous(labels = f_longitude) data_frame( Event = c('freezing water', 'room temp', 'body temp', 'steak\'s done', 'hamburger\'s done', 'boiling water'), F = c(32, 70, 98.6, 145, 160, 212) ) %>% mutate( C = (F - 32) * (5/9), Event = f_title(Event), Event = factor(Event, levels = unique(Event)) ) %>% ggplot(aes(Event, F, fill = F)) + geom_col() + geom_text(aes(y = F + 4, label = f_fahrenheit(F, digits = 1, type = 'text')), parse = TRUE, color = 'grey60') + scale_y_continuous( labels = f_fahrenheit, limits = c(0, 220), expand = c(0, 0), sec.axis = sec_axis(trans = ~(. - 32) * (5/9), labels = f_celcius, name = f_celcius(prefix = 'Temperature ', type = 'title')) ) + scale_x_discrete(labels = ff_replace(pattern = ' ', replacement = '\n')) + scale_fill_viridis(option = "magma", labels = f_fahrenheit, name = NULL) + theme_bw() + labs( y = f_fahrenheit(prefix = 'Temperature ', type = 'title'), title = f_fahrenheit(prefix = 'Temperature of Common Events ', type = 'title') ) + theme( axis.ticks.x = element_blank(), panel.border = element_rect(fill = NA, color = 'grey80'), panel.grid.minor.x = element_blank(), panel.grid.major.x = element_blank() ) data_frame( Event = c('freezing water', 'room temp', 'body temp', 'steak\'s done', 'hamburger\'s done', 'boiling water', 'sun surface', 'lighting'), F = c(32, 70, 98.6, 145, 160, 212, 9941, 50000) ) %>% mutate( Event = f_title(Event), C = (F - 32) * (5/9) ) %>% mutate( F = f_degree(F, measure = 'F', type = 'string'), C = f_degree(C, measure = 'C', type = 'string', zero = '0.0') ) %>% data.frame(stringsAsFactors = FALSE, check.names = FALSE) %>% pander::pander(split.tables = Inf, justify = alignment(.)) ## End(Not run)
## used for ggplot2 axis.text & legend scale f_celcius(37, type = 'scale') ## used for ggplot2 geom_text f_celcius(37, type = 'text') ## used for ggplot2 titles f_celcius(prefix = "My Title", type = 'title') ## used for table and string formatting f_celcius(37, type = 'string') f_celcius(37, type = 'string', symbol = '\\textdegree') # LaTeX ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse, maps, viridis, mapproj) states <- map_data("state") arrests <- USArrests names(arrests) <- tolower(names(arrests)) arrests$region <- tolower(rownames(USArrests)) choro <- merge(states, arrests, sort = FALSE, by = "region") choro <- choro[order(choro$order), ] ggplot(choro, aes(long, lat)) + geom_polygon(aes(group = group, fill = assault)) + coord_map("albers", at0 = 45.5, lat1 = 29.5) + scale_y_continuous(labels = f_latitude) + scale_x_continuous(labels = f_longitude) ggplot(choro, aes(long, lat)) + geom_polygon(aes(group = group, fill = assault)) + coord_map("albers", at0 = 45.5, lat1 = 29.5) + scale_y_continuous(labels = ff_latitude(suffix = FALSE)) + scale_x_continuous(labels = ff_longitude(suffix = FALSE)) world <- map_data(map="world") ggplot(world, aes(map_id = region, x = long, y = lat)) + geom_map(map = world, aes(map_id = region), fill = "grey40", colour = "grey70", size = 0.25) + scale_y_continuous(labels = f_latitude) + scale_x_continuous(labels = f_longitude) data_frame( Event = c('freezing water', 'room temp', 'body temp', 'steak\'s done', 'hamburger\'s done', 'boiling water'), F = c(32, 70, 98.6, 145, 160, 212) ) %>% mutate( C = (F - 32) * (5/9), Event = f_title(Event), Event = factor(Event, levels = unique(Event)) ) %>% ggplot(aes(Event, F, fill = F)) + geom_col() + geom_text(aes(y = F + 4, label = f_fahrenheit(F, digits = 1, type = 'text')), parse = TRUE, color = 'grey60') + scale_y_continuous( labels = f_fahrenheit, limits = c(0, 220), expand = c(0, 0), sec.axis = sec_axis(trans = ~(. - 32) * (5/9), labels = f_celcius, name = f_celcius(prefix = 'Temperature ', type = 'title')) ) + scale_x_discrete(labels = ff_replace(pattern = ' ', replacement = '\n')) + scale_fill_viridis(option = "magma", labels = f_fahrenheit, name = NULL) + theme_bw() + labs( y = f_fahrenheit(prefix = 'Temperature ', type = 'title'), title = f_fahrenheit(prefix = 'Temperature of Common Events ', type = 'title') ) + theme( axis.ticks.x = element_blank(), panel.border = element_rect(fill = NA, color = 'grey80'), panel.grid.minor.x = element_blank(), panel.grid.major.x = element_blank() ) data_frame( Event = c('freezing water', 'room temp', 'body temp', 'steak\'s done', 'hamburger\'s done', 'boiling water', 'sun surface', 'lighting'), F = c(32, 70, 98.6, 145, 160, 212, 9941, 50000) ) %>% mutate( Event = f_title(Event), C = (F - 32) * (5/9) ) %>% mutate( F = f_degree(F, measure = 'F', type = 'string'), C = f_degree(C, measure = 'C', type = 'string', zero = '0.0') ) %>% data.frame(stringsAsFactors = FALSE, check.names = FALSE) %>% pander::pander(split.tables = Inf, justify = alignment(.)) ## End(Not run)
f_list
- Format a vector of elements as a list series
(e.g., c('A', 'B', 'C')
becomes "A, B, and C"
).
f_list_amp
- A ampersand wrapper for f_list
with
and = '&'
set by default.
f_list(x, and = "and", oxford = TRUE, ...) f_list_amp(x, and = "&", oxford = TRUE, ...) ff_list(...)
f_list(x, and = "and", oxford = TRUE, ...) f_list_amp(x, and = "&", oxford = TRUE, ...) ff_list(...)
x |
A vector of values to turn into a collapsed series. |
and |
The value to use for the 'and'. Commonly |
oxford |
logical. If |
... |
ignored. |
Returns a string that is a list series.
f_list(1) f_list(1:2) f_list(1:3) f_list(1:5) x <- c("parents", "Lady Gaga", "Humpty Dumpty") ## Three things you love sprintf('I love my %s.', f_list(x)) ## Your parents are lady Gaga & Humpty Dumpty????? sprintf('I love my %s.', f_list(x, oxford = FALSE)) sprintf('I love my %s.', f_list(x, and = '&')) sprintf('I love my %s.', f_list_amp(x))
f_list(1) f_list(1:2) f_list(1:3) f_list(1:5) x <- c("parents", "Lady Gaga", "Humpty Dumpty") ## Three things you love sprintf('I love my %s.', f_list(x)) ## Your parents are lady Gaga & Humpty Dumpty????? sprintf('I love my %s.', f_list(x, oxford = FALSE)) sprintf('I love my %s.', f_list(x, and = '&')) sprintf('I love my %s.', f_list_amp(x))
Coerce logical (TRUE
, FALSE
) or or dummy coded elements (0/1)
to "True"/"False" elements. This function is most useful in plot scales.
f_logical(x, true = "True", false = "False", ...) ff_logical(...) f_response(x, yes = "Yes", no = "No", ...) ff_response(...)
f_logical(x, true = "True", false = "False", ...) ff_logical(...) f_response(x, yes = "Yes", no = "No", ...) ff_response(...)
x |
A vector of logical or dummy integers. This vector will be coerced to logical. |
true |
A value for |
false |
A value for |
yes |
A value for |
no |
A value for |
... |
ignored. |
Returns a string of either "True"/"False" elements.
f_logical(c(TRUE, TRUE, FALSE)) f_logical(c(1, 1, 0, 1, 0, 0, NA)) f_logical(c(1, 0, 2, .3, -3)) f_logical(rnorm(20) > 0) f_logical(rnorm(20) > 0, "A", "B") ## Not run: library(ggplot2) library(dplyr) ## Without labels data_frame(dummy = sample(c(TRUE, FALSE), 30, TRUE)) %>% count(dummy) %>% ggplot(aes(dummy, n)) + geom_bar(stat = 'identity') ## With labels data_frame(dummy = sample(c(TRUE, FALSE), 30, TRUE)) %>% count(dummy) %>% ggplot(aes(dummy, n)) + geom_bar(stat = 'identity') + scale_x_discrete(labels = f_logical) ## End(Not run)
f_logical(c(TRUE, TRUE, FALSE)) f_logical(c(1, 1, 0, 1, 0, 0, NA)) f_logical(c(1, 0, 2, .3, -3)) f_logical(rnorm(20) > 0) f_logical(rnorm(20) > 0, "A", "B") ## Not run: library(ggplot2) library(dplyr) ## Without labels data_frame(dummy = sample(c(TRUE, FALSE), 30, TRUE)) %>% count(dummy) %>% ggplot(aes(dummy, n)) + geom_bar(stat = 'identity') ## With labels data_frame(dummy = sample(c(TRUE, FALSE), 30, TRUE)) %>% count(dummy) %>% ggplot(aes(dummy, n)) + geom_bar(stat = 'identity') + scale_x_discrete(labels = f_logical) ## End(Not run)
Format long month name, integer, or date formats to a single capital letter. Useful for plot scales as a way to save space.
f_month(x, ...) ## Default S3 method: f_month(x, ...) ## S3 method for class 'numeric' f_month(x, ...) ## S3 method for class 'Date' f_month(x, ...) ## S3 method for class 'POSIXt' f_month(x, ...) ## S3 method for class 'hms' f_month(x, ...) ff_month(...) f_month_name(x, ...) ## Default S3 method: f_month_name(x, ...) ## S3 method for class 'numeric' f_month_name(x, ...) ## S3 method for class 'Date' f_month_name(x, ...) ## S3 method for class 'POSIXt' f_month_name(x, ...) ## S3 method for class 'hms' f_month_name(x, ...) ff_month_name(...) f_month_abbreviation(x, ...) ## Default S3 method: f_month_abbreviation(x, ...) ## S3 method for class 'numeric' f_month_abbreviation(x, ...) ## S3 method for class 'Date' f_month_abbreviation(x, ...) ## S3 method for class 'POSIXt' f_month_abbreviation(x, ...) ## S3 method for class 'hms' f_month_abbreviation(x, ...) ff_month_abbreviation(...)
f_month(x, ...) ## Default S3 method: f_month(x, ...) ## S3 method for class 'numeric' f_month(x, ...) ## S3 method for class 'Date' f_month(x, ...) ## S3 method for class 'POSIXt' f_month(x, ...) ## S3 method for class 'hms' f_month(x, ...) ff_month(...) f_month_name(x, ...) ## Default S3 method: f_month_name(x, ...) ## S3 method for class 'numeric' f_month_name(x, ...) ## S3 method for class 'Date' f_month_name(x, ...) ## S3 method for class 'POSIXt' f_month_name(x, ...) ## S3 method for class 'hms' f_month_name(x, ...) ff_month_name(...) f_month_abbreviation(x, ...) ## Default S3 method: f_month_abbreviation(x, ...) ## S3 method for class 'numeric' f_month_abbreviation(x, ...) ## S3 method for class 'Date' f_month_abbreviation(x, ...) ## S3 method for class 'POSIXt' f_month_abbreviation(x, ...) ## S3 method for class 'hms' f_month_abbreviation(x, ...) ff_month_abbreviation(...)
x |
A vector of month names, integers 1-12, or dates. |
... |
ignored. |
Returns a single letter month abbreviation atomic vector.
f_month(month.name) f_month(1:12) dates <- seq(as.Date("2000/1/1"), by = "month", length.out = 12) f_month(dates) ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse) set.seed(11) data_frame( date = sample(seq(as.Date("1990/1/1"), by = "day", length.out = 2e4), 12) ) %>% mutate( year_4 = f_year(date, 2), year_2 = f_year(date, 4), quarter = f_quarter(date), month_name = f_month_name(date) %>% as_factor(), month_abbreviation = f_month_abbreviation(date) %>% as_factor(), month_short = f_month(date), weekday_name = f_weekday_name(date), weekday_abbreviation = f_weekday_abbreviation(date), weekday_short = f_weekday(date), weekday_short_distinct = f_weekday(date, distinct = TRUE) ) set.seed(10) dat <- data_frame( month = sample(month.name, 1000, TRUE), area = sample(LETTERS[1:5], 1000, TRUE) ) %>% count(month, area) %>% ungroup() %>% mutate(month = factor(month, levels = constant_months)) ## without date formatting ggplot(dat, aes(month, n)) + geom_bar(stat = 'identity') + facet_wrap(~ area) ## with date formatting ggplot(dat, aes(month, n)) + geom_bar(stat = 'identity') + facet_wrap(~ area) + scale_x_discrete(labels = f_month) ## End(Not run)
f_month(month.name) f_month(1:12) dates <- seq(as.Date("2000/1/1"), by = "month", length.out = 12) f_month(dates) ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse) set.seed(11) data_frame( date = sample(seq(as.Date("1990/1/1"), by = "day", length.out = 2e4), 12) ) %>% mutate( year_4 = f_year(date, 2), year_2 = f_year(date, 4), quarter = f_quarter(date), month_name = f_month_name(date) %>% as_factor(), month_abbreviation = f_month_abbreviation(date) %>% as_factor(), month_short = f_month(date), weekday_name = f_weekday_name(date), weekday_abbreviation = f_weekday_abbreviation(date), weekday_short = f_weekday(date), weekday_short_distinct = f_weekday(date, distinct = TRUE) ) set.seed(10) dat <- data_frame( month = sample(month.name, 1000, TRUE), area = sample(LETTERS[1:5], 1000, TRUE) ) %>% count(month, area) %>% ungroup() %>% mutate(month = factor(month, levels = constant_months)) ## without date formatting ggplot(dat, aes(month, n)) + geom_bar(stat = 'identity') + facet_wrap(~ area) ## with date formatting ggplot(dat, aes(month, n)) + geom_bar(stat = 'identity') + facet_wrap(~ area) + scale_x_discrete(labels = f_month) ## End(Not run)
Remove leading zeros and standardize number of digits. A workhorse for the numform package.
f_num( x, digits = getOption("numformdigits"), p, s, pad.char = NA, zero = NULL, retain.leading.zero = FALSE, ... ) ff_num(...)
f_num( x, digits = getOption("numformdigits"), p, s, pad.char = NA, zero = NULL, retain.leading.zero = FALSE, ... ) ff_num(...)
x |
A vector of numbers (or string equivalents). |
digits |
The number of digits to use. Defaults to 1. Can be set
globally via: |
p |
A string to paste at the beginning of the output from |
s |
A string to paste at the end of the output from |
pad.char |
A character to use for leading padding if lengths of output are unequal. |
zero |
A value to insert in for zero values. |
retain.leading.zero |
logical. If |
... |
ignored. |
Returns a string of publication ready digits.
f_num(c(0.0, 0, .2, -00.02, 1.122222, pi)) f_num(rnorm(10)) f_num(rnorm(20, 100, 200), 0) f_num(c("-0.23", "0", ".23")) ## Percents f_num(c(30, 33.45, .1), 3, s="%") ## Money f_num(c(30, 33.45, .1), 2, p="$") ## Units f_num(c(30, 33.45, .1), 2, s=" in.<sup>2</sup>") f_num(c(30, 33.45, .1), 2, p="Χ<sup>2</sup>=") ## Not run: library(dplyr) is.int <- function(x) !all(x %% 1 == 0) mtcars %>% mutate_if(.funs = f_num, is.int) df <- data.frame(x = -10:10, y = (-10:10)/10) ggplot(df, aes(x, y))+ geom_point() + scale_y_continuous(labels = ff_num(zero = 0)) ## End(Not run)
f_num(c(0.0, 0, .2, -00.02, 1.122222, pi)) f_num(rnorm(10)) f_num(rnorm(20, 100, 200), 0) f_num(c("-0.23", "0", ".23")) ## Percents f_num(c(30, 33.45, .1), 3, s="%") ## Money f_num(c(30, 33.45, .1), 2, p="$") ## Units f_num(c(30, 33.45, .1), 2, s=" in.<sup>2</sup>") f_num(c(30, 33.45, .1), 2, p="Χ<sup>2</sup>=") ## Not run: library(dplyr) is.int <- function(x) !all(x %% 1 == 0) mtcars %>% mutate_if(.funs = f_num, is.int) df <- data.frame(x = -10:10, y = (-10:10)/10) ggplot(df, aes(x, y))+ geom_point() + scale_y_continuous(labels = ff_num(zero = 0)) ## End(Not run)
Add ordinal suffixes (-st, -nd, -rd, -th) to numbers.
f_ordinal(x, ...) ff_ordinal(...)
f_ordinal(x, ...) ff_ordinal(...)
x |
A vector of numbers (or string equivalents). |
... |
ignored. |
Returns a string vector with ordinal suffixes.
f_ordinal(1:25)
f_ordinal(1:25)
f_pad_zero
- Add leading zeros to numbers.
f_pad_left
- Add leading character to strings.
f_pad_right
- Add trailing character to strings.
f_pad_zero(x, width = NULL, pad.char = "0", ...) f_pad_left(x, pad.char = " ", width = NULL, ...) f_pad_right(x, pad.char = " ", width = NULL, ...) ff_pad_zero(...) ff_pad_left(...) ff_pad_right(...)
f_pad_zero(x, width = NULL, pad.char = "0", ...) f_pad_left(x, pad.char = " ", width = NULL, ...) f_pad_right(x, pad.char = " ", width = NULL, ...) ff_pad_zero(...) ff_pad_left(...) ff_pad_right(...)
x |
A vector of numbers (or string equivalents). |
width |
The width to make the stings. Defaults to the maximum number of
characters for all elements in |
pad.char |
A character to pad the string with. |
... |
ignored. |
Returns a padded string.
f_pad_zero(c(NA, 1, 12)) f_pad_zero(c(NA, 1, 100, 10, 1000)) f_pad_zero(as.character(c(NA, 1, 100, 10, 1000))) f_pad_zero(c(NA, 1, 100, 10, 1000, "B", "BB")) f_pad_left(c(NA, 1, 100, 10, 1000, "B", "BB"), '-') f_pad_right(c(NA, 1, 100, 10, 1000, "B", "BB"), '-') f_pad_left(c(NA, 1, 12))
f_pad_zero(c(NA, 1, 12)) f_pad_zero(c(NA, 1, 100, 10, 1000)) f_pad_zero(as.character(c(NA, 1, 100, 10, 1000))) f_pad_zero(c(NA, 1, 100, 10, 1000, "B", "BB")) f_pad_left(c(NA, 1, 100, 10, 1000, "B", "BB"), '-') f_pad_right(c(NA, 1, 100, 10, 1000, "B", "BB"), '-') f_pad_left(c(NA, 1, 12))
f_parenthesis
- Form two vectors of numbers as a leading number
followed by a second number in parenthesis.
f_mean_sd
- Wrapper for f_parenthesis
optimized for formatting
vectors of means and standard deviations.
f_num_percent
- Wrapper for f_parenthesis
optimized for formatting
vectors of numbers and percentages deviations.
f_parenthesis(x, y, sep = "", x_prefix = "", y_prefix = "", ...) ff_parenthesis(...) f_mean_sd(x, y, x_digits = 1, y_digits = x_digits, sep = "", ...) ff_mean_sd(...) f_num_percent( x, y, x_digits = 1, y_digits = x_digits, sep = "", prop_fun = numform::f_prop2percent, ... ) ff_num_percent(...)
f_parenthesis(x, y, sep = "", x_prefix = "", y_prefix = "", ...) ff_parenthesis(...) f_mean_sd(x, y, x_digits = 1, y_digits = x_digits, sep = "", ...) ff_mean_sd(...) f_num_percent( x, y, x_digits = 1, y_digits = x_digits, sep = "", prop_fun = numform::f_prop2percent, ... ) ff_num_percent(...)
x |
Vector 1 (in |
y |
Vector 2 (in |
sep |
The separator between the first number and the leading parenthesis. |
x_prefix |
A constant to place before each value in the x vector. |
y_prefix |
A constant to place before each value in the y vector inside of the parenthesis. |
x_digits |
The number of digits to round the x vector. |
y_digits |
The number of digits to round the y vector. |
prop_fun |
The proportion function to convert the y y vector in
|
... |
ignored. |
Returns a vector of parenthesis combined strings using vector x and y.
f_parenthesis( f_num(sample(50:100, 5), 1), f_num(rnorm(5, 5:15, 5), 1), prefix = 'mean = ', parenthesis_prefix = 'sd = ', sep = " " ) f_mean_sd(rnorm(5, 100, 20), rnorm(5, 20, 5)) f_num_percent(rnorm(5, 100, 20), rnorm(5, .5, .1)) f_parenthesis( sample(50:100, 5), f_prop2percent(rnorm(5, .5, .1), 0) ) ## Not run: library(tidyverse) mtcars %>% group_by(cyl) %>% summarize( mean = mean(hp), sd = sd(hp), n = n() ) %>% mutate( prop = n /sum(n), mean_sd = f_mean_sd(mean, sd), n_perc = f_num_percent(n, prop, 0) ) ## End(Not run)
f_parenthesis( f_num(sample(50:100, 5), 1), f_num(rnorm(5, 5:15, 5), 1), prefix = 'mean = ', parenthesis_prefix = 'sd = ', sep = " " ) f_mean_sd(rnorm(5, 100, 20), rnorm(5, 20, 5)) f_num_percent(rnorm(5, 100, 20), rnorm(5, .5, .1)) f_parenthesis( sample(50:100, 5), f_prop2percent(rnorm(5, .5, .1), 0) ) ## Not run: library(tidyverse) mtcars %>% group_by(cyl) %>% summarize( mean = mean(hp), sd = sd(hp), n = n() ) %>% mutate( prop = n /sum(n), mean_sd = f_mean_sd(mean, sd), n_perc = f_num_percent(n, prop, 0) ) ## End(Not run)
f_percent
- A wrapper for f_num
that formats
percent values as labeled percentages.
f_prop2percent
- A wrapper for f_num
that formats
proportions as labeled percentages.
f_pp
- A wrapper for f_prop2percent
that requires
less typing and has digits
set to 0
by default.
f_percent( x, digits = getOption("numformdigits"), less.than.replace = FALSE, s = "%", ... ) ff_percent(...) f_prop2percent( x, digits = getOption("numformdigits"), less.than.replace = FALSE, s = "%", ... ) ff_prop2percent(...) f_pp(x, digits = 0, less.than.replace = FALSE, s = "%", ...) ff_pp(...)
f_percent( x, digits = getOption("numformdigits"), less.than.replace = FALSE, s = "%", ... ) ff_percent(...) f_prop2percent( x, digits = getOption("numformdigits"), less.than.replace = FALSE, s = "%", ... ) ff_prop2percent(...) f_pp(x, digits = 0, less.than.replace = FALSE, s = "%", ...) ff_pp(...)
x |
A vector of proportions. |
digits |
The number of digits to use. Defaults to 1. Can be set
globally via: |
less.than.replace |
logical. If |
s |
A string to paste at the end of the output from |
... |
Other values passed to |
Returns a string of publication ready digits.
f_percent(c(30, 33.45, .1)) f_percent(c(30, 33.45, .1), 1) f_percent(c(0.0, 0, .2, -00.02, 1.122222, pi)) f_prop2percent(c(.30, 1, 1.01, .33, .222, .01)) f_pp(c(.30, 1, 1.01, .33, .222, .01)) f_percent(c(30, 33.45, .1), digits = 0, less.than.replace = TRUE) ## Escaped for LaTeX: f_percent(c(30, 33.45, .1), digits = 0, less.than.replace = TRUE, s = '\\%') f_prop2percent(c(.30, 1, 1.01, .33, .222, .01, .0001, NA), digits = 0, less.than.replace = TRUE) ## Not run: library(tidyverse) mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate(prop = n/sum(n)) %>% ggplot(aes(gear, prop)) + geom_bar(stat = 'identity') + facet_wrap(~cyl, ncol = 1) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) ## End(Not run)
f_percent(c(30, 33.45, .1)) f_percent(c(30, 33.45, .1), 1) f_percent(c(0.0, 0, .2, -00.02, 1.122222, pi)) f_prop2percent(c(.30, 1, 1.01, .33, .222, .01)) f_pp(c(.30, 1, 1.01, .33, .222, .01)) f_percent(c(30, 33.45, .1), digits = 0, less.than.replace = TRUE) ## Escaped for LaTeX: f_percent(c(30, 33.45, .1), digits = 0, less.than.replace = TRUE, s = '\\%') f_prop2percent(c(.30, 1, 1.01, .33, .222, .01, .0001, NA), digits = 0, less.than.replace = TRUE) ## Not run: library(tidyverse) mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate(prop = n/sum(n)) %>% ggplot(aes(gear, prop)) + geom_bar(stat = 'identity') + facet_wrap(~cyl, ncol = 1) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) ## End(Not run)
Format p-values for reporting using a < or = sign if greater than alpha level.
f_pval( x, alpha = getOption("numformalpha"), digits = getOption("numformdigits"), ... ) ff_pval(...)
f_pval( x, alpha = getOption("numformalpha"), digits = getOption("numformdigits"), ... ) ff_pval(...)
x |
A p-value. |
alpha |
The alpha cut off to use. Defaults to .05. Can be set
globally via: |
digits |
The number of digits to use. Defaults to 3. Can be set
globally via: |
... |
Other values passed to |
Returns a string of publication ready p-values.
f_pval(.05) f_pval(.04999999999999999) f_pval(.0002) f_pval(.0002, .001) mod1 <- t.test(1:10, y = c(7:20)) f_pval(mod1$p.value) mod2 <- t.test(1:10, y = c(7:20, 200)) f_pval(mod2$p.value)
f_pval(.05) f_pval(.04999999999999999) f_pval(.0002) f_pval(.0002, .001) mod1 <- t.test(1:10, y = c(7:20)) f_pval(mod1$p.value) mod2 <- t.test(1:10, y = c(7:20, 200)) f_pval(mod2$p.value)
Format long/abbreviation month name, integer, or date formats to a quarter format (i.e., Q1, Q2, Q3, Q4).
f_quarter(x, prefix = "Q", space = "", max = 12, ...) ## Default S3 method: f_quarter(x, prefix = "Q", space = "", max = 12, ...) ## S3 method for class 'numeric' f_quarter( x, prefix = "Q", space = "", max = ifelse(all(x %in% c(1:4, NA)), 4, 12), ... ) ## S3 method for class 'Date' f_quarter(x, prefix = "Q", space = "", max = 12, ...) ## S3 method for class 'POSIXt' f_quarter(x, prefix = "Q", space = "", max = 12, ...) ## S3 method for class 'hms' f_quarter(x, prefix = "Q", space = "", max = 12, ...) ff_quarter(prefix = "Q", space = "", max = 12, ...)
f_quarter(x, prefix = "Q", space = "", max = 12, ...) ## Default S3 method: f_quarter(x, prefix = "Q", space = "", max = 12, ...) ## S3 method for class 'numeric' f_quarter( x, prefix = "Q", space = "", max = ifelse(all(x %in% c(1:4, NA)), 4, 12), ... ) ## S3 method for class 'Date' f_quarter(x, prefix = "Q", space = "", max = 12, ...) ## S3 method for class 'POSIXt' f_quarter(x, prefix = "Q", space = "", max = 12, ...) ## S3 method for class 'hms' f_quarter(x, prefix = "Q", space = "", max = 12, ...) ff_quarter(prefix = "Q", space = "", max = 12, ...)
x |
A vector of month names, integers 1-12, or dates. |
prefix |
A quarter prefix (defaults to |
space |
A string to place between 'Q' and quarter number. |
max |
A maximum in the |
... |
ignored. |
Returns a quarter formatted atomic vector.
f_quarter(month.name) f_quarter(1:12) dates <- seq(as.Date("2000/1/1"), by = "month", length.out = 12) f_quarter(dates) ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse) set.seed(10) dat <- data_frame( month = sample(month.name, 1000, TRUE), area = sample(LETTERS[1:5], 1000, TRUE) ) %>% mutate(quarter = factor(f_quarter(month), levels = constant_quarters)) %>% count(quarter, area) ggplot(dat, aes(quarter, n)) + geom_bar(stat = 'identity') + facet_wrap(~ area) ## End(Not run)
f_quarter(month.name) f_quarter(1:12) dates <- seq(as.Date("2000/1/1"), by = "month", length.out = 12) f_quarter(dates) ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse) set.seed(10) dat <- data_frame( month = sample(month.name, 1000, TRUE), area = sample(LETTERS[1:5], 1000, TRUE) ) %>% mutate(quarter = factor(f_quarter(month), levels = constant_quarters)) %>% count(quarter, area) ggplot(dat, aes(quarter, n)) + geom_bar(stat = 'identity') + facet_wrap(~ area) ## End(Not run)
A wrapper for gsub
for replacing substrings that is
useful for ggplot2 scales. Useful for taking field names like
'Cool_Variable' and turning it into 'Cool Variable'.
f_replace(x, pattern = "_", replacement = " ", ...) ff_replace(...)
f_replace(x, pattern = "_", replacement = " ", ...) ff_replace(...)
x |
A vector of text strings. |
pattern |
A character string defining search patterns. |
replacement |
A character string defining replacement patterns. |
... |
Other arguments passed to |
Returns a string vector with characters replaced.
f_replace('Cool_Variable') f_title(f_replace('cool_variable')) f_replace('Cool_Variable', pattern = '([A-Z])', replacement = '\\L\\1') cat(f_replace('really long label names are the pits', pattern = '\\s', replace = '\n'))
f_replace('Cool_Variable') f_title(f_replace('cool_variable')) f_replace('Cool_Variable', pattern = '([A-Z])', replacement = '\\L\\1') cat(f_replace('really long label names are the pits', pattern = '\\s', replace = '\n'))
f_sign
- Formats numeric values to just their sign
('-' == < 0, '+' == > 0, or ” == 0).
f_sign(x, positive = "+", negative = "-", zero = "", ...) ff_sign(...)
f_sign(x, positive = "+", negative = "-", zero = "", ...) ff_sign(...)
x |
A vector of values. |
positive |
A string/value to insert in for positive values. |
negative |
A string/value to insert in for negative values. |
zero |
A string/value to insert in for zero values. |
... |
ignored. |
Returns a string of signs.
f_sign(c(-10, 0, 10)) f_sign(c(-10, 0, 10), zero = 0) ## web based f_sign(c(-10, 0, 10), '<b>+</b>', '<b>–</b>')
f_sign(c(-10, 0, 10)) f_sign(c(-10, 0, 10), zero = 0) ## web based f_sign(c(-10, 0, 10), '<b>+</b>', '<b>–</b>')
Formats a state name as the abbreviated form.
f_state(x, ...) ff_state(...)
f_state(x, ...) ff_state(...)
x |
A vector of states. |
... |
ignored. |
Returns a string of abbreviated states.
f_state(c('Texas', 'New York', NA, 'New Jersey', 'Washington', 'Europe'))
f_state(c('Texas', 'New York', NA, 'New Jersey', 'Washington', 'Europe'))
Use a text symbol to create scaled horizontal bar plots of numeric vectors.
Note that you will have to coerce the table to a data.frame
in order
for the output to look pretty.
f_text_bar(x, symbol = "_", width = 9, ...) ff_text_bar(...)
f_text_bar(x, symbol = "_", width = 9, ...) ff_text_bar(...)
x |
A numeric vector. |
symbol |
A sumbol to use for the bars. |
width |
The max width of the bar. |
... |
ignored. |
Returns a vector of concatenated symbols as a string that represent x
## Not run: library(dplyr) mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate( p = numform::f_pp(n/sum(n)) ) %>% ungroup() %>% mutate( cyl = numform::fv_runs(cyl), ` ` = f_text_bar(n) ## Overall ) %>% as.data.frame() mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate( p = numform::f_pp(n/sum(n)), ` ` = f_text_bar(n) ## within groups ) %>% ungroup() %>% mutate( cyl = numform::fv_runs(cyl), ` ` = f_text_bar(n) ) %>% as.data.frame() mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate( p = numform::f_pp(n/sum(n)), `within` = f_text_bar(n, width = 3, symbol = '#') ) %>% ungroup() %>% mutate( cyl = numform::fv_runs(cyl), `overall` = f_text_bar(n, width = 30, symbol = '*') ) %>% as.data.frame() %>% pander::pander(split.tables = Inf, justify = alignment(.), style = 'simple') ## Drop the headers mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate( p = numform::f_pp(n/sum(n)), ` ` = f_text_bar(n, symbol = '=') ) %>% ungroup() %>% mutate( cyl = numform::fv_runs(cyl), ` ` = f_text_bar(n, symbol = '#') ) %>% as.data.frame() ## End(Not run)
## Not run: library(dplyr) mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate( p = numform::f_pp(n/sum(n)) ) %>% ungroup() %>% mutate( cyl = numform::fv_runs(cyl), ` ` = f_text_bar(n) ## Overall ) %>% as.data.frame() mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate( p = numform::f_pp(n/sum(n)), ` ` = f_text_bar(n) ## within groups ) %>% ungroup() %>% mutate( cyl = numform::fv_runs(cyl), ` ` = f_text_bar(n) ) %>% as.data.frame() mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate( p = numform::f_pp(n/sum(n)), `within` = f_text_bar(n, width = 3, symbol = '#') ) %>% ungroup() %>% mutate( cyl = numform::fv_runs(cyl), `overall` = f_text_bar(n, width = 30, symbol = '*') ) %>% as.data.frame() %>% pander::pander(split.tables = Inf, justify = alignment(.), style = 'simple') ## Drop the headers mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate( p = numform::f_pp(n/sum(n)), ` ` = f_text_bar(n, symbol = '=') ) %>% ungroup() %>% mutate( cyl = numform::fv_runs(cyl), ` ` = f_text_bar(n, symbol = '#') ) %>% as.data.frame() ## End(Not run)
A wrapper for toTitleCase
converting text to title case.
f_title(x, upper = NULL, lower = NULL, ...) ff_title(...)
f_title(x, upper = NULL, lower = NULL, ...) ff_title(...)
x |
A vector of text strings. |
upper |
A vector of regular expression to convert to upper case that would otherwise be lower cased (this should be targeted at the initial output, not the input). |
lower |
A vector of regular expression to convert to lower case that would otherwise be upper cased (this should be targeted at the initial output, not the input). |
... |
ignored. |
Returns a string vector with characters replaced.
f_title('i love this title') f_title(f_replace('Cool_Variable')) f_title(c('select', 'group by', 'My ascii')) f_title(c('select', 'group by', 'My ascii'), upper = c('Ascii')) f_title(c('select', 'group by', 'My ascii'), upper = c('Ascii', 'b(?=y\\b)')) ## Not run: library(tidyverse) set.seed(10) dat <- data_frame( level = c("not_involved", "somewhat_involved_single_group", "somewhat_involved_multiple_groups", "very_involved_one_group", "very_involved_multiple_groups" ), n = sample(1:10, length(level)) ) %>% mutate( level = factor(level, levels = unique(level)), `%` = n/sum(n) ) gridExtra::grid.arrange( gridExtra::arrangeGrob( dat %>% ggplot(aes(level, `%`)) + geom_col() + labs(title = 'Very Sad', y = NULL) + theme( axis.text = element_text(size = 7), title = element_text(size = 9) ), dat %>% ggplot(aes(level, `%`)) + geom_col() + scale_x_discrete(labels = function(x) f_replace(x, '_', '\n')) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) + labs(title = 'Underscore Split (Readable)', y = NULL) + theme( axis.text = element_text(size = 7), title = element_text(size = 9) ), ncol = 2 ), gridExtra::arrangeGrob( dat %>% ggplot(aes(level, `%`)) + geom_col() + scale_x_discrete(labels = function(x) f_title(f_replace(x))) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) + labs(title = 'Underscore Replaced & Title (Capitalized Sadness)', y = NULL) + theme( axis.text = element_text(size = 7), title = element_text(size = 9) ), dat %>% ggplot(aes(level, `%`)) + geom_col() + scale_x_discrete(labels = function(x) f_wrap(f_title(f_replace(x)))) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) + labs(title = 'Underscore Replaced, Title, & Wrapped (Happy)', y = NULL) + theme( axis.text = element_text(size = 7), title = element_text(size = 9) ), ncol = 2 ), ncol = 1 ) ## End(Not run)
f_title('i love this title') f_title(f_replace('Cool_Variable')) f_title(c('select', 'group by', 'My ascii')) f_title(c('select', 'group by', 'My ascii'), upper = c('Ascii')) f_title(c('select', 'group by', 'My ascii'), upper = c('Ascii', 'b(?=y\\b)')) ## Not run: library(tidyverse) set.seed(10) dat <- data_frame( level = c("not_involved", "somewhat_involved_single_group", "somewhat_involved_multiple_groups", "very_involved_one_group", "very_involved_multiple_groups" ), n = sample(1:10, length(level)) ) %>% mutate( level = factor(level, levels = unique(level)), `%` = n/sum(n) ) gridExtra::grid.arrange( gridExtra::arrangeGrob( dat %>% ggplot(aes(level, `%`)) + geom_col() + labs(title = 'Very Sad', y = NULL) + theme( axis.text = element_text(size = 7), title = element_text(size = 9) ), dat %>% ggplot(aes(level, `%`)) + geom_col() + scale_x_discrete(labels = function(x) f_replace(x, '_', '\n')) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) + labs(title = 'Underscore Split (Readable)', y = NULL) + theme( axis.text = element_text(size = 7), title = element_text(size = 9) ), ncol = 2 ), gridExtra::arrangeGrob( dat %>% ggplot(aes(level, `%`)) + geom_col() + scale_x_discrete(labels = function(x) f_title(f_replace(x))) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) + labs(title = 'Underscore Replaced & Title (Capitalized Sadness)', y = NULL) + theme( axis.text = element_text(size = 7), title = element_text(size = 9) ), dat %>% ggplot(aes(level, `%`)) + geom_col() + scale_x_discrete(labels = function(x) f_wrap(f_title(f_replace(x)))) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) + labs(title = 'Underscore Replaced, Title, & Wrapped (Happy)', y = NULL) + theme( axis.text = element_text(size = 7), title = element_text(size = 9) ), ncol = 2 ), ncol = 1 ) ## End(Not run)
Format long weekday name, integer, or date formats to a single capital letter. Useful for plot scales as a way to save space.
f_weekday(x, distinct = FALSE, ...) ## Default S3 method: f_weekday(x, distinct = FALSE, ...) ## S3 method for class 'numeric' f_weekday(x, distinct = FALSE, ...) ## S3 method for class 'Date' f_weekday(x, distinct = FALSE, ...) ## S3 method for class 'POSIXt' f_weekday(x, distinct = FALSE, ...) ## S3 method for class 'hms' f_weekday(x, distinct = FALSE, ...) ff_weekday(distinct = FALSE, ...) f_weekday_name(x, ...) ## Default S3 method: f_weekday_name(x, ...) ## S3 method for class 'numeric' f_weekday_name(x, ...) ## S3 method for class 'Date' f_weekday_name(x, ...) ## S3 method for class 'POSIXt' f_weekday_name(x, ...) ## S3 method for class 'hms' f_weekday_name(x, ...) ff_weekday_name(...) f_weekday_abbreviation(x, ...) ## Default S3 method: f_weekday_abbreviation(x, ...) ## S3 method for class 'numeric' f_weekday_abbreviation(x, ...) ## S3 method for class 'Date' f_weekday_abbreviation(x, ...) ## S3 method for class 'POSIXt' f_weekday_abbreviation(x, ...) ## S3 method for class 'hms' f_weekday_abbreviation(x, ...) ff_weekday_abbreviation(...)
f_weekday(x, distinct = FALSE, ...) ## Default S3 method: f_weekday(x, distinct = FALSE, ...) ## S3 method for class 'numeric' f_weekday(x, distinct = FALSE, ...) ## S3 method for class 'Date' f_weekday(x, distinct = FALSE, ...) ## S3 method for class 'POSIXt' f_weekday(x, distinct = FALSE, ...) ## S3 method for class 'hms' f_weekday(x, distinct = FALSE, ...) ff_weekday(distinct = FALSE, ...) f_weekday_name(x, ...) ## Default S3 method: f_weekday_name(x, ...) ## S3 method for class 'numeric' f_weekday_name(x, ...) ## S3 method for class 'Date' f_weekday_name(x, ...) ## S3 method for class 'POSIXt' f_weekday_name(x, ...) ## S3 method for class 'hms' f_weekday_name(x, ...) ff_weekday_name(...) f_weekday_abbreviation(x, ...) ## Default S3 method: f_weekday_abbreviation(x, ...) ## S3 method for class 'numeric' f_weekday_abbreviation(x, ...) ## S3 method for class 'Date' f_weekday_abbreviation(x, ...) ## S3 method for class 'POSIXt' f_weekday_abbreviation(x, ...) ## S3 method for class 'hms' f_weekday_abbreviation(x, ...) ff_weekday_abbreviation(...)
x |
A vector of weekday names, integers 1-12, or dates. |
distinct |
logical. If |
... |
ignored. |
Returns a single letter month abbreviation atomic vector.
f_weekday(weekdays(x=as.Date(seq(7), origin="1950-01-07"))) f_weekday(weekdays(x=as.Date(seq(7), origin="1950-01-07")), TRUE) f_weekday(1:7) f_weekday(1:7, TRUE) days <- seq(as.Date("2000/1/2"), by = "day", length.out = 7) f_weekday(days) f_weekday(days, TRUE) ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse) set.seed(11) data_frame( date = sample(seq(as.Date("1990/1/1"), by = "day", length.out = 2e4), 12) ) %>% mutate( year_4 = f_year(date, 2), year_2 = f_year(date, 4), quarter = f_quarter(date), month_name = f_month_name(date) %>% as_factor(), month_abbreviation = f_month_abbreviation(date) %>% as_factor(), month_short = f_month(date), weekday_name = f_weekday_name(date), weekday_abbreviation = f_weekday_abbreviation(date), weekday_short = f_weekday(date), weekday_short_distinct = f_weekday(date, distinct = TRUE) ) set.seed(10) dat <- data_frame( day = sample(weekdays(days), 10000, TRUE), area = sample(LETTERS[1:15], 10000, TRUE) ) %>% count(day, area) %>% ungroup() %>% mutate( day = factor(day, levels = weekdays(days)) ) ## without date formatting ggplot(dat, aes(day, n)) + geom_bar(stat = 'identity') + facet_wrap(~area) ## with date formatting ggplot(dat, aes(day, n)) + geom_bar(stat = 'identity') + facet_wrap(~area) + scale_x_discrete(labels = f_weekday) ## with date formatting ggplot(dat, aes(day, n)) + geom_bar(stat = 'identity') + facet_wrap(~area) + scale_x_discrete(labels = ff_weekday(distinct = TRUE)) ## End(Not run)
f_weekday(weekdays(x=as.Date(seq(7), origin="1950-01-07"))) f_weekday(weekdays(x=as.Date(seq(7), origin="1950-01-07")), TRUE) f_weekday(1:7) f_weekday(1:7, TRUE) days <- seq(as.Date("2000/1/2"), by = "day", length.out = 7) f_weekday(days) f_weekday(days, TRUE) ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse) set.seed(11) data_frame( date = sample(seq(as.Date("1990/1/1"), by = "day", length.out = 2e4), 12) ) %>% mutate( year_4 = f_year(date, 2), year_2 = f_year(date, 4), quarter = f_quarter(date), month_name = f_month_name(date) %>% as_factor(), month_abbreviation = f_month_abbreviation(date) %>% as_factor(), month_short = f_month(date), weekday_name = f_weekday_name(date), weekday_abbreviation = f_weekday_abbreviation(date), weekday_short = f_weekday(date), weekday_short_distinct = f_weekday(date, distinct = TRUE) ) set.seed(10) dat <- data_frame( day = sample(weekdays(days), 10000, TRUE), area = sample(LETTERS[1:15], 10000, TRUE) ) %>% count(day, area) %>% ungroup() %>% mutate( day = factor(day, levels = weekdays(days)) ) ## without date formatting ggplot(dat, aes(day, n)) + geom_bar(stat = 'identity') + facet_wrap(~area) ## with date formatting ggplot(dat, aes(day, n)) + geom_bar(stat = 'identity') + facet_wrap(~area) + scale_x_discrete(labels = f_weekday) ## with date formatting ggplot(dat, aes(day, n)) + geom_bar(stat = 'identity') + facet_wrap(~area) + scale_x_discrete(labels = ff_weekday(distinct = TRUE)) ## End(Not run)
Wrap strings by splitting n width, and paste collapsing with new line characters.
f_wrap( x, width = 15, sep = "\n", exdent = 0, indent = 0, equal.lines = FALSE, collapse = FALSE, ... ) ff_wrap(...)
f_wrap( x, width = 15, sep = "\n", exdent = 0, indent = 0, equal.lines = FALSE, collapse = FALSE, ... ) ff_wrap(...)
x |
A vector of text strings. |
width |
A positive integer giving the target column for wrapping lines in the output. |
sep |
A new line separator (defaults to |
exdent |
A non-negative integer specifying the indentation of subsequent lines in paragraphs. |
indent |
A non-negative integer giving the indentation of the first line in a paragraph. |
equal.lines |
logical. If |
collapse |
logical. If |
... |
Other arguments passed to |
Returns a string vector with wrapped new line characters.
cat(f_wrap('really long label names are the pits')) cat(f_wrap('really long label names are the pits', width = 20, exdent = 2)) f_wrap(c('really long label names are the pits and make us sad', 'not nearly so long'), equal.lines = TRUE) ## Not run: library(tidyverse); library(gridExtra) set.seed(10) dat <- data_frame( level = c('Not Involved', 'Somewhat Involved Single Group', 'Somewhat Involved Multiple Groups', 'Very Involved One Group', 'Very Involved Multiple Groups' ), n = sample(1:10, length(level)) ) %>% mutate( level = factor(level, levels = unique(level)), `%` = n/sum(n) ) gridExtra::grid.arrange( dat %>% ggplot(aes(level, `%`)) + geom_col() + labs(title = 'Yucky Labels', y = NULL), dat %>% ggplot(aes(level, `%`)) + geom_col() + scale_x_discrete(labels = f_wrap) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) + labs(title = 'Happy Labels', y = NULL), ncol = 1, heights = c(.45, .55) ) ## End(Not run)
cat(f_wrap('really long label names are the pits')) cat(f_wrap('really long label names are the pits', width = 20, exdent = 2)) f_wrap(c('really long label names are the pits and make us sad', 'not nearly so long'), equal.lines = TRUE) ## Not run: library(tidyverse); library(gridExtra) set.seed(10) dat <- data_frame( level = c('Not Involved', 'Somewhat Involved Single Group', 'Somewhat Involved Multiple Groups', 'Very Involved One Group', 'Very Involved Multiple Groups' ), n = sample(1:10, length(level)) ) %>% mutate( level = factor(level, levels = unique(level)), `%` = n/sum(n) ) gridExtra::grid.arrange( dat %>% ggplot(aes(level, `%`)) + geom_col() + labs(title = 'Yucky Labels', y = NULL), dat %>% ggplot(aes(level, `%`)) + geom_col() + scale_x_discrete(labels = f_wrap) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) + labs(title = 'Happy Labels', y = NULL), ncol = 1, heights = c(.45, .55) ) ## End(Not run)
Format 4 digit integer, date, or POSIXlt formats to 2 or 4 digit years.
f_year(x, digits = 2, ...) ## S3 method for class 'numeric' f_year(x, digits = 2, ...) ## S3 method for class 'Date' f_year(x, digits = 2, ...) ## S3 method for class 'POSIXt' f_year(x, digits = 2, ...) ## S3 method for class 'hms' f_year(x, digits = 2, ...) ff_year(digits = 2, ...)
f_year(x, digits = 2, ...) ## S3 method for class 'numeric' f_year(x, digits = 2, ...) ## S3 method for class 'Date' f_year(x, digits = 2, ...) ## S3 method for class 'POSIXt' f_year(x, digits = 2, ...) ## S3 method for class 'hms' f_year(x, digits = 2, ...) ff_year(digits = 2, ...)
x |
A vector of 4 digits integers, dates, or POSIXlt. |
digits |
Either 2 or 4 for the number of digits to make the year. |
... |
ignored. |
Returns a vector of two or four digit years.
f_year(as.Date(paste0(1998:2016, '-12-12'))) f_year(c(NA, 1998:2016, 21345)) ## Not run: library(tidyverse) dat <- data_frame( year = 1998:2016, year2 = as.POSIXct(sample(seq_len(1e4), 12), origin = '1970-01-01') + (365 * 24 * 3600 * seq_len(19)), val = sample(1:20, length(year), TRUE) ) %>% mutate(prop = val/sum(val)) dat %>% ggplot(aes(year, prop)) + geom_line() + scale_x_continuous(labels = ff_year(digits = 2), breaks = 1998:2016) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) dat %>% ggplot(aes(year2, prop)) + geom_line() + scale_x_time(labels = ff_year(digits = 2), breaks = dat$year2) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) ## End(Not run)
f_year(as.Date(paste0(1998:2016, '-12-12'))) f_year(c(NA, 1998:2016, 21345)) ## Not run: library(tidyverse) dat <- data_frame( year = 1998:2016, year2 = as.POSIXct(sample(seq_len(1e4), 12), origin = '1970-01-01') + (365 * 24 * 3600 * seq_len(19)), val = sample(1:20, length(year), TRUE) ) %>% mutate(prop = val/sum(val)) dat %>% ggplot(aes(year, prop)) + geom_line() + scale_x_continuous(labels = ff_year(digits = 2), breaks = 1998:2016) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) dat %>% ggplot(aes(year2, prop)) + geom_line() + scale_x_time(labels = ff_year(digits = 2), breaks = dat$year2) + scale_y_continuous(labels = ff_prop2percent(digits = 0)) ## End(Not run)
Convert a vector of numbers into a vector of strings with the number followed by the relative percentage in parenthesis.
fv_num_percent( x, x_digits = getOption("numformdigits"), y_digits = x_digits, sep = "", comma = TRUE, ... ) ffv_num_percent(...)
fv_num_percent( x, x_digits = getOption("numformdigits"), y_digits = x_digits, sep = "", comma = TRUE, ... ) ffv_num_percent(...)
x |
A numeric vector. |
x_digits |
The number of digits to round the x vector. |
y_digits |
The number of digits to round the y vector. |
sep |
The separator between the first number and the leading parenthesis. |
comma |
logical. If |
... |
ignored. |
Returns a vector of parenthesis combined strings using vector x followed by the value as a relative percent in parenthesis.
fv_num_percent(1:10) fv_num_percent(1:10, x_digits = 0, y_digits = 1, sep = " ")
fv_num_percent(1:10) fv_num_percent(1:10, x_digits = 0, y_digits = 1, sep = " ")
Converts a numeric vector into a vector of relative percentages.
fv_percent(x, digits = getOption("numformdigits"), ...) ffv_percent(...) ffv_percent(...)
fv_percent(x, digits = getOption("numformdigits"), ...) ffv_percent(...) ffv_percent(...)
x |
A numeric vector. |
digits |
The number of digits to use. Defaults to 1. Can be set
globally via: |
... |
Other arguments passed to |
Returns a string of publication ready relative percentages.
fv_percent(1:4) fv_percent(sample(1:100, 20)) ## Not run: library(tidyverse) mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate(perc = fv_percent(n, digits = 0)) mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate(perc = fv_percent(n, digits = 0)) %>% ggplot(aes(gear, n)) + geom_bar(stat = 'identity') + facet_wrap(~cyl, ncol = 1) + geom_text(aes(y = n + 1, label = perc)) ## End(Not run)
fv_percent(1:4) fv_percent(sample(1:100, 20)) ## Not run: library(tidyverse) mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate(perc = fv_percent(n, digits = 0)) mtcars %>% count(cyl, gear) %>% group_by(cyl) %>% mutate(perc = fv_percent(n, digits = 0)) %>% ggplot(aes(gear, n)) + geom_bar(stat = 'identity') + facet_wrap(~cyl, ncol = 1) + geom_text(aes(y = n + 1, label = perc)) ## End(Not run)
fv_percent_diff
- Convert a vector of values to percent differences
(i.e., (T2 - T1)/T1).
fv_percent_diff(x, digits = getOption("numformdigits"), ...) fv_percent_diff_fixed_relative( x, fixed.relative = 1, digits = getOption("numformdigits"), ... ) ffv_percent_diff_fixed_relative(...) ffv_percent_diff(...)
fv_percent_diff(x, digits = getOption("numformdigits"), ...) fv_percent_diff_fixed_relative( x, fixed.relative = 1, digits = getOption("numformdigits"), ... ) ffv_percent_diff_fixed_relative(...) ffv_percent_diff(...)
x |
A numeric vector. |
digits |
The number of digits to use. Defaults to 1. Can be set
globally via: |
fixed.relative |
The position of the element to be used for comparison. Default is the first element. |
... |
Other arguments passed to |
Returns a string of publication ready relative percent differences.
set.seed(10) x <- sample(1:10) data.frame( original = x, perc_change = fv_percent_diff(x) ) ## Not run: library(dplyr) CO2 %>% group_by(Plant) %>% mutate( `Percent` = fv_percent(conc), `Percent Diff` = fv_percent_diff(conc) ) %>% print(n=Inf) CO2 %>% group_by(Type, Treatment) %>% mutate( `Percent` = fv_percent(conc), `Percent Diff` = fv_percent_diff(conc) ) %>% print(n=Inf) ## End(Not run)
set.seed(10) x <- sample(1:10) data.frame( original = x, perc_change = fv_percent_diff(x) ) ## Not run: library(dplyr) CO2 %>% group_by(Plant) %>% mutate( `Percent` = fv_percent(conc), `Percent Diff` = fv_percent_diff(conc) ) %>% print(n=Inf) CO2 %>% group_by(Type, Treatment) %>% mutate( `Percent` = fv_percent(conc), `Percent Diff` = fv_percent_diff(conc) ) %>% print(n=Inf) ## End(Not run)
fv_percent_lead
- Convert a vector of values to percent relative to
prior value in the vector (i.e., T2/T1).
fv_percent_lead(x, digits = getOption("numformdigits"), ...) fv_percent_lead_fixed_relative( x, fixed.relative = 1, digits = getOption("numformdigits"), ... ) ffv_percent_lead(...) ffv_percent_lead_fixed_relative(...)
fv_percent_lead(x, digits = getOption("numformdigits"), ...) fv_percent_lead_fixed_relative( x, fixed.relative = 1, digits = getOption("numformdigits"), ... ) ffv_percent_lead(...) ffv_percent_lead_fixed_relative(...)
x |
A numeric vector. |
digits |
The number of digits to use. Defaults to 1. Can be set
globally via: |
fixed.relative |
The position of the element to be used for comparison. Default is the first element. |
... |
Other arguments passed to |
Returns a string of publication ready relative percent differences.
set.seed(10) x <- sample(1:10) data.frame( original = x, perc_change = fv_percent_lead(x) ) ## Not run: library(dplyr) CO2 %>% group_by(Plant) %>% mutate( `Percent` = fv_percent(conc), `Percent Diff` = fv_percent_diff(conc), `Percent Relative` = fv_percent_lead(conc) ) %>% print(n=Inf) CO2 %>% group_by(Type, Treatment) %>% mutate( `Percent` = fv_percent(conc), `Percent Diff` = fv_percent_diff(conc), `Percent Relative` = fv_percent_lead(conc) ) %>% print(n=Inf) ## End(Not run)
set.seed(10) x <- sample(1:10) data.frame( original = x, perc_change = fv_percent_lead(x) ) ## Not run: library(dplyr) CO2 %>% group_by(Plant) %>% mutate( `Percent` = fv_percent(conc), `Percent Diff` = fv_percent_diff(conc), `Percent Relative` = fv_percent_lead(conc) ) %>% print(n=Inf) CO2 %>% group_by(Type, Treatment) %>% mutate( `Percent` = fv_percent(conc), `Percent Diff` = fv_percent_diff(conc), `Percent Relative` = fv_percent_lead(conc) ) %>% print(n=Inf) ## End(Not run)
Remove subsequent runs from a vector.
fv_runs(x, fill = "", missing = NA, ...)
fv_runs(x, fill = "", missing = NA, ...)
x |
A vector with runs. |
fill |
What to fill in subsequent runs with. |
missing |
What to fill in missing values with. |
... |
ignored. |
Returns a vector of strings with subsequent runs removed.
x <- c(1, 1 , 2, 3, 4, 4, 1, 1, 3, 3, NA, 5) fv_runs(x) fv_runs(x, fill = '-') fv_runs(x, fill = '-', missing = 'X') ## Not run: library(dplyr) set.seed(10) data.frame( state = sort(sample(state.name[c(1, 5, 9, 12)], 12, TRUE)), val = rnorm(12) ) %>% mutate(state2 = fv_runs(state)) ## End(Not run)
x <- c(1, 1 , 2, 3, 4, 4, 1, 1, 3, 3, NA, 5) fv_runs(x) fv_runs(x, fill = '-') fv_runs(x, fill = '-', missing = 'X') ## Not run: library(dplyr) set.seed(10) data.frame( state = sort(sample(state.name[c(1, 5, 9, 12)], 12, TRUE)), val = rnorm(12) ) %>% mutate(state2 = fv_runs(state)) ## End(Not run)
A lightweight cell highlighter that uses non-standard evaluation. This
function is designed for interactive use. It's behavior outside of this
context is not gaurenteed. For finer contral use an ifelse
with
paste
within a ?dplyr::mutate
statement.
highlight_cells( data, rows, columns = seq_len(ncol(data)), left = "<b>", right = gsub("(<)([^> ]+)([^>]*>)", "\\1/\\2>", left), ... )
highlight_cells( data, rows, columns = seq_len(ncol(data)), left = "<b>", right = gsub("(<)([^> ]+)([^>]*>)", "\\1/\\2>", left), ... )
data |
A data.frame. |
rows |
An expression that evaluates to logical and is equal in length to the number of rows. |
columns |
A vector of either integer positions or character names corresponding to columns that should be highlighted. Defaults to all columns. |
left |
A highlighting tag for the left side of the cell value. |
right |
A highlighting tag for the right side of the cell value.
Attempts to use the |
... |
ignored. |
Returns a data.frame with the chosen cell values wrapped in highlight tags.
highlight_cells(mtcars, rows = hp > 230 | qsec > 20) highlight_cells(mtcars, rows = hp > 230, columns = 'hp') ## Not run: library(dplyr); library(tibble); library(pander) mtcars %>% highlight_cells(rows = hp > 230, columns = 'hp') %>% highlight_cells(rows = qsec > 20, columns = 'qsec', left = '<b style="color:blue;">') %>% rownames_to_column('car') %>% data.frame(stringsAsFactors = FALSE, check.names = FALSE) %>% pander::pander(split.tables = Inf, justify = alignment(.)) ## End(Not run) ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse, magrittr) set.seed(10) data_frame( w = paste(constant_months, rep(2016:2017, each = 12))[1:20] , x = rnorm(20, 200000, 75000) ) %>% { a <- . rbind( a, a %>% mutate(w = 'Total') %>% group_by(w) %>% summarize(x = sum(x)) ) } %>% mutate( y = f_denom(x, prefix = '$'), z = f_denom(x, mix.denom = TRUE, prefix = '$'), x = f_comma(f_dollar(x, 2)) ) %>% highlight_cells(w == 'Total') %>% data.frame(stringsAsFactors = FALSE, check.names = FALSE) %>% pander::pander(split.tables = Inf, justify = alignment(.)) ## End(Not run)
highlight_cells(mtcars, rows = hp > 230 | qsec > 20) highlight_cells(mtcars, rows = hp > 230, columns = 'hp') ## Not run: library(dplyr); library(tibble); library(pander) mtcars %>% highlight_cells(rows = hp > 230, columns = 'hp') %>% highlight_cells(rows = qsec > 20, columns = 'qsec', left = '<b style="color:blue;">') %>% rownames_to_column('car') %>% data.frame(stringsAsFactors = FALSE, check.names = FALSE) %>% pander::pander(split.tables = Inf, justify = alignment(.)) ## End(Not run) ## Not run: if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse, magrittr) set.seed(10) data_frame( w = paste(constant_months, rep(2016:2017, each = 12))[1:20] , x = rnorm(20, 200000, 75000) ) %>% { a <- . rbind( a, a %>% mutate(w = 'Total') %>% group_by(w) %>% summarize(x = sum(x)) ) } %>% mutate( y = f_denom(x, prefix = '$'), z = f_denom(x, mix.denom = TRUE, prefix = '$'), x = f_comma(f_dollar(x, 2)) ) %>% highlight_cells(w == 'Total') %>% data.frame(stringsAsFactors = FALSE, check.names = FALSE) %>% pander::pander(split.tables = Inf, justify = alignment(.)) ## End(Not run)
Format numbers and plots for publication; includes the removal of leading zeros,
standardization of number of digits, addition of affixes, and a p-value
formatter. These tools combine the functionality of several 'base' functions
such as paste
, format
, and
sprintf
into specific use case functions that are named in
a way that is consistent with usage, making their names easy to remember and
easy to deploy.
round2
- By default R's round
function uses the 'round half to
even' method. This function (taken from https://stackoverflow.com/a/12688836/1000343)
rounds half up.
round_any
- This tooling lets you round to fractional values, not
just whole numbers. Code adapted from https://stackoverflow.com/a/8665247/1000343.
round2(x, digits = 0, ...) round_any(x, accuracy, f = round2, ...)
round2(x, digits = 0, ...) round_any(x, accuracy, f = round2, ...)
x |
A vector of digits. |
digits |
The number of decimal places to round to. |
accuracy |
Number to round to. |
f |
A function to round (e.g., |
... |
ignored. |
round2
- Returns numeric vector half rounded up.
round_any
- Returns a numeric vector or rounded fractional values.
Kohske Takahashi
https://stackoverflow.com/a/12688836/1000343
https://stackoverflow.com/a/8665247/1000343
data.frame( orig = .5 + (0:8), round = round(.5 + (0:8)), round2 = round2(.5 + (0:8)) ) round_any(c(.123, 1.234, 4, 4.715), .5) round_any(c(.123, 1.234, 4, 4.715), .25)
data.frame( orig = .5 + (0:8), round = round(.5 + (0:8)), round2 = round2(.5 + (0:8)) ) round_any(c(.123, 1.234, 4, 4.715), .5) round_any(c(.123, 1.234, 4, 4.715), .25)
This tool computes the minimum number of digits required for a vector of times. The defaults of the tool assumes your time is rounded to within the quarter hour.
time_digits(x, ...)
time_digits(x, ...)
x |
A numeric vector of times rounded tot he nearest quarter hour. |
... |
ignored |
Returns integer 0-2
time_digits(c(.5, .25, 6)) time_digits(c(.5, 3.5, 6)) time_digits(c(5, 25, 6)) x <- c(.5, .25, 6) numform::f_pad_left(numform::f_num(x, digits = numform::time_digits(x))) lapply( list(quarter = c(.5, .25, 6), half = c(.5, 3.5, 6), hour = c(5, 25, 6)), function(x) {numform::f_pad_left(numform::f_num(x, digits = numform::time_digits(x)))} )
time_digits(c(.5, .25, 6)) time_digits(c(.5, 3.5, 6)) time_digits(c(5, 25, 6)) x <- c(.5, .25, 6) numform::f_pad_left(numform::f_num(x, digits = numform::time_digits(x))) lapply( list(quarter = c(.5, .25, 6), half = c(.5, 3.5, 6), hour = c(5, 25, 6)), function(x) {numform::f_pad_left(numform::f_num(x, digits = numform::time_digits(x)))} )