数据操作-apply函数族
apply函数族正是为解决数据循环处理问题而生的 —— 面向不同数据类型,生成不同返回值的包含8个相关函数的函数族。
为何要用apply?
在使用 R 时,要尽量用 array 的方式思考,避免 for 循环,写过多的 for 循环代码,最后把 R 代码写的跟 C 似得说明你没有进入 R 的思考方式,是一种费力不讨好的行为。那么不用循环怎么实现迭代呢?apply函数族是一把利器,它不是一个函数,而是一族功能类似的函数。
语法详解
apply
|
|
参数列表: X:数组、矩阵、数据框 margin:按维度运算,1表示按行,2表示按列,c(1,3)表示第1、3维 FUN:要使用的函数
{% label info@举例阐释 %}
|
|
|
|
|
|
tapply
|
|
参数列表: X:向量、数组 INDEX:用于分组的索引 FUN:要使用的函数 simplify : 是否数组化,当值TRUE时,输出结果按数组进行分组输出
{% label info@举例阐释 %}
|
|
|
|
|
|
lapply
|
|
参数列表: X:列表、向量、数据框 FUN:要使用的函数
{% label info@举例阐释 %}
|
|
|
|
|
|
rapply
|
|
参数列表: list:列表 f:要使用的函数 classes: 匹配类型, ANY为所有类型 deflt: 非匹配类型的默认值 how: 3种操作方式,
- replace:则用调用f后的结果替换原list中原来的元素;
- list:新建一个list,类型匹配调用f函数,不匹配赋值为deflt;
- unlist:执行一次unlist(recursive = TRUE)操作
{% label info@举例阐释 %}
|
|
sapply
|
|
参数列表: X:列表、向量、数据框 FUN:要使用的函数 simplify: 若FALSE,等价于lapply。否则,将lapply输出的list简化为vector或matrix USE.NAMES: 如果X为字符串,TRUE设置字符串为数据名,FALSE不设置
{% label info@举例阐释 %}
|
|
|
|
vapply
|
|
参数列表: X:列表、数据框 FUN:要使用的函数 FUN.VALUE:定义返回值的行名row.names USE.NAMES: 如果X为字符串,TRUE设置字符串为数据名,FALSE不设置
{% label info@举例阐释 %}
|
|
|
|
mapply
|
|
参数列表: FUN:要使用的函数 …: 接收多个数据(list、vector) MoreArgs: FUN的参数列表 simplify: 若FALSE,输出list。否则,将输出的list简化为vector或matrix USE.NAMES: 如果X为字符串,TRUE设置字符串为数据名,FALSE不设置
{% label info@举例阐释 %}
|
|
|
|
|
|
eapply
|
|
参数列表: env: 环境空间 FUN:要使用的函数 all.names: 匹配类型, ANY为所有类型 USE.NAMES: 如果X为字符串,TRUE设置字符串为数据名,FALSE不设置
{% label info@举例阐释 %}
|
|
应用及拓展
应用展示
原始数据为按年份year、地区loc和商品类别type进行统计的销售量。我们要制作两个销售总量的crosstable,一个以年份为行、地区为列,一个以年份为行,类别为列。
|
|
|
|
相关函数
by
|
|
参数列表: data: 数据框 INDICES:与数据框行数等长的用于分组的索引 FUN:要使用的函数
{% label info@举例阐释 %}
|
|
outer
|
|
参数列表: X、Y: 向量、数组 FUN:当为空时即为外积运算,否则为将FUN代替外积运算符进行类似外积的运算操作
{% label info@举例阐释 %}
|
|
sweep
|
|
参数列表: x: 数组、矩阵 MARGIN:运算维度,1表示行,2表示列,3即第三维度,以此类推 STATS:运算参数,类似于减法中的减数,除法中的除数 FUN:要使用的函数
{% label info@举例阐释 %}
|
|
|
|
replicate
|
|
参数列表: n: 调用的次数 expr:调用的表达式
{% label info@举例阐释 %}
|
|
aggregate
|
|
参数列表: x: 一种R数据结构,通常为数据框 by:分组索引,必须为list格式 FUN:要使用的函数
{% label info@举例阐释 %}
|
|
致谢
参考文章