1. 程式人生 > >R語言中apply函式家族

R語言中apply函式家族

apply

簡單說明:對陣列或者矩陣的一個維度使用函式生成值得到列表或者陣列、向量。

語法規則:
apply(X, MARGIN, FUN, ...)

簡單釋義:
X:陣列,包括矩陣
MARGIN:1表示矩陣行,2表示矩陣列,也可以是c(1,2)
FUN:自定義函式

示例:

#構建4*5的矩陣,按行排列
mat<-matrix(data = 1:20,nrow = 4,byrow = T)
#計算矩陣每列的均值
apply(X = mat,MARGIN = 1,FUN = mean)

結果:

[1]  3  8 13 18

lapply

簡單說明:通過對x的每一個元素運用函式,生成一個與元素個數相同的值列表。

語法規則:
lapply(X, FUN, ...)

簡單釋義:
X:表示一個向量或者表示式物件,其餘物件將被通過as.list強制轉換為list

示例:

x<-list(a=1:20,b=exp(-3:3),c=c(T,T,F,F,T))
#獲取列表中每個元素的長度
lapply(x,FUN = length)

結果:

$a
[1] 20
$b
[1] 7
$c
[1] 5

sapply

簡單說明:使用者友好版本,是lapply函式的包裝版,該函式返回結果是向量或者矩陣,如果simplify=“array”,且合適的情況下,將會通過simplify2array()函式轉換為陣列。

語法規則:
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES =TRUE)

簡單釋義:
X:向量或者表示式物件,其餘物件將會通過as.list強制轉換為list
simplify:邏輯值或者字串,預設值為TRUE,若合適將返回一個向量或者矩陣,如果simply="array",結果將返回一個陣列。USE.NAMES為邏輯值,如果為TRUE,且x沒有被命名,則對x進行命名。

示例:

#檢視iris資料集的模式和類
sapply(iris,mode)
sapply(iris,class)
#命名
k<-c('a','b','c')
sapply(k,FUN
= paste,simplify = F,USE.NAMES = F,1:5)

結果:

> sapply(iris,mode)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
   "numeric"    "numeric"    "numeric"    "numeric"    "numeric" 
> sapply(iris,class)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
   "numeric"    "numeric"    "numeric"    "numeric"     "factor" 
> k<-c('a','b','c')
> sapply(k,FUN = paste,simplify = F,USE.NAMES = F,1:5)
[[1]]
[1] "a 1" "a 2" "a 3" "a 4" "a 5"
[[2]]
[1] "b 1" "b 2" "b 3" "b 4" "b 5"
[[3]]
[1] "c 1" "c 2" "c 3" "c 4" "c 5"

vapply

簡單說明:和sapply函式類似,但是返回值有預定義型別,使用起來更加安全。

語法規則:
vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

簡單釋義:
X:向量或者表示式物件,其餘物件將被通過as.list強制轉換為list
FUN.VALUE:一個通用型向量,FUN函式返回值的模板
simplify:邏輯值或者字串,結果應該被簡化為向量、矩陣或者高維陣列。必須是命名的,不能是簡寫。預設值是TRUE,若合適將會返回一個向量或者矩陣。如果simplify="array",結果將返回一個陣列。
USE.NAMES:邏輯值,如果為TRUE,且x沒有被命名,則對x進行命名。

示例:

#構建資料框
dat<-data.frame(a=rnorm(100,1,2),b=rnorm(100,1,1),c=rnorm((100,1,3)))
#計算資料框中每個向量的均值
vapply(dat,mean,FUN.VALUE = c(mean=0))
#自定義函式計算均值和標準差
FUN<-function(x){
  list(mean(x),sd(x))
}
vapply(dat,FUN,FUN.VALUE = list(mean=0,sd=0))

結果:

> dat<-data.frame(a=rnorm(100,1,2),b=rnorm(100,1,1),c=rnorm(100,1,3))
> vapply(dat,mean,FUN.VALUE = c(mean=0))
        a         b         c 
0.8872571 1.0363621 0.9981886 
> 
> FUN<-function(x){
+   list(mean(x),sd(x))
+ }
> vapply(dat,FUN,FUN.VALUE = list(mean=0,sd=0))
     a         b         c        
mean 0.8872571 1.036362  0.9981886
sd   1.900742  0.8051695 3.141448 

tapply

簡單說明:對不規則陣列使用向量,即對一組非空值按照一組確定因子進行相應計算。

語法規則:
tapply(X, INDEX, FUN, ..., simplify = TRUE)

簡單釋義:
x:是一個向量
INDEX:因子列表,和x長度一樣,元素將被通過as.factor強制轉換為因子

示例:

age<-c(60,54,86,47,58,86)
sex<-c("M","M","F","M","M","F")
tapply(age, sex,FUN = mean)

結果:

    F     M 
86.00 54.75 

mapply

簡單說明:是sapply的多變數版本。將對…中的每個引數執行FUN函式,如有必要,引數將被迴圈。該函式的第一個引數為指定的函式,第二個引數為指定函式的引數。

語法規則:
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)

簡單釋義:
MoreArgs:FUN函式的其他引數列表
SIMPLIFY:邏輯或者字串,可以減少結果成為一個向量、矩陣或者更高維陣列
USE.NAMES:邏輯值,如果第一個引數...已被命名,將使用這個字元向量作為名字

示例:

#針對1 2 3 4分別重複4 3 2 1次
mapply(FUN = rep,1:4,4:1)

#尋找字串中字母和數值緊密相連的字元並擷取
char<-c("d12jsfl","df13djklf","sd5jglkjg","djf2dlk")
result<-gregexpr(pattern = '[a-z][0-9]',char)
fun<-function(x,y){
  substring(x,y,y+attr(y,'match.length')-1)
}
mapply(fun,char,result)

結果:

> mapply(FUN = rep,1:4,4:1)
[[1]]
[1] 1 1 1 1
[[2]]
[1] 2 2 2
[[3]]
[1] 3 3
[[4]]
[1] 4

> char<-c("d12jsfl","df13djklf","sd5jglkjg","djf2dlk")
> result<-gregexpr(pattern = '[a-z][0-9]',char)
> fun<-function(x,y){
+   substring(x,y,y+attr(y,'match.length')-1)
+ }
> mapply(fun,char,result)
  d12jsfl df13djklf sd5jglkjg   djf2dlk 
     "d1"      "f1"      "d5"      "f2" 

總結:

apply()的被分析物件必須且只能是矩陣或陣列
tapply()的被分析物件必須且只能是向量
sapply()的被分析物件必須且只能是向量或列表
lapply()的被分析物件必須且只能是向量或列表
vapply()的被分析物件必須且只能是向量或列表
mapply()的被分析物件必須是函式

宣告:
本博文始發於微信公眾號:砍柴問樵夫
想了解更多內容請關注:
這裡寫圖片描述