R语言基础之第三部分 apply族函数的使用

R语言基础之第部分:重要函数apply族函数的使用

3.1 apply族函数
3.11 lapply
可以看成是list + apply的缩写
循环处理列表中的每一个元素,总是返回一个列表
lapply(列表,函数/函数名,其他参数)

>  str(lapply)    #查看函数怎么用吧
> 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 表示的列表的内容,而不是列表名称
                    # 该函数自动把y这个向量格式转换为了列表
[[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,])   # **因为z的每个元素都为矩阵,所以在此m也就表示默认矩阵**
$a
[1] 1 3 5

$b
[1] 4 6

3.12 sapply
与lapply相似,唯一的区别是:输出的结果能简洁就简洁

> 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 

规则就是:当结果列表的元素长度均为1时,返回向量;
         当结果列表的元素长度相同,且大于1,返回矩阵;
         若没有列表元素杂七杂八,返回列表,即lapply结果。

3.13 apply
沿着数组某一维度处理数据
apply(数组,维度,函数)

> 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)   #计算每行的均值1表示行 2表示列
[1]  7  8  9 10
# 求列均值 列和 行均值 行和有简单函数
> colMeans(x)
> colSums(x)
> rowMeans(x)
> rowSums(x)

----------------------------------我是美丽的短暂分割线------------------------------

> x = matrix(rnorm(100),10,10)    #生成100个标态分布的随机数并组成10行10列矩阵
> apply(x,1,quantile,probs = c(0.25,0.75))   #求每行25% 和75% 的分位数
         [,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(函数/函数名,数据,函数相关的函数)

> 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
向量子集操作
tapply(向量,因子/因子列表,函数/函数名)

> x = c(rnorm(5), runif(5), rnorm(5,1))  # rnorm(5,1) 表示生成5个均值为1 方差为0的随机数
> f = gl(3,5)  #**该因子有3个水平,每个水平下有5个元素**
> 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
根据因子or因子列表将向量or其他对象分组
通常与lapply函数一起使用
split(向量/列表/数据框,因子/因子列表)

> 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表示数据框,因为s本身是数据框。对s的三个变量求列均值
$`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后结果中不会有缺失值 
             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

后续请参考:
R语言基础之第部分 : 5种数据对象类型
R语言基础之第部分 : 操纵数据取子集
R语言基础之第部分 : 排序
R语言基础之第部分 : 总结数据信息

    原文作者:多美丽很美丽
    原文地址: https://www.jianshu.com/p/f85943a24d51
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞