Apply Functions to All Combinations of List Elements

Provides an extension to the 'purrr' family of mapping functions to apply a function to each combination of elements in a list of inputs. Also includes functions for automatically detecting output type in mapping functions, finding every combination of elements of lists or rows of data frames, and applying multiple models to multiple subsets of a dataset.


crossmap

crossmap statusbadge License:MIT R buildstatus CodeFactor

crossmap provides an extension to purrr’s family of mapping functions. xmap() works like purrr::pmap(), but applies a function to every combination of elements in a list of inputs.

crossmap also includes a few other general purpose and specialized functions for working with combinations of list elements.

Installation

You can install the released version of crossmap from CRAN with:

install.packages("crossmap")

or the development version from GitHub with:

# install.packages("pak")
pak::pkg_install("rossellhayes/crossmap")

Usage

While purrr::pmap() applies a function to list elements pairwise, xmap() applies a function to all combinations of elements.

pmap_chr(list(1:3, 1:3), ~ paste(.x, "*", .y, "=", .x * .y))
#> [1] "1 * 1 = 1" "2 * 2 = 4" "3 * 3 = 9"
xmap_chr(list(1:3, 1:3), ~ paste(.x, "*", .y, "=", .x * .y))
#> [1] "1 * 1 = 1" "2 * 1 = 2" "3 * 1 = 3" "1 * 2 = 2" "2 * 2 = 4" "3 * 2 = 6"
#> [7] "1 * 3 = 3" "2 * 3 = 6" "3 * 3 = 9"

xmap_mat() formats xmap() results into a matrix.

xmap_mat(list(1:3, 1:6), prod)
#>   1 2 3  4  5  6
#> 1 1 2 3  4  5  6
#> 2 2 4 6  8 10 12
#> 3 3 6 9 12 15 18

crossmap also integrates with furrr to offer parallelized versions of the xmap() functions.

future::plan("multisession")
future_xmap_chr(list(1:3, 1:3), ~ paste(.x, "*", .y, "=", .x * .y))
#> [1] "1 * 1 = 1" "2 * 1 = 2" "3 * 1 = 3" "1 * 2 = 2" "2 * 2 = 4" "3 * 2 = 6"
#> [7] "1 * 3 = 3" "2 * 3 = 6" "3 * 3 = 9"

cross_fit() is an easy wrapper for an important use of crossmap, crossing model specifications with different formulas, subsets, and weights.

cross_fit(
  mtcars,
  formulas = list(hp = mpg ~ hp, drat = mpg ~ drat),
  cols     = c(cyl, vs),
  weights  = c(wt, NA)
)
#> # A tibble: 40 × 21
#>    model weights   cyl    vs term      estimate  std.error  statistic    p.value
#>    <chr> <chr>   <dbl> <dbl> <chr>        <dbl>      <dbl>      <dbl>      <dbl>
#>  1 hp    NA          4     0 (Interce…  26      NaN        NaN        NaN       
#>  2 hp    NA          4     0 hp         NA       NA         NA         NA       
#>  3 hp    NA          4     1 (Interce…  36.0      5.52e+ 0   6.52e+ 0   1.85e- 4
#>  4 hp    NA          4     1 hp         -0.113    6.55e- 2  -1.73e+ 0   1.21e- 1
#>  5 hp    NA          6     0 (Interce…  23.2      1.98e-14   1.17e+15   5.43e-16
#>  6 hp    NA          6     0 hp         -0.0200   1.46e-16  -1.37e+14   4.66e-15
#>  7 hp    NA          6     1 (Interce…  24.2      1.41e+ 1   1.72e+ 0   2.28e- 1
#>  8 hp    NA          6     1 hp         -0.0440   1.22e- 1  -3.61e- 1   7.52e- 1
#>  9 hp    NA          8     0 (Interce…  18.1      2.99e+ 0   6.05e+ 0   5.74e- 5
#> 10 hp    NA          8     0 hp         -0.0142   1.39e- 2  -1.02e+ 0   3.26e- 1
#> # ℹ 30 more rows
#> # ℹ 12 more variables: r.squared <dbl>, adj.r.squared <dbl>, sigma <dbl>,
#> #   model.statistic <dbl>, model.p.value <dbl>, df <dbl>, logLik <dbl>,
#> #   AIC <dbl>, BIC <dbl>, deviance <dbl>, df.residual <int>, nobs <int>

cross_list() finds all combinations of elements from a set of lists.

cross_list(number = 1:3, letter = letters[1:3])
#> $number
#> [1] 1 2 3 1 2 3 1 2 3
#> 
#> $letter
#> [1] "a" "a" "a" "b" "b" "b" "c" "c" "c"
cross_tbl(number = 1:3, letter = letters[1:3])
#> # A tibble: 9 × 2
#>   number letter
#>    <int> <chr> 
#> 1      1 a     
#> 2      2 a     
#> 3      3 a     
#> 4      1 b     
#> 5      2 b     
#> 6      3 b     
#> 7      1 c     
#> 8      2 c     
#> 9      3 c

And cross_join() finds all combinations of the rows of data frames.

cross_join(
  tibble(
    color = c("red", "yellow", "orange"),
    fruit = c("apple", "banana", "cantaloupe")
  ),
  tibble(dessert = c("cupcake", "muffin", "streudel"), makes = c(8, 6, 1))
)
#> # A tibble: 9 × 4
#>   color  fruit      dessert  makes
#>   <chr>  <chr>      <chr>    <dbl>
#> 1 red    apple      cupcake      8
#> 2 red    apple      muffin       6
#> 3 red    apple      streudel     1
#> 4 yellow banana     cupcake      8
#> 5 yellow banana     muffin       6
#> 6 yellow banana     streudel     1
#> 7 orange cantaloupe cupcake      8
#> 8 orange cantaloupe muffin       6
#> 9 orange cantaloupe streudel     1

map_vec() and variants automatically determine output types. This means you don’t have to worry about adding _int(), _dbl() or _chr().

map_vec(sample(5), ~ . ^ 2)
#> [1] 25  9  4  1 16
map_vec(c("apple", "banana", "cantaloupe"), paste0, "s")
#> [1] "apples"      "bananas"     "cantaloupes"

Hex sticker font is Source Sans by Adobe.

Please note that crossmap is released with a Contributor Code of Conduct.

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.

install.packages("crossmap")

0.5.0 by Alexander Rossell Hayes, 9 months ago


https://pkg.rossellhayes.com/crossmap/, https://github.com/rossellhayes/crossmap


Report a bug at https://github.com/rossellhayes/crossmap/issues


Browse source code at https://github.com/cran/crossmap


Authors: Alexander Rossell Hayes [aut, cre, cph] (ORCID:


Documentation:   PDF Manual  


MIT + file LICENSE license


Imports backports, cli, dplyr, generics, lifecycle, parallelly, purrr, rlang, stats, utils, vctrs

Suggests broom, covr, crayon, estimatr, furrr, future, testthat, tibble, withr


Suggested by futurize, progressify.


See at CRAN