apply函數(shù)族
R函數(shù)的諸多有趣特性之一,就是它們可以應用到一系列的數(shù)據(jù)對象上,包括標量、向量、矩陣、數(shù)組、數(shù)據(jù)框和列表。將函數(shù)應用于不同的數(shù)據(jù)對象,主要是借助apply函數(shù)族來實現(xiàn)的,該函數(shù)族內(nèi)的函數(shù)有apply()、lapply()等多個函數(shù),各個函數(shù)的功能相似,需要注意的是,各函數(shù)的使用對象和返回結(jié)果的形式存在一定的差異,詳見下表。

下面分別介紹各個函數(shù)的使用。
(1)apply()
·功能:對數(shù)組或者矩陣的一個維度使用函數(shù)生成列表或者數(shù)組、向量。
·使用格式:
apply(x,MARGIN,FUN,…)
其中,x為數(shù)據(jù)對象,可以是矩陣、數(shù)組或者數(shù)據(jù)框,MARGIN=1表示矩陣行,2表示矩陣列,也可以是c(1,2),F(xiàn)UN表示使用的函數(shù)。
·實例:計算矩陣x各行各列的均值。
使用apply函數(shù)計算矩陣的均值
>x<-matrix(1:20,ncol=4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> apply(x,1,mean) #計算各行的均值
[1] 8.5 9.5 10.5 11.5 12.5
> apply(x,2,mean) #計算各列的均值
[1] 3 8 13 18
(2)lapply()
·功能:對x的每一個元素運用函數(shù),生成一個與元素個數(shù)相同的值列表。
·使用格式:
lapply(x,FUN,…)
其中,x為數(shù)據(jù)對象,可以是列表、數(shù)據(jù)框或者向量,F(xiàn)UN表示使用的函數(shù)。
·實例:對列表x的每一個元素計算均值。
使用lapply函數(shù)計算各子列表的均值
> x <- list(a = 1:5, b = exp(0:3))
> x
$a
[1] 1 2 3 4 5
$b
[1] 1.000000 2.718282 7.389056 20.085537
> lapply(x,mean) #對列表x的每一個元素計算均值
$a
[1] 3
$b
[1] 7.798219
(3)sapply()
·功能:通過對x的每一個元素運用函數(shù),生成一個與元素個數(shù)相同的值列表或矩陣。
·使用格式:
sapply(x,FUN,…,simplify=TRUE, USE.NAMES = TRUE)
sapply函數(shù)比lapply函數(shù)多了一個simplify參數(shù)。如果simplify=FALSE,則等價于lapply,否則將lapply輸出的list簡化為vector或matrix。
·實例:列表list中的元素與數(shù)字1~3連接,并以矩陣和列表兩種形式輸出。
使用sapply函數(shù)處理列表的字符串連接
> list=list(c("a", "b", "c"),c("A", "B", "C"))
> list
[[1]]
[1] "a" "b" "c"
[[2]]
[1] "A" "B" "C"
列表list中的元素與數(shù)字1~3連接,輸出結(jié)果為矩陣
> sapply(list, paste,1:3, simplify=TRUE)
[,1] [,2]
[1,] "a 1" "A 1"
[2,] "b 2" "B 2"
[3,] "c 3" "C 3"
#列表list中的元素與數(shù)字1~3連接,輸出結(jié)果為列表
> sapply(list, paste,1:3 ,simplify=F)
[[1]]
[1] "a 1" "b 2" "c 3"
[[2]]
[1] "A 1" "B 2" "C 3"
(4)tapply()
·功能:對不規(guī)則陣列使用向量,即對一組非空值按照一組確定因子進行相應計算。
·使用格式:
tapply(x, INDEX, FUN, …, simplify = TRUE)
其中,x通常是一個向量。INDEX是因子列表,和x長度一樣。simplify是邏輯變量,若取值為TRUE(默認值),且函數(shù)FUN的計算結(jié)果總是為一個標量值,那么函數(shù)tapply返回一個數(shù)組;若取值為FALSE,則函數(shù)tapply的返回值為一個list對象。需要注意的是,當?shù)诙€參數(shù)INDEX不是因子時,函數(shù)tapply()同樣有效,因為必要時,R會用as.factor()把參數(shù)強制轉(zhuǎn)換成因子。
·實例:計算不同sex對應的height的均值。
使用tapply函數(shù)進行分組統(tǒng)計
> height <- c(174, 165, 180, 171, 160)
> sex<-c("F","F","M","F","M")
> tapply(height, sex, mean) #計算不同sex對應的height的均值
F M
170 170
(5)mapply()
mapply()函數(shù)是sapply的多變量版本。將對多個變量的每個參數(shù)運行FUN函數(shù),如有必要,參數(shù)將被循環(huán)。
·使用格式:
mapply(FUN,…,MoreArgs=NULL,SIMPLIFY=TRUE,USE.NAMES=TRUE)
其中,MoreArgs為FUN函數(shù)的其他參數(shù)列表。SIMPLIFY是邏輯或者字符串,取值為TRUE時,將結(jié)果轉(zhuǎn)換為一個向量、矩陣或者更高維陣列,但不是所有結(jié)果都能夠轉(zhuǎn)換。
·實例:使用mapply函數(shù)重復生成列表list(x=1:2))。
使用mapply函數(shù)重復生成列表
#重復生成列表list(x = 1:2)),重復次數(shù)times=1:3,結(jié)果為一個列表
> mapply(rep, times = 1:3, MoreArgs = list(x = 1:2))
[[1]]
[1] 1 2
[[2]]
[1] 1 2 1 2
[[3]]
[1] 1 2 1 2 1 2
#重復生成列表list(x = 1:2)),重復次數(shù)times=c(2,2),結(jié)果為一個矩陣
> mapply(rep, times = c(2,2), MoreArgs = list(x = 1:2))
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 1 1
[4,] 2 2