R : apply函數(shù)族

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é)果的形式存在一定的差異,詳見下表。

apply函數(shù)族中的常用函數(shù)

下面分別介紹各個函數(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容