在R語言的幫助文檔里,apply函數的功能是:
Retruns a vector or array or list of values obtained by applying a function to margins of an array or matrix.
就是說apply把一個function作用到array或者matrix的margins(可以理解為數組的每一行或者每一列)中,返回值時vector、array、list。
簡單的說,apply函數經常用來計算矩陣中行或列的均值、和值的函數,具體方法如下:
定義一個3×2的矩陣:
rname = c("one","two","three") cname = c("first","second") b <- matrix(1:6,nrow=3, dimnames = list(rname, cname))
b為:
first second one 1 4 two 2 5 three 3 6
繼續舉幾個例子:
apply(b,1,sum)
上面的指令代表對矩陣b進行行計算,分別對每一行進行求和。函數涉及了三個參數:
第一個參數是指要參與計算的矩陣;
第二個參數是指按行計算還是按列計算,1——表示按行計算,2——按列計算;
第三個參數是指具體的運算參數。
上述指令的返回結果為:
one two three 5 7 9
值得注意的是,apply函數時可以針對數組進行計算你的,就是說數組未必是2維的!!
舉一個3維的情況:
首先頂一個三維數組:
x=array(1:24,c(2,3,4))
三維數組為:
, , 1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 , , 2 [,1] [,2] [,3] [1,] 7 9 11 [2,] 8 10 12 , , 3 [,1] [,2] [,3] [1,] 13 15 17 [2,] 14 16 18 , , 4 [,1] [,2] [,3] [1,] 19 21 23 [2,] 20 22 24
使用如下指令:
apply(x,1,sum)
則對1到23的所有奇數進行求和,結果為:
[1] 144 156
同樣,第二個參數改成2后,
apply(x,2,sum)
結果為:
[1] 84 100 116
是按照第二個維度進行的求和計算。
第二個參數改成3后,
apply(x,3,sum)
結果為:
[1] 21 57 93 129
即對第三個維度進行求和計算。
對於apply()函數的第三個參數,制定了具體用什么函數進行計算,之前例子里使用的都是sum,對於用戶自定義的函數同樣可以在這里使用。還用前面的矩陣b來舉例。
定義了一個求平方和的函數:
myfun <- function(x){ sum(x^2) }
如果選擇按行計算平方和,可使用如下指令:
apply(b,1,myfun)
計算結果為:
one two three 17 29 45
通常情況大家使用apply之后是需要把apply的返回值作為輸入在其他代碼中使用的,這里尤其重要的一點是apply的返回值的維度。上面的例子就算每一行或者每一列的sum,使用apply之后,返回都是一個向量,並不會因為apply計算行(列)的sum就會自動返回一個列(行)向量。