R語言基礎(chǔ)之第三部分 apply族函數(shù)的使用

R語言基礎(chǔ)之第部分:重要函數(shù)apply族函數(shù)的使用

3.1 apply族函數(shù)
3.11 lapply
可以看成是list + apply的縮寫
循環(huán)處理列表中的每一個(gè)元素,總是返回一個(gè)列表
lapply(列表,函數(shù)/函數(shù)名,其他參數(shù))

>  str(lapply)    #查看函數(shù)怎么用吧
> function (X, FUN, ...)  
> x = list(a = 1:10, b = c(21,31,41,51,61))
> lapply(x, mean)    #分別作用列表x中的a元素 和 b元素
$a
[1] 5.5

$b
[1] 41

----------------------------------我是美麗的短暫分割線------------------------------
> y = 1: 4
> lapply(y,runif)   # 注意:1:4 表示的列表的內(nèi)容,而不是列表名稱
                    # 該函數(shù)自動(dòng)把y這個(gè)向量格式轉(zhuǎn)換為了列表
[[1]]
[1] 0.9995728

[[2]]
[1] 0.7146108 0.9089188

[[3]]
[1] 0.9894942 0.5711674 0.6793558

[[4]]
[1] 0.8209915 0.6317327 0.3662067 0.5019538
> lapply(y,runif,min = 0, max = 100)
[[1]]
[1] 82.04034

[[2]]
[1] 57.51863 32.18876

[[3]]
[1] 65.578491 63.255324  8.271222

[[4]]
[1] 65.20686 30.99439 13.01915 72.22398

----------------------------------我是美麗的短暫分割線------------------------------

> z = list(a = matrix(1:6,2,3), b = matrix(4:7,2,2))
> z 
$a
    [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

$b
    [,1] [,2]
[1,]    4    6
[2,]    5    7
> lapply(z, function(m) m[1,])   # **因?yàn)閦的每個(gè)元素都為矩陣,所以在此m也就表示默認(rèn)矩陣**
$a
[1] 1 3 5

$b
[1] 4 6

3.12 sapply
與lapply相似,唯一的區(qū)別是:輸出的結(jié)果能簡潔就簡潔

> x = list(a = 1:10, b =c(11,21,31,41,51))
> lapply(x,mean)
$a
[1] 5.5

$b
[1] 31
> sapply(x,mean)
   a    b 
 5.5 31.0 

規(guī)則就是:當(dāng)結(jié)果列表的元素長度均為1時(shí),返回向量;
         當(dāng)結(jié)果列表的元素長度相同,且大于1,返回矩陣;
         若沒有列表元素雜七雜八,返回列表,即lapply結(jié)果。

3.13 apply
沿著數(shù)組某一維度處理數(shù)據(jù)
apply(數(shù)組,維度,函數(shù))

> x = matrix(1:16, 4, 4)
> x
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16

> apply(x,1,mean)   #計(jì)算每行的均值1表示行 2表示列
[1]  7  8  9 10
# 求列均值 列和 行均值 行和有簡單函數(shù)
> colMeans(x)
> colSums(x)
> rowMeans(x)
> rowSums(x)

----------------------------------我是美麗的短暫分割線------------------------------

> x = matrix(rnorm(100),10,10)    #生成100個(gè)標(biāo)態(tài)分布的隨機(jī)數(shù)并組成10行10列矩陣
> apply(x,1,quantile,probs = c(0.25,0.75))   #求每行25% 和75% 的分位數(shù)
         [,1]       [,2]       [,3]       [,4]        [,5]       [,6]       [,7]
25% -0.662055 0.08879356 -0.1460079 -0.6126172 -0.38371665 -0.2321496 -0.9739394
75%  1.546184 0.81950212  1.1570631  0.5038655  0.06949848  1.7607837  0.4571585
          [,8]       [,9]      [,10]
25% -0.4376032 -0.5294471 -0.5692924
75%  0.8542543  1.2788572  0.4973777

----------------------------------我是美麗的短暫分割線------------------------------

z = array(rnorm(2*3*4),c(2,3,4))
> z
, , 1

           [,1]       [,2]       [,3]
[1,] 0.90596834  1.0847827 -0.8454799
[2,] 0.08787108 -0.6741413 -1.2779192

, , 2

           [,1]      [,2]       [,3]
[1,]  0.7279739 1.0178221 -0.9207198
[2,] -1.0621578 0.6427292 -1.5874224

, , 3

           [,1]      [,2]       [,3]
[1,] -1.2396928 0.6654546 -0.9154209
[2,] -0.9939213 1.1634397  1.4078552

, , 4

           [,1]       [,2]        [,3]
[1,] -0.1845830 -1.7680792 -0.47874217
[2,]  0.4592537 -0.4854505 -0.06110676
apply(z,c(1,2),mean)
            [,1]      [,2]       [,3]
[1,]  0.05241661 0.2499950 -0.7900907
[2,] -0.37723859 0.1616443 -0.3796483

> apply(z,c(1,3),mean)
           [,1]       [,2]       [,3]        [,4]
[1,]  0.3817571  0.2750254 -0.4965530 -0.81046815
[2,] -0.6213965 -0.6689503  0.5257912 -0.02910119

> apply(z,c(2,3),mean)
           [,1]       [,2]       [,3]       [,4]
[1,]  0.4969197 -0.1670919 -1.1168070  0.1373353
[2,]  0.2053207  0.8302756  0.9144472 -1.1267649
[3,] -1.0616995 -1.2540711  0.2462172 -0.2699245

3.14 mapply
lapply的多元版本
mapply(函數(shù)/函數(shù)名,數(shù)據(jù),函數(shù)相關(guān)的函數(shù))

> list(rep(1,4), rep(2,3),rep(3,2),rep(4,1))
[[1]]
[1] 1 1 1 1

[[2]]
[1] 2 2 2

[[3]]
[1] 3 3

[[4]]
[1] 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

> s = function(n, mean, std){
+     rnorm(n, mean, std) }
> s(4,0,1)
[1] 1.1924366 1.6924980 0.1336761 0.4412759

> mapply(s, 1:5, 5:1, 2)   #n表示1:5  mean表示5:1 std表示2
[[1]]
[1] 5.79772

[[2]]
[1] 2.018453 5.740265

[[3]]
[1]  3.051907 -2.432438  5.262420

[[4]]
[1]  2.2291033  3.6701801  1.3136980 -0.5424045

[[5]]
[1]  4.3898086 -3.9646175 -0.6947878  1.0125224  3.6488662

3.15 tapply
對(duì)向量子集操作
tapply(向量,因子/因子列表,函數(shù)/函數(shù)名)

> x = c(rnorm(5), runif(5), rnorm(5,1))  # rnorm(5,1) 表示生成5個(gè)均值為1 方差為0的隨機(jī)數(shù)
> f = gl(3,5)  #**該因子有3個(gè)水平,每個(gè)水平下有5個(gè)元素**
> f
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
> tapply(x, f, mean)
        1         2         3 
0.2099737 0.3680760 1.2042982 

> tapply(x, f, mean, simplify = FALSE)
$`1`
[1] 0.2099737

$`2`
[1] 0.368076

$`3`
[1] 1.204298

3.16 split
根據(jù)因子or因子列表將向量or其他對(duì)象分組
通常與lapply函數(shù)一起使用
split(向量/列表/數(shù)據(jù)框,因子/因子列表)

> x = c(rnorm(5), runif(5), rnorm(5,1)) 
> f = gl(3,5)
> split(x,f)
$`1`
[1]  0.1417127 -0.2330801 -1.0763036 -0.4488686  2.6664082

$`2`
[1] 0.4813495 0.8214398 0.1087439 0.2505093 0.1783375

$`3`
[1] 0.1994114 1.2881557 0.8560102 1.7501790 1.9277348
> lapply(split(x,f), mean)
$`1`
[1] 0.2099737

$`2`
[1] 0.368076

$`3`
[1] 1.204298

> s = split(airquality, airquality$Month)   #將airquality按照月分類
> table(airquality$Month)
 5  6  7  8  9 
31 30 31 31 30 
> lapply(s,function(x) colMeans(x[, c("Ozone","Wind","Temp")]))   #x表示數(shù)據(jù)框,因?yàn)閟本身是數(shù)據(jù)框。對(duì)s的三個(gè)變量求列均值
$`5`
   Ozone     Wind     Temp 
      NA 11.62258 65.54839 

$`6`
   Ozone     Wind     Temp 
      NA 10.26667 79.10000 

$`7`
    Ozone      Wind      Temp 
       NA  8.941935 83.903226 

$`8`
    Ozone      Wind      Temp 
       NA  8.793548 83.967742 

$`9`
Ozone  Wind  Temp 
   NA 10.18 76.90 

> sapply(s,function(x) colMeans(x[,c("Ozone","Wind","Temp")],na.rm = TRUE))   #這樣na.rm后結(jié)果中不會(huì)有缺失值 
             5        6         7         8        9
Ozone 23.61538 29.44444 59.115385 59.961538 31.44828
Wind  11.62258 10.26667  8.941935  8.793548 10.18000
Temp  65.54839 79.10000 83.903226 83.967742 76.90000

后續(xù)請(qǐng)參考:
R語言基礎(chǔ)之第部分 : 5種數(shù)據(jù)對(duì)象類型
R語言基礎(chǔ)之第部分 : 操縱數(shù)據(jù)取子集
R語言基礎(chǔ)之第部分 : 排序
R語言基礎(chǔ)之第部分 : 總結(jié)數(shù)據(jù)信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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