R: Split Array/Matrix By Its Margins

asplit {base} | R Documentation

## Split Array/Matrix By Its Margins

### Description

Split an array or matrix by its margins.

### Usage

    asplit(x, MARGIN)

### Arguments

`x` | an array, including a matrix.
`MARGIN` | a vector giving the margins to split by. E.g., for a matrix `1` indicates rows, `2` indicates columns, `c(1, 2)` indicates rows and columns. Where `x` has named dimnames, it can be a character vector selecting dimension names.

### Details

The values of the splits can also be obtained (less efficiently) by `split(x, slice.index(x, MARGIN))`.

`apply` always simplifies common length results, so attempting to split via `apply(x, MARGIN, identity)` does not work (as it simply gives `x`). By chaining `asplit` with `lapply` or `vapply`, one can obtain variants of `apply` which do not auto-simplify.

### Value

A “list array” with dimension dv and each element an array of dimension de and dimnames preserved as available, where dv and de are, respectively, the dimensions of `x` included and not included in `MARGIN`.

### Examples

    ## A 3-dimensional array of dimension 2 x 3 x 4:
    d <- 2 : 4
    x <- array(seq_len(prod(d)), d)
    x
    ## Splitting by margin 2 gives a 1-d list array of length 3
    ## consisting of 2 x 4 arrays:
    asplit(x, 2)
    ## Spltting by margins 1 and 2 gives a 2 x 3 list array
    ## consisting of 1-d arrays of length 4:a
    asplit(x, c(1, 2))
    ## Compare to
    split(x, slice.index(x, c(1, 2)))

    ## A 2 x 3 matrix:
    (x <- matrix(1 : 6, 2, 3))
    ## To split x by its rows, one can use
    asplit(x, 1)
    ## or less efficiently
    split(x, slice.index(x, 1))
    split(x, row(x))

[Package base version 4.0.5 Index]