R语言基础之第三部分 apply族函数的使用
2019-08-25 本文已影响4人
多美丽
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语言基础之第五部分 : 总结数据信息