rowsum                 package:base                 R Documentation

Give column sums of a matrix or data frame, based on a grouping variable

Description:

     Compute column sums across rows of a 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, ...)

     ## S3 method for class 'data.frame':
     rowsum(x, group, reorder = TRUE, na.rm = FALSE, ...)

     ## Default S3 method:
     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' values be
          discarded?

     ...: other arguments to be passed to or from methods

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.

Value:

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

See Also:

     'tapply', 'aggregate', 'rowSums'

Examples:

     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]

