An implementation of matrix mathematics wherein operations are performed "by name."
The R
package matsbyname
enables matrix mathematics wherein
operations are performed “by name” and row and column types are allowed.
You can install matsbyname
from CRAN with:
install.packages("matsbyname")
You can install a recent development version of matsbyname
from github
with:
# install devtools if not already installed# install.packages("devtools")devtools::install_github("MatthewHeun/matsbyname")# To build vignettes locally, usedevtools::install_github("MatthewHeun/matsbyname", build_vignettes = TRUE)
The functions in this package were used in
Heun et al. (2018).
Find more information, including vignettes and function documentation, at https://MatthewHeun.github.io/matsbyname/.
Heun, Matthew Kuperus, Anne Owen, and Paul E. Brockway. 2018. “A Physical Supply-Use Table Framework for Energy Analysis on the Energy Conversion Chain.” Applied Energy 226 (September):1134–62. https://doi.org/10.1016/j.apenergy.2018.05.109.
citation("matsbyname")
now gives useful information.matrixproduct_byname
in which row and column types were not set correctly when one
operand was a matrix
and the other operand was NA
.elementapply_byname()
applies a function to an element
of a matrix specified by row
and col
arguments.elementproduct_byname()
changed to hadamardproduct_byname()
to avoid name collision with elementapply_byname()
.elementquotient_byname()
changed to quotient_byname()
.elementpow_byname()
changed to pow_byname()
.elementexp_byname()
changed to exp_byname()
.complete_rows_cols()
is now agnostic about the order of columns in fillrow
and the order of rows in fillcol
.sort_rows_cols()
now allows entries in roworder and colorder
that are not presently names of rows or columns.
Extraneous names are silently ignored.fractionize_byname()
now correctly handles non-square matrices.hatinv_byname()
now handles 0
values in input vectors gracefully.
By default, 0
values become .Machine$double.xmax
.inf_becomes
to a numerical value.
To suppress default behavior, set inf_becomes = NULL
.iszero_byname()
now checks if values of abs(a)
are <= tol
.
(Previously, iszero_byname()
tested with < tol
.)
This change allows the zero matrix to pass the test when tol = 0
,
as we would want.equal_byname()
to use isTRUE(all.equal())
when checking for equality.identical_byname()
checks for exact equality using identical
.identical()
instead of isTRUE(all.equal())
for equal_byname()
function.hatinv_byname()
.count_*
functions.mc.cores
arguments to matsbyname
functions.matbyname
.
Not sure if I want to keep it.all_byname()
and any_byname()
make logical tests easy.replaceNaN_byname()
replaces NaN
entries with a value (default is 0).*col*_byname
functions to call their respective *row*_byname
functions
with a transposed argument, thereby simplifying code.select_cols_byname
, a NULL
result terminated the executing thread.replaceNaNWith0
.count_vals_byname
, count_vals_inrows_byname
, and
count_vals_incols_byname
that return the number of matrix entries
that meet a criterion for the entire matrix, in each row, and in each column, respectively.*_byname
functions.New functions set_mc_cores
and get_mc_cores
to set and get package-wide mc.cores
variable.
Default is 1
, so all functions work as previously unless mc.cores
is more than 1
.
Alternatively, specify the mc.cores
argument of any function
to specify the number of cores to be used for an individual calculation.
Default is get_mc_cores()
.
A useful approach is to set_mc_cores(detectCores(logical = FALSE))
.
sum_byname(list(1,2,3,4), list(1,2,3,4), mc.cores = 4)
to send each sum to a different core.
set_mc_cores(4L); sum_byname(list(1,2,3,4), list(1,2,3,4), mc.cores = 4); set_mc_cores(1L)
to do the same thing and set the package-wide value back to 1
.
*apply_byname
functions enable API improvementsThese are API changes, but they shouldn't affect any existing code, because calls to binary functions will "just work."
naryapply_byname
: enables ...
arguments
naryapplylogical_byname
: enables logical functions
Add ...
arguments for functions that deserve them.
...
arguments includingsum_byname
matrixproduct_byname
elementproduct_byname
mean_byname
geometricmean_byname
equal_byname
samestructure_byname
and_byname(...)
function that provides logical and "by name."or_byname
, xor_byname
, and not_byname
.matsindf
.
Doing so allows matsbyname
to be submitted first to CRAN.
Also, Travis builds are now successful, having eliminated the circular dependence between
matsbyname
and matsindf
.elementpow_byname
raises all elements of a matrix to a power.complete_rows_cols
now accepts fillrow
and fillcol
arguments.
These arguments can be used (instead of the fill
argument)
to specify the values of filled rows and columns when completing a matrix.
When conflicts arise, precedence among the fill*
arguments is
fillrow
then fillcol
then fill
.matsbyname
.*apply_byname
functions.applybyname
vignette.unaryapply_byname
and binaryapply_byname
now have .FUNdots
arguments
through which arguments to FUN
should be passed.
Use of the ...
argument is no longer possible.
...
is reserved for future changes to allow an unlimited number of arguments
to some functions, such as sum_byname
..FUNdots
argument fixed a bug
where calculations were incorrect when
lists of matrices were stored in cells of a data frame.
Distribution of arguments (such as margin = c(1, 2)
) across rows of a data frame
was not happening properly.cumsum_byname
, cumprod_byname
, and cumapply_byname
.elementlog_byname
and elementexp_byname
.unaryapply_byname
and binaryapply_byname
.
These functions have a FUN
argument that allows an arbitrary function to be
applied _byname
to matrices or data frames containing matrices.
unaryapply_byname
is for unary functions such as rowsums_byname
.binaryapply_byname
is for binary functions such as sum_byname
.unaryapply_byname
and binaryapply_byname
are used by all _byname
functions internally.unaryapply
and binaryapply
functions are
very solid._byname
functions when one argument
was a list and the other was a non-constant numeric vector.complete_rows_cols_byname
. It no longer takes a names
argument.mean_byname
: returns the arithmetic mean of corresponding entries of two matricesgeometricmean_byname
: returns the geometric mean of corresponding entries of two matriceslogarithmicmean_byname
: returns the logarithmic mean of corresponding entries of two matricessetrownames_byname
and setcolnames_byname
on a constant would fail.
It now produces a 1x1 matrix with named rows or columns.rowprod_byname
: returns a column vector with row products (product of all entries in a row)colprod_byname
: returns a row vector with column products (product of all entries in a column)prodall_byname
: returns a numeric of the product of all entries in a matrixInitial version.