Title: | Convenience Functions by Michael Chirico |
---|---|
Description: | YACFP (Yet Another Convenience Function Package). get_age() is a fast & accurate tool for measuring fractional years between two dates. stale_package_check() tries to identify any library() calls to unused packages. |
Authors: | Michael Chirico |
Maintainer: | Michael Chirico <[email protected]> |
License: | MIT + file LICENSE |
Version: | 0.2.99 |
Built: | 2024-12-23 08:25:16 UTC |
Source: | https://github.com/michaelchirico/funchir |
Several infix operators which are convenient shorthand for common set operations, namely, modulation (A\B), union (AUB) and intersection (A & B).
A %\% B A %u% B A %^% B
A %\% B A %u% B A %^% B
A |
A set |
B |
idem |
The above are simply wrappers for the base functions setdiff
, union
, and intersect
, respectively, so output is exactly as for those functions.
set1 <- 1:5 set2 <- 4:6 set1 %\% set2 # c(1,2,3) set1 %u% set2 # c(1,2,3,4,5,6) set1 %^% set2 # c(4,5)
set1 <- 1:5 set2 <- 4:6 set1 %\% set2 # c(1,2,3) set1 %u% set2 # c(1,2,3,4,5,6) set1 %^% set2 # c(4,5)
tile.axes
is used in for loops to generate axes in a multi-panel plot with shared x & y axes (within row and column).
xdev2in
is the inverse of graphics::xinch
; namely, it converts from plotting device units into inches.
tile.axes(n, M, N, params = list(x = list(), y = list()), use.x = TRUE, use.y = TRUE) xdev2in(x = 1) ydev2in(y = 1) xydev2in(xy = 1)
tile.axes(n, M, N, params = list(x = list(), y = list()), use.x = TRUE, use.y = TRUE) xdev2in(x = 1) ydev2in(y = 1) xydev2in(xy = 1)
n |
Integer. Cell in |
M |
Integer. Number of rows specified in |
N |
Integer. Number of columns specified in |
params |
A length-2 |
use.x |
|
use.y |
|
x |
|
y |
|
xy |
|
tile.axes
provides a simple way to incorporate the plotting of axes into a loop which creates the plots in a matrix of plots (e.g., by using par(mfrow=c(2, 2))
) when the axes are shared by all plots. x axes are only printed on the bottom row of plots, and y axes are only printed on the first column of plots–this saves potentially wasted / white space by eliminating redundant axes, yet can still be done in a loop.
Some graphics functions specify some arguments with units in inches (namely, graphics::arrows
' length
argument). graphics::xinch
provides the inverse functionality enabling conversion from inches into plotting units; up to numerical accuracy, then, graphics::xinch(xdev2in(x)) == x
.
smpl <- rnorm(100) par(mfrow = c(2, 1), mar = c(0, 0, 0, 0), oma=c(5, 4, 4, 2) + .1) for (ii in 1:2){ hist(smpl[sample(length(smpl), 100, rep = TRUE)], xaxt = "n", yaxt = "n") tile.axes(ii, 2, 1) }
smpl <- rnorm(100) par(mfrow = c(2, 1), mar = c(0, 0, 0, 0), oma=c(5, 4, 4, 2) + .1) for (ii in 1:2){ hist(smpl[sample(length(smpl), 100, rep = TRUE)], xaxt = "n", yaxt = "n") tile.axes(ii, 2, 1) }
Several odds-and-ends functions for data manipulation & representation, etc. See details and examples.
create_quantiles(x, num, right = FALSE, na.rm = FALSE, include.lowest = TRUE, labels = 1:num) to.pct(x, dig = Inf) nx.mlt(x, n) divide(x, n, na.rm = FALSE) dol.form(x, dig = 0L, suff = "", tex = FALSE) ntostr(n, dig = 2L) write.packages(con) stale_package_check(con) embed.mat(mat, M = nrow(mat), N = ncol(mat), m = 1L, n = 1L, fill = 0L) quick_year(dates) quick_mday(dates) quick_yday(dates)
create_quantiles(x, num, right = FALSE, na.rm = FALSE, include.lowest = TRUE, labels = 1:num) to.pct(x, dig = Inf) nx.mlt(x, n) divide(x, n, na.rm = FALSE) dol.form(x, dig = 0L, suff = "", tex = FALSE) ntostr(n, dig = 2L) write.packages(con) stale_package_check(con) embed.mat(mat, M = nrow(mat), N = ncol(mat), m = 1L, n = 1L, fill = 0L) quick_year(dates) quick_mday(dates) quick_yday(dates)
x |
A numeric vector. |
num |
A number, typically an integer, specifying how many equal-count intervals into which to divide the data. |
right |
logical, indicating if the intervals should be closed on the right (and open on the left) or vice versa. |
na.rm |
|
include.lowest |
logical, indicating if an |
labels |
|
dig |
The number of digits to be included past the decimal in output; sent directly to |
suff |
The suffix to appended/unit in which to express |
tex |
Should |
n |
For |
con |
A file/connection where output should be written. |
mat |
A matrix. |
M |
An integer specifying the number of rows in the enclosing matrix. |
N |
An integer specifying the number of columns in the enclosing matrix. |
m |
An integer specifying the row at which to insert |
fill |
An atomic vector specifying how to fill the enclosing matrix. |
dates |
A vector of |
create_quantiles
is a parsimonious function for generating quantiles of a vector (e.g., quartiles for num=4
or quintiles for num=5
). Basically a wrapper for the cut
function; the type of the output is factor
. Fails for vectors with overlapping quantiles (e.g., with >50% of values of x
equal to zero) unless the correct number of labels (i.e., the number of unique quantile breaks) is given in the labels
argument.
to.pct
converts a number (probably a proportion, i.e., typically between 0 and 1) to a percentage; also has an argument (dig
) which can be used to round the output inline.
nx.mlt
returns the least multiple of n
which (weakly) exceeds x
. Convenient for making axes ticks land on pretty numbers.
divide
divides the range (min through max) of x
into n
points (basically a shorthand for seq
).
dol.form
takes a financial input and converts it to a (American-formatted, American-currency) string for printing–appending a dollar sign ("\$"
) and inserting commas after every third digit from the left of the decimal point.
ntostr
converts n
to a character
vector with each element width dig
. This is particularly nice for converting 99:100 to "99" and "100".
write.packages
captures the current package environment (inspired by sessionInfo()
and writes it as a JSON to con
with writeLines
; a list
version of this object is returned. This may be essential for tracking across time which package versions were being used.
stale_package_check
reads a file (with readLines
) and checks which functions are actually used from each loaded package. Currently only checks for library
(i.e., not require
) calls.
embed.mat
inserts a supplied matrix into a (weakly) larger enclosing matrix, typically filled with 0s, at a specified position.
quick_year
converts a Date
object into its year efficiently; also ignores concerns of leap centuries. quick_mday
returns the day of the month. quick_yday
returns the day of the year. Returns as an integer
.
x <- runif(100) # Return which multiple of 1/7 least # exceeds each element of x create_quantiles(x, 7) to.pct(x) to.pct(x, dig = 2) #output of the form xxx.xx nx.mlt(x, 1/3) dol.form(x, dig=2L) ntostr(999:1000, dig = 3L) # c("999","000") ntostr(999:1000, dig = 2L) # c("99","00") library(stats) write.packages() inmat <- matrix(1:9, ncol = 3L) embed.mat(inmat, M = 4L, N = 4L) embed.mat(inmat, N = 6L, n = 4L, fill = NA) d1 = as.Date('1987-05-02') d2 = as.Date('2016-02-23') quick_year(d1) quick_mday(d1)
x <- runif(100) # Return which multiple of 1/7 least # exceeds each element of x create_quantiles(x, 7) to.pct(x) to.pct(x, dig = 2) #output of the form xxx.xx nx.mlt(x, 1/3) dol.form(x, dig=2L) ntostr(999:1000, dig = 3L) # c("999","000") ntostr(999:1000, dig = 2L) # c("99","00") library(stats) write.packages() inmat <- matrix(1:9, ncol = 3L) embed.mat(inmat, M = 4L, N = 4L) embed.mat(inmat, N = 6L, n = 4L, fill = NA) d1 = as.Date('1987-05-02') d2 = as.Date('2016-02-23') quick_year(d1) quick_mday(d1)
For someone born May 1, 1990, what is their age on May 2, 2000? 10 years, but what if we want more precision? They are 1 day older, and May 1, 2001 is in 364 days, so they are 10 + 1/365 years old.
Things get more complicated when we include consideration of leap years, when the next birthday might be 366 days away.
get_age()
solves this problem.
Note that it assumes there are no leap centuries (and hence may will be incorrect for dates before March 1, 1900 or after February 28, 2100). It also takes the stance that leap babies (those born February 29) increment their age on March 1 in non-leap years.
get_age(birthdays, ref_dates)
get_age(birthdays, ref_dates)
birthdays |
A vector of |
ref_dates |
A vector of |
Numeric vector of years (including fractional parts) between each ref_dates
and birthdays
entry.