rowSums
rowMeans
colSums
colMeans
在R中很容易计算一个矩阵的各行和和各列和以及各行的平均值和各列的平均值。例如:
> A=matrix(1:12,3,4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> rowSums(A)
[1] 22 26 30
> rowMeans(A)
[1] 5.5 6.5 7.5
> colSums(A)
[1] 6 15 24 33
> colMeans(A)
[1] 2 5 8 11
除此之外, 使用apply函数, 也可以计算. 而且更灵活.
> args(apply)
function (X, MARGIN, FUN, ...)
其中:x为矩阵,MARGIN用来指定是对行运算还是对列运算,MARGIN=1表示对行运算,MARGIN=2表示对列运算,FUN用来指定运算函数, ...用来给定FUN中需要的其它的参数,例如:
计算每行的sum.
> apply(A,1,sum)
[1] 22 26 30
计算每行的数学期望.
> apply(A,1,mean)
[1] 5.5 6.5 7.5
计算每列的sum.
> apply(A,2,sum)
[1] 6 15 24 33
计算每列的数学期望.
> apply(A,2,mean)
[1] 2 5 8 11
apply()函数功能强大,我们可以对矩阵的行或者列进行其它运算,例如:
计算每一列的方差(var函数求方差)
> A=matrix(rnorm(100),20,5)
> apply(A,2,var)
[1] 0.4641787 1.4331070 0.3186012 1.3042711 0.5238485
还可以使用类似lambda风格.
> apply(A,2, function(x,a) x*a,a=2)
[,1] [,2] [,3] [,4]
[1,] 2 8 14 20
[2,] 4 10 16 22
[3,] 6 12 18 24
注意:apply(A,2,function(x,a)x*a,a=2)与A*2效果相同,此处旨在说明如何应用alpply函数。
[参考]
1. > help("apply")
apply package:base R Documentation
Apply Functions Over Array Margins
Description:
Returns a vector or array or list of values obtained by applying a
function to margins of an array or matrix.
Usage:
apply(X, MARGIN, FUN, ...)
Arguments:
X: an array, including a matrix.
MARGIN: a vector giving the subscripts which the function will be
applied over. E.g., for a matrix ‘1’ indicates rows, ‘2’
indicates columns, ‘c(1, 2)’ indicates rows and columns.
Where ‘X’ has named dimnames, it can be a character vector
selecting dimension names.
FUN: the function to be applied: see ‘Details’. In the case of
functions like ‘+’, ‘%*%’, etc., the function name must be
backquoted or quoted.
...: optional arguments to ‘FUN’.
Details:
If ‘X’ is not an array but an object of a class with a non-null
‘dim’ value (such as a data frame), ‘apply’ attempts to coerce it
to an array via ‘as.matrix’ if it is two-dimensional (e.g., a data
frame) or via ‘as.array’.
‘FUN’ is found by a call to ‘match.fun’ and typically is either a
function or a symbol (e.g., a backquoted name) or a character
string specifying a function to be searched for from the
environment of the call to ‘apply’.
Arguments in ‘...’ cannot have the same name as any of the other
arguments, and care may be needed to avoid partial matching to
‘MARGIN’ or ‘FUN’. In general-purpose code it is good practice to
name the first three arguments if ‘...’ is passed through: this
both avoids partial matching to ‘MARGIN’ or ‘FUN’ and ensures that
a sensible error message is given if arguments named ‘X’, ‘MARGIN’
or ‘FUN’ are passed through ‘...’.
Value:
If each call to ‘FUN’ returns a vector of length ‘n’, then ‘apply’
returns an array of dimension ‘c(n, dim(X)[MARGIN])’ if ‘n > 1’.
If ‘n’ equals ‘1’, ‘apply’ returns a vector if ‘MARGIN’ has length
1 and an array of dimension ‘dim(X)[MARGIN]’ otherwise. If ‘n’ is
‘0’, the result has length 0 but not necessarily the ‘correct’
dimension.
If the calls to ‘FUN’ return vectors of different lengths, ‘apply’
returns a list of length ‘prod(dim(X)[MARGIN])’ with ‘dim’ set to
‘MARGIN’ if this has length greater than one.
In all cases the result is coerced by ‘as.vector’ to one of the
basic vector types before the dimensions are set, so that (for
example) factor results will be coerced to a character array.
References:
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) _The New S
Language_. Wadsworth & *s/Cole.
See Also:
‘lapply’ and there, ‘simplify2array’; ‘tapply’, and convenience
functions ‘sweep’ and ‘aggregate’.
Examples:
## Compute row and column sums for a matrix:
x <- cbind(x1 = 3, x2 = c(4:1, 2:5))
dimnames(x)[[1]] <- letters[1:8]
apply(x, 2, mean, trim = .2)
col.sums <- apply(x, 2, sum)
row.sums <- apply(x, 1, sum)
rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums)))
stopifnot( apply(x, 2, is.vector))
## Sort the columns of a matrix
apply(x, 2, sort)
##- function with extra args:
cave <- function(x, c1, c2) c(mean(x[c1]), mean(x[c2]))
apply(x, 1, cave, c1 = "x1", c2 = c("x1","x2"))
ma <- matrix(c(1:4, 1, 6:8), nrow = 2)
ma
apply(ma, 1, table) #--> a list of length 2
apply(ma, 1, stats::quantile) # 5 x n matrix with rownames
stopifnot(dim(ma) == dim(apply(ma, 1:2, sum)))
## Example with different lengths for each call
z <- array(1:24, dim = 2:4)
zseq <- apply(z, 1:2, function(x) seq_len(max(x)))
zseq ## a 2 x 3 matrix
typeof(zseq) ## list
dim(zseq) ## 2 3
zseq[1,]
apply(z, 3, function(x) seq_len(max(x)))
# a list without a dim attribute