% File src/library/stats/man/addmargins.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2009 R Core Team
% Distributed under GPL 2 or later

\name{addmargins}

\alias{addmargins}
\concept{totals}
\concept{margins}

\title{
  Puts Arbitrary Margins on Multidimensional Tables or Arrays
}

\description{
  For a given table one can specify which of the classifying factors to
  expand by one or more levels to hold margins to be calculated.  One may for
  example form sums and means over the first dimension and medians over the
  second.  The resulting table will then have two extra levels for the first
  dimension and one extra level for the second.  The default is to sum over
  all margins in the table.  Other possibilities may give results that
  depend on the order in which the margins are computed.  This is flagged
  in the printed output from the function.
}

\usage{
addmargins(A, margin = seq_along(dim(A)), FUN = sum, quiet = FALSE)
}

\arguments{
  \item{A}{table or array.  The function uses the presence of the
    \code{"dim"} and \code{"dimnames"} attributes of \code{A}.}
  \item{margin}{vector of dimensions over which to form margins.  Margins
    are formed in the order in which dimensions are specified in
    \code{margin}.}
  \item{FUN}{list of the same length as \code{margin}, each element of
    the list being either a function or a list of functions.  Names of
    the list elements will appear as levels in dimnames of the result.
    Unnamed list elements will have names constructed:  the name
    of a function or a constructed name based on the position in the table.}
  \item{quiet}{logical which suppresses the message telling the order in
    which the margins were computed.}
}

\details{
  If the functions used to form margins are not commutative the result
  depends on the order in which margins are computed.  Annotation
  of margins is done via naming the \code{FUN} list.
}

\value{
  A table or array with the same number of dimensions as \code{A}, but
  with extra levels of the dimensions mentioned in \code{margin}.  The
  number of levels added to each dimension is the length of the entries
  in \code{FUN}.  A message with the order of computation of margins is
  printed.
}
\author{
  Bendix Carstensen, Steno Diabetes Center & Department of
  Biostatistics, University of Copenhagen,
  \url{http://www.biostat.ku.dk/~bxc}, autumn 2003.
  Margin naming enhanced by Duncan Murdoch.
}

\seealso{
  \code{\link{table}}, \code{\link{ftable}}, \code{\link{margin.table}}.
}

\examples{
Aye <- sample(c("Yes", "Si", "Oui"), 177, replace = TRUE)
Bee <- sample(c("Hum", "Buzz"), 177, replace = TRUE)
Sea <- sample(c("White", "Black", "Red", "Dead"), 177, replace = TRUE)
(A <- table(Aye, Bee, Sea))
addmargins(A)
\dontshow{
stopifnot(is.table(addmargins(A)))
}
ftable(A)
ftable(addmargins(A))

# Non-commutative functions - note differences between resulting tables:
ftable(addmargins(A, c(1, 3),
       FUN = list(Sum = sum, list(Min = min, Max = max))))
ftable(addmargins(A, c(3, 1),
       FUN = list(list(Min = min, Max = max), Sum = sum)))

# Weird function needed to return the N when computing percentages
sqsm <- function(x) sum(x)^2/100
B <- table(Sea, Bee)
round(sweep(addmargins(B, 1, list(list(All = sum, N = sqsm))), 2,
            apply(B, 2, sum)/100, "/"), 1)
round(sweep(addmargins(B, 2, list(list(All = sum, N = sqsm))), 1,
            apply(B, 1, sum)/100, "/"), 1)

# A total over Bee requires formation of the Bee-margin first:
mB <-  addmargins(B, 2, FUN = list(list(Total = sum)))
round(ftable(sweep(addmargins(mB, 1, list(list(All = sum, N = sqsm))), 2,
                   apply(mB, 2, sum)/100, "/")), 1)

## Zero.Printing table+margins:
set.seed(1)
x <- sample( 1:7, 20, replace = TRUE)
y <- sample( 1:7, 20, replace = TRUE)
tx <- addmargins( table(x, y) )
print(tx, zero.print = ".")
}
\keyword{manip}
\keyword{array}
