dplyr::summarise(),
where no more than one row can be returned per group.
There was an issue in the aggregation vignette
that required a change from dplyr::summarise() to dplyr::reframe().rename_via_pattern_byname()
enables row and column renaming via regular expressions
for single matrices, lists, and columns of a data frame.complete_and_sort().reallocate_byname()fractionize_byname() when
the matrix to be fractionized had only one row or column.fractionize_byname().equal_byname() by indicating the default
value of the .summarise argument.to_named_matrix(), which previously
errored when a matrix with any NA values was passed in the a argument.iszero_byname() when
a matrix has any NA elements:
the result is NA.reallocate_byname() to reallocate a
row or column proportionally to other rows or columns.to_triplet()
from "x" to "value".select_rows_cols_byname() includes margin argument
that de-references row and column types, as needed.to_triplet() and to_named_matrix()
convert between named matrix and triplet forms
(both integer triplet and character triplet)
of matrices
to assist some database operations
(which prefer integer triplet form).replaceNaN_byname()
where a Matrix::sparseMatrix would error when nothing
needed to be replaced.select_rows_byname() and select_cols_byname() now both
(a) have grep() arguments
ignore.case, perl, fixed, and useBytes, and
(b) pass those arguments to grep(),
enabling more flexible matching of row and column names.matricize_byname().
If the incoming matrix had NULL rowtype,
the coltype of the outgoing matrix was set to list().
The coltype of the outgoing matrix is now set to NULL, as expected.rowtype() and coltype() behavior
in matrixproduct_byname().column argument on vec_from_store_byname().matrix.class in many places.Matrix package (1.6-2).matsbyname::Matrix now vectorized for lists of matrix objects
in the data argument.vec_from_store_byname() now always returns a column vector.column argument of vec_from_store_byname()
in favor of a new margin argument, which is standard throughout R.vec_from_store_byname()
to verify operation when multiple rows in a match v.ncol_byname() to verify operation.matrix.class argument.
It will be removed soon.matrix.class argument to matrix_class.matrix.class --> matrix_class transition.
equal_byname() gains tol argument to control the
precision with which equality is decided.equal_byname() wasn't using equal_matrix_or_Matrix().
As a result, it was difficult to tell whether a matrix and a Matrix
were equal.aggregate_pieces_byname()
where failure occurred if there were
repeated row (or column) names not included
in the aggregation_map.Matrix objects,
thereby enabling use of sparse matrices.
Use matsbyname::Matrix() to create sparse matrices
if desired.create_matrix_byname() gains matrix.class argument
that tells whether the created object is of class
matrix or Matrix.
Default is "matrix".is.Matrix() assists with determining
whether an object is a Matrix.
The base functionis.matrix() assists with determining
whether an object is a matrix.sum_byname()) now works with
Matrix objects,
paving the way for sparse matrix representation
throughout matsbyname.testthat v3.dplyr
that caused one test to issue a deprecation warning.purrr::cross2().tidyselect.transpose_byname() no longer converts a constant
into a 1x1 matrix without row or column names.select_rowcol_piece_byname() enables
selecting rows and columns using the RCLabels notation and label pieces.svd_byname() calculates singular value decomposition
of a matrix.method on invert_byname()
allows callers to select the method for inverting a matrix.eigenvalues_byname() and
eigenvectors_byname() calculate
eigenvalues and eigenvectors of
matrices or lists of matrices.tol argument added to invert_byname().
The value of the tol argument is
passed to base::solve().invert_byname() now reports names of zero rows and columns
when attempting to invert a singular matrix.
The new error message will be a huge help for debugging.select_zero_rows_byname() and
select_zero_cols_byname()
assist with detecting problem areas for singular matrices.rowsums_byname(), colsums_byname(), and sumall_byname()
now correctly return only a single number when a single number
is the input.aggregate_byname() now returns its argument (a_mat)
if a string margin resolves to NA
(isn't a row of column type).... argument.aggregation-vignette now includes details on
using sum_byname(.summarise = TRUE)
with dplyr::summarise().sum_byname(), matrixproduct_byname(),
hadamardproduct_byname(),
mean_byname(), geometricmean_byname(),
equal_byname(), identical_byname(),
samestructure_byname(), and
and_byname() all gain argument .summarise
to signal intention to operate down a column
(.summarise = TRUE) or
along a list
(.summarise = FALSE).
The default value is .summarise = FALSE,
thereby maintaining previous behavior.agg_table_to_agg_map() and
agg_map_to_agg_table()
assist with manipulating aggregation maps.aggregation-vignette demonstrates
the new aggregation functions.rename_to_pref_suff_byname() and
aggregate_to_pref_suff_byname()
now route to new functions
rename_to_piece_byname() and
aggregate_pieces_byname(),
thereby avoiding code duplication.
This change may break some code.
These functions now return an empty string ("")
when a suffix is requested and one is not found.
Previously, these functions returned the entire
string when a suffix was not found.aggregate_pieces_byname()
brings the flexibility of the RCLabels
to matsbyname.notation.R
that have been moved to RCLabels.rename_to_piece_byname() will assist
with renaming and aggregating
according to pieces of row and column names.vec_from_store_byname()
creates vectors from a matrix
(from which row of column names are taken)
and a vector
(which acts as a store of values)
based on matching of pieces of the labels.
This new function is made possible by the
new RCLabels package.RCLabels.RCLabels::make_or_pattern() gains new pattern_type, "literal", which
returns the row_col_names argument unmodified.trim_rows_cols() gains a warn_if_a_incomplete argument.
When TRUE, a warning is issued if argument a is missing entries on margin
that are present in mat.RCLabels,
so the total number of tests
has gone down slightly.
preposition_notation(), from_notation(), and of_notation().NULL.trim_rows_cols() eliminates rows and/or columns
in one matrix based on another.hatize_byname() now allows a missing keep argument,
eliminating a regression in reverse dependency
with the matsindf package.hatize_byname() function is now simpler.
hatize_byname() is called with a keep argument that
is different from the structure of the vector.
This will be a safe way to encourage callers to specify their expectations
in the function call.hatize_byname() and hatinv_byname() gain a new
argument keep that tells whether to keep row names or column names
when a 1x1 matrix is supplied.
This feature assists with code that may occasionally encounter
1x1 vectors as input.keep_pref_suff() keeps prefixes or suffixes of individual strings
or lists of strings, based on the notation provided.split_pref_suff().
Previously, NULL was returned for a missing prefix or suffix.
Now, an empty string ("") is returned.split_pref_suff() works in a data frame.kvec_from_template_byname() that creates a row or column
vector from a template matrix.create_colvec_byname() builds on
create_matrix_byname().create_rowvec_byname() builds on
create_matrix_byname().create_matrix_byname() that behaves
much like matrix() with "byname" characteristics.https:// where appropriate.rename_to_pref_suff_byname()
where a column vector would fail with "subscript out of bounds" error.
The fix was to wrap the return list containing "pref" and "suff" in a list,
as the rest of the function expected,
when a single row was present.colsums_byname() and rowsums_byname()
where setting the rowname or colname argument to NULL
did not result in an empty row name or column name.hatize_byname() where a 1x1 vector
gave error:
length of 'dimnames' [1] not equal to array extent.
The solution is to check for 1x1 vectors and act accordingly.stringi.tol argument to clean_byname(), allowing for
machine precision issues to be addressed.rename_to_pref_suff_byname(),
aggregate_byname(), and
aggregate_to_pref_suff_byname()
respect notation when using notation to renaming
rows and columns.notation_vec(),
arrow_notation(),
paren_notation(),
bracket_notation(),
split_pref_suff(),
join_pref_suff(),
flip_pref_suff(),
switch_notation(), and
switch_notation_byname().README.md requiring
a nonempty <title> element.prep_vector_arg() to duplicate matrices when present as the vector_arg.sort_rows_cols().
Now telling which row or column names are duplicates.aggregate_pref_suff_byname() that combines
rename_to_pref_suff_byname() and
aggregate_byname().aggregate_byname() collapsed all rows or columns
into a single row or single column or both.aggregate_byname() which
aggregates rows, columns, or both, according to an aggregation_map.
I wanted to add this function for a long time, and I finally found a reason,
namely the need to aggregate by prefixes or suffixes in the IEATools package.
Furthermore, the aggregation_map idea seems to be solid.
Note that aggregation_map = NULL (the default) aggregates
rows with same names and columns with same names.rename_rowcol_to_pref_suff_byname() which
renames rows or columns to prefixes or suffixes in row and column names.clean_byname() which caused
a NULL response when unnamed rows or columns were present.prepare_.FUNdots() function in all *apply_byname() functions.unaryapply_byname() into function prepare_.FUNdots(),
so it can be used in other *apply_byname() functions.Added additional tests for bug fixes.
Fixed a bug in unaryapply_byname(),
which was not correctly handling a rectangular two-dimensional list of arguments to FUN supplied in .FUNdots.
A rectangular two-dimensional list of arguments in .FUNdots is now interpreted as follows:
FUN.a.The length of the first dimension of .FUNdots is the number of arguments supplied to FUN.
The length of the second dimension of .FUNdots must be equal to the length of a.
dplyr 1.0.0.
Several tests and examples in matsbyname needed a column of a data frame
constructed with I().
dplyr::group_by() now requires all groups to have same type,
but that wasn't true in some tests, as some entries were I<list>
(items in groups with more than one member)
and others were list
(items in single-item groups).
The solution was to modify two test to
(a) move from data.frame to tibble
when creating the data frames for testing and
(b) eliminate the use of I(), as
tibble is friendly to list columns.matricize_byname() that converts a column (or row) vector into a matrix.
matricize_byname() is the inverse of vectorize_byname().vectorize_byname that converts a matrix into a column vector.matsindf.
This section could be re-added now that matsindf is now on CRAN.matrix objects now inherit from both matrix and array.
Thus, code should no longer assume that class(A) returns an object of length 1 when A is a matrix.
So, I eliminated all instances of class(A) == "matrix" in if statements
in favor of inherits(A, "matrix").
See https://developer.r-project.org/Blog/public/2019/11/09/when-you-think-class.-think-again/index.html
for more details.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.New multicore functionality available in most *_byname 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.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)).Suggested usage
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.New *apply_byname functions enable API improvements
naryapply_byname: enables ... argumentsnaryapplylogical_byname: enables logical functions... arguments for functions that deserve them.New functions with ... arguments including
sum_bynamematrixproduct_bynameelementproduct_bynamemean_bynamegeometricmean_bynameequal_bynamesamestructure_bynameNew 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.