apply函数 对于向量,我们有sum、mean等函数对其进行计算。对于数组,如果我们想对其中一维(或若干维)进行某种计算,可以用apply函数。其一般形式为: apply(X, MARGIN, FUN, ...) 其中X为一个数组,MARGIN是固定哪些维不变,FUN是用来计算的函数。例如,设a是 矩阵,则apply(a, 1, sum)的意义是对a的各行求和(保留第一维即第一个下标不变),结果是一个长度为3的向量(与第一维长度相同),而apply(a, 2, sum)意义是对a的各列求和,结果是一个长度为4的向量(与第二维长度相同)。 如果函数FUN的结果是一个标量,MARGIN只有一个元素,则apply的结果是一个向量,其长度等于MARGIN指定维的长度,相当于固定MARGIN指定的那一维的每一个值而把其它维取出作为子数组或向量送入FUN中进行运算。如果MARGIN指定了多个维,则结果是一个维数向量等于dim(X)[MARGIN]的数组。如果函数FUN的结果是一个长度为N的向量,则结果是一个维数向量等于c(N, dim(X)[MARGIN])的数组,注意这时不论是对哪一维计算,结果都放在了第一维。所以,比如我们要把4×3矩阵a的3列分别排序,只要用apply(a, 2, sort),这样对每一列排序得到一个长度为4的向量,用第一维来引用,结果的维向量为c(N, dim(a)[2])=c(4,3) ,保留了列维,恰好得到所需结果,运行如下例: > a <- cbind(c(4,9,1), c(3,7,2)) > a [,1] [,2] [1,] 4 3 [2,] 9 7 [3,] 1 2 > apply(a, 2, sort) [,1] [,2] [1,] 1 2 [2,] 4 3 [3,] 9 7 > 但是,如果要对行排序,则apply(a, 1, sort)把a的每一行3个元素排序后的结果用第一维来引用,结果的维向量为c(N, dim(a)[1])=c(3, 4),把原来的列变成了行,所以t(apply(a,1,sort)) 才是对a的每一行排序的结果。如: > apply(a, 1, sort) [,1] [,2] [,3] [1,] 3 7 1 [2,] 4 9 2 > t(apply(a,1,sort)) [,1] [,2] [1,] 3 4 [2,] 7 9 [3,] 1 2 上面我们只用了矩阵(二维数组)作为例子讲解apply的用法。实际上,apply可以用于任意维数的数组,函数FUN也可以是任意可以接收一个向量或数组作为第一自变量的函数。比如,设x是一个维数向量为c(2,3,4,5)的数组,则apply(x, c(1,3), sum)可以产生一个2行4 列的矩阵,其每一元素是x中固定第1维和第3维下标取出子数组求和的结果。 |