R:矩阵apply()函数

时间:2021-06-27 18:35:24


 

    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()这类函数会变得越来越重要。