Learn R Programming

base (version 3.3)

rowsum: Give Column Sums of a Matrix or Data Frame, Based on a Grouping Variable

Description

Compute column sums across rows of a numeric matrix-like object for each level of a grouping variable. rowsum is generic, with a method for data frames and a default method for vectors and matrices.

Usage

rowsum(x, group, reorder = TRUE, ...)
"rowsum"(x, group, reorder = TRUE, na.rm = FALSE, ...)
"rowsum"(x, group, reorder = TRUE, na.rm = FALSE, ...)

Arguments

x
a matrix, data frame or vector of numeric data. Missing values are allowed. A numeric vector will be treated as a column vector.
group
a vector or factor giving the grouping, with one element per row of x. Missing values will be treated as another group and a warning will be given.
reorder
if TRUE, then the result will be in order of sort(unique(group)), if FALSE, it will be in the order that groups were encountered.
na.rm
logical (TRUE or FALSE). Should NA (including NaN) values be discarded?
...
other arguments to be passed to or from methods

Value

A matrix or data frame containing the sums. There will be one row per unique value of group.

Details

The default is to reorder the rows to agree with tapply as in the example below. Reordering should not add noticeably to the time except when there are very many distinct values of group and x has few columns.

The original function was written by Terry Therneau, but this is a new implementation using hashing that is much faster for large matrices.

To sum over all the rows of a matrix (ie, a single group) use colSums, which should be even faster.

For integer arguments, over/underflow in forming the sum results in NA.

See Also

tapply, aggregate, rowSums

Examples

Run this code
require(stats)

x <- matrix(runif(100), ncol = 5)
group <- sample(1:8, 20, TRUE)
(xsum <- rowsum(x, group))
## Slower versions
tapply(x, list(group[row(x)], col(x)), sum)
t(sapply(split(as.data.frame(x), group), colSums))
aggregate(x, list(group), sum)[-1]

Run the code above in your browser using DataLab