apply 函數(shù)的主要優(yōu)點是我們可以擺脫循環(huán)操作蘸际。
r 中的應(yīng)用族包含 apply()、lapply()、sapply()衩辟、mapply() 和 tapply()。
最大的問題之一是如何以及何時使用這些功能波附?
答案很簡單艺晴,這取決于數(shù)據(jù)集的結(jié)構(gòu)以及您想要的結(jié)果。
下面我們來一一看看如何執(zhí)行這些功能掸屡。
1. apply()
mymatrix<-matrix(1:9,nrow=3)
mymatrix
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
#Let’s calculate the row sum.
apply(mymatrix,1,sum)
[1] 12 15 18
#Let’s calculate the column sum
apply(mymatrix,2,sum)
[1] 6 15 24
#Let’s create NA value in the matrix and see how we can execute the function.
mymatrix[2,3]<-NA
apply(mymatrix,1,sum)
[1] 12 NA 18
#Insert na.rm function in the above code and see the result.
apply(mymatrix,1,sum,na.rm=TRUE)
[1] 12 7 18
2. lapply()
lapply 返回一個與 X 長度相同的列表封寞,其中的每個元素都是將 FUN 應(yīng)用于 X 的對應(yīng)元素的結(jié)果。
mylist<-list(A=matrix(1:9,nrow=3),B=1:5,C=8)
mylist
$A
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
$B
[1] 1 2 3 4 5
$C
[1] 8
#Let’s calculate the sum of each list.
lapply(mylist,sum)
$A
[1] 45
$B
[1] 15
$C
[1] 8
你可以看到結(jié)果是以列表形式保存的仅财。假設(shè)你想得到矢量的結(jié)果狈究,只需取消列表即可。
unlist(lapply(mylist,sum))
您可以創(chuàng)建自己的函數(shù)并傳入該函數(shù)满着。
例如谦炒,假設(shè)您想將每個元素與值 20 相乘贯莺,只需使用以下代碼。
lapply(mylist,function(x) x*20)
3. sapply()
sapply 是 lapply 的用戶友好版本和包裝器宁改,默認(rèn)返回一個向量缕探、矩陣,如果 simplify = "array"还蹲,則通過應(yīng)用 simplify2array() 返回一個數(shù)組爹耗。sapply(x, f, simplify = FALSE, USE.NAMES = FALSE) 與 lapply(x, f) 相同。
sapply(mylist,sum)
A B C
45 15 8
4. mapply()
m 代表多變量應(yīng)用谜喊。
讓我們舉個例子潭兽,假設(shè)我們有四次重復(fù)值 1,我們想要在 4 次重復(fù) 1斗遏,在 3 次重復(fù) 2山卦,在 2 次重復(fù) 3,在 1 次重復(fù) 4诵次。
mapply(rep,1:4,4:1)
[[1]]
[1] 1 1 1 1
[[2]]
[1] 2 2 2
[[3]]
[1] 3 3
[[4]]
[1] 4
讓我們創(chuàng)建一個用戶定義的函數(shù)账蓉,看看 mapply 將如何執(zhí)行。
假設(shè)我們有兩個向量 x 和 y逾一。
x<-c(A=20,B=1,C=40)
y<-c(J=430,K=50,L=10)
想象一下铸本,如果您要將這兩個向量相加并乘以 2。首先遵堵,創(chuàng)建函數(shù)并將其傳遞給 mapply箱玷。
simply<-function(u,v){
(u+v)*2
}
mapply(simply,x,y)
A B C
900 102 100
- tapply()
tapply(iris$Sepal.Length,iris$Species,max)
setosa versicolor virginica
5.8 7.0 7.9
apply:- 在一個數(shù)組的邊上應(yīng)用函數(shù)。
lapply:- 在一個列表上循環(huán)陌宿,在每個元素上評估一個函數(shù)
sapply:- 與 lapply 相同锡足,但嘗試簡單的結(jié)果。
mapply:- lapply的多變量版本
tapply:- 在一個向量的子集上應(yīng)用一個函數(shù)限番。