Learn R Programming

pracma (version 0.9.6)

accumarray: Accumulate Vector Elements

Description

accumarray groups elements from a data set and applies a function to each group.

Usage

accumarray(is, a, func = sum)

uniq(a, first = FALSE)

Arguments

is
positive integers, used as indices for the result vector.
a
numerical vector.
func
function to be applied to a (sub)vector of numbers.
first
logical, shall the first or last element encountered be used.

Value

  • accumarray returns a vector of length the maximum in is.

    uniq returns a list with components

  • $bvector of unique elements of a.
  • $mvector of indices such that b = a[m]
  • $nvector of indices such that a = b[n]

Details

A <- accumarray(is, a) creates a vector A by accumulating elements of the vector a using the elements of is as indices.

The position of an element in is determines which value of is it selects for the accumulated vector. This works like a factor in core R. The value of an element in is determines the position of the accumulated vector in the output.

A = uniq(a) returns a vector b identical to unique(a) and two other vectors of indices m and n such that b == a[m] and a == b[n].

See Also

unique

Examples

Run this code
a  <- 101:105
is <- c(1, 2, 4, 2, 4)
A <- accumarray(is, a)          # 101 206   0 208

a <- c(1, 1, 5, 6, 2, 3, 3, 9, 8, 6, 2, 4)
A <- uniq(a)
# A$b  1  5  6  2  3  9  8  4
# A$m  2  3 10 11  7  8  9 12
# A$n  1  1  2  3  4  5  5  6  7  3  4  8
A <- uniq(a, first = TRUE)
# A$m  1  3  4  5  6  8  9 12

##  Example: Subset sum problem
# Distribution of unique sums among all combinations of a vectors.
allsums <- function(a) {
    S <- c(); C <- c()
    for (k in 1:length(a)) {
        U <- uniq(c(S, a[k], S + a[k]))
        S <- U$b
        C <- accumarray(U$n, c(C, 1, C))
    }
    o <- order(S); S <- S[o]; C <- C[o]
    return(list(S = S, C = C))
}
A <- allsums(seq(1, 9, by=2))
# A$S  1  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 25
# A$C  1  1  1  1  1  1  2  2  2  1  2  2  1  2  2  2  1  1  1  1  1  1  1

Run the code above in your browser using DataLab