addmargins               package:stats               R Documentation

_P_u_t_s _A_r_b_i_t_r_a_r_y _M_a_r_g_i_n_s _o_n _M_u_l_t_i_d_i_m_e_n_s_i_o_n_a_l _T_a_b_l_e_s _o_r _A_r_r_a_y_s

_D_e_s_c_r_i_p_t_i_o_n:

     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.

_U_s_a_g_e:

       addmargins(A, margin = 1:length(dim(A)), FUN = sum, quiet = FALSE)

_A_r_g_u_m_e_n_t_s:

       A: table or array.  The function uses the presence of the
          '"dim"' and '"dimnames"' attributes of 'A'.

  margin: vector of dimensions over which to form margins.  Margins are
          formed in the order in which dimensions are specified in
          'margin'.

     FUN: list of the same length as '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.

   quiet: logical which suppresses the message telling the order in
          which the margins were computed.

_D_e_t_a_i_l_s:

     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 'FUN' list.

_V_a_l_u_e:

     A table or array with the same number of dimensions as 'A', but
     with extra levels of the dimensions mentioned in 'margin'.  The
     number of levels added to each dimension is the length of the
     entries in 'FUN'.  A message with the order of computation of
     margins is printed.

_A_u_t_h_o_r(_s):

     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.

_S_e_e _A_l_s_o:

     'table', 'ftable', 'margin.table'.

_E_x_a_m_p_l_e_s:

     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)

     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 = ".")

