apply()函数允许用户在矩阵的各行或各列上调用指定的函数。apply()函数的一般形式为:apply( m, dimcode, f, fargs ),参数解释如下:
•m 是一个矩阵。
•dimcode 是维度编号,若取值为1代表对每一行应用函数,若取值为2代表对每一列应用函数。
•f是应用在行或列上的函数。
•fargs是f的可选参数集。
例如,对于矩阵应用该函数:
> z <- matrix( c( 1, 2, 3, 4, 5, 6 ), nrow=3 )
> apply( z, 2, mean )
[1] 2 5
注:本例也可以使用colMeans()函数直接实现。
apply()里也可以使用用户自己定义的函数,就和使用R内部函数一样。
> f <- function( x ) x / c( 2, 8 )
> apply( z, 1, f )
[,1] [,2] [,3]
[1,] 0.5 1.000 1.50
[2,] 0.5 0.625 0.75
f()函数把一个向量除以(2,8)。(如果向量x的长度大于2,那么(2,8)就会循环补齐)。apply()函数则对z的每一行分别调用f()。z的第一行是(1,4),所以在调用f()时,形式参数x对应的实际参数是(1,4)。然后R计算(1,4)/(2,8)的值,这在R中是向量对应元素运算,得到(0.5,0.5)。对其他两行的计算与此类似。
所得结果y是一个2h 3的矩阵而非3h 2的。第一行的计算结果(0.5, 0.5)构成apply()函数输出结果的第一列,而不是第一行。这就是apply()函数的默认方式。如果所调用的函数返回的是一个包含k个元素的向量,那么apply()的结果就有k行。如果需要的话,可以使用转置函数t(),例如:
> t( apply( z, 1, f ) )
[,1] [,2]
[1,] 0.5 0.500
[2,] 1.0 0.625
[3,] 1.5 0.750
如果所调用的函数只返回一个标量(即单元素向量),那么apply()的结果就是一个向量,而非矩阵。
在用apply()时,待调用的函数至少需要一个参数。上例中,f()的形式参数在这里对应的实际参数就是矩阵的一行(或一列)。有时,待调用函数需要多个参数,用apply()调用这类函数时,需要把这些额外的参数列举在函数名字后面,用逗号隔开。
使用apply()函数并不像很多人以为的那样,能使程序的运行速度加快。其优点是使程序更紧凑,更易于阅读和修改,并且避免产生使用循环语句时可能带来的bug。此外,并行运算是R目前发展的方向之一,apply()这类函数会变得越来越重要。