apply函数家族及其应用

时间:2021-6-5 作者:qvyue

apply函数家族是R语言中数据处理的一组核心函数,通过使用apply函数,我们可以实现对数据的循环、分组、过滤、类型控制等操作。但是,由于在R语言中apply函数与其他语言循环体的处理思路是完全不一样的,所以apply函数族一直是使用者玩不转一类核心函数。
很多R语言新手,写了很多的for循环代码,也不愿意多花点时间把apply函数的使用方法了解清楚,最后把R代码写的跟C似得,我严重鄙视只会写for的R程序员。
apply函数本身就是解决数据循环处理的问题,为了面向不同的数据类型,不同的返回值,apply函数组成了一个函数族,包括了8个功能类似的函数。这其中有些函数很相似,有些也不是太一样的。

apply函数家族及其应用

下面将分别介绍这几个函数的定义和使用方法。

1. apply函数

apply函数是最常用的代替for循环的函数。apply函数可以对矩阵数据框数组(二维、多维),color{#ea4335}{按行或列进行循环计算},对子元素进行迭代,并把子元素以参数传递的形式给自定义的FUN函数中,并以返回计算结果。

1.1 函数定义:
apply(X, MARGIN, FUN, ...)
1.2 参数列表:

X:数组、矩阵、数据框
MARGIN:按行计算或按按列计算,1表示按行,2表示按列
FUN:自定义的调用函数
…:更多参数,可选

1.3 应用:
# 对一个矩阵的每一列求和
# 生成data.frame
> x 

2. lapply函数

lapply函数是一个最基础循环操作函数之一,用来对listdata.frame数据集进行循环,并color{#ea4335}{返}color{#ea4335}{回}color{#ea4335}{和}color{#ea4335}{X}color{#ea4335}{长}color{#ea4335}{度}color{#ea4335}{相}color{#ea4335}{同}color{#ea4335}{的}color{#ea4335}{list}color{#ea4335}{结}color{#ea4335}{构}作为结果集,通过lapply的开头的第一个字母’l’就可以判断返回结果集的类型。

2.1 函数定义
lapply(X, FUN, ...)
2.2 参数列表

X:list、data.frame数据
FUN:自定义的调用函数
…:更多参数,可选

2.3 应用

输入list,返回对每个list进行操作后的list。

# 构建一个list数据集x,分别包括a,b,c 三个KEY值。
x 

如果输入的是数据框,lapply会自动把数据框按列进行分组,再进行计算。

lapply(data.frame(x), sum)
$x1
[1] 12

$x2
[1] 12

lapply可以很方便地对list数据集中个每个list进行循环操作,还可以用data.frame数据集按列进行循环,但如果传入的数据集是一个向量或矩阵对象,那么直接使用lapply就不能达到想要的效果了。lapply会分别循环矩阵中的每个值,而不是按行或按列进行分组计算。

x 

3. sapply函数

sapply函数是一个简化版的lapply,sapply增加了2个参数simplify和USE.NAMES,主要就是让输出看起来更友好,与lapply不同的是,color{#ea4335}{sapply返回值}color{#ea4335}{为向量、}color{#ea4335}{矩阵或数据框},而不是list对象。

3.1 函数定义
sapply(X, FUN, ..., simplify=TRUE, USE.NAMES = TRUE)
3.2 参数列表

X:数组、矩阵、数据框
FUN:自定义的调用函数
…:更多参数,可选
simplify:是否数组化,当设置simplify=’array’时,输出结果按数组进行分组
USE.NAMES:如果X为字符串,TRUE设置字符串为数据名,FALSE不设置

3.3 应用
x 

如果simplify=FALSE和USE.NAMES=FALSE,那么完全sapply函数就等于lapply函数了。

sapply(data.frame(x), sum, simplify=FALSE, USE.NAMES=FALSE)
# $x1
# [1] 12
 
# $x2
# [1] 12

对于simplify为array时,我们可以参考下面的例子,构建一个三维数组,其中二个维度为方阵。

a

对于字符串的向量,还可以自动生成数据名。

val

4. tapply函数

tapply用于分组的循环计算,通过INDEX参数(分类变量)对数据集X进行分组并计算分组计算,相当于group by的操作。

4.1 函数定义
tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
4.2 参数列表

X:向量
INDEX:用于分组的索引
FUN:自定义的调用函数
…:接收多个数据
simplify:是否数组化,当值array时,输出结果按数组进行分组

4.3 应用
#计算不同品种(Species)的鸢尾花(iris)的花瓣长度(Petal.Length)的均值。
tapply(X = iris$Petal.Length,INDEX = iris$Species,FUN = mean)
#    setosa versicolor  virginica 
#     1.462      4.260      5.552 

5. mapply函数

mapply也是sapply的变形函数,类似多变量的sapply,但是参数定义有些变化。第一参数为自定义的FUN函数,第二个参数’…’可以接收多个数据,作为FUN函数的参数调用。

5.1 函数定义
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)
5.2 参数列表

FUN:自定义的调用函数
…:接收多个数据
MoreArgs:参数列表
SIMPLIFY:是否数组化,当值array时,输出结果按数组进行分组
USE.NAMES:如果X为字符串,TRUE设置字符串为数据名,FALSE不设置

5.3 应用

比如,比较3个向量大小,按索引顺序取较大的值。

set.seed(1)
 
# 定义3个向量
x

再看一个例子,生成4个符合正态分布的数据集,分别对应的均值和方差为c(1,10,100,1000)。

set.seed(1)
 
# 长度为4
n

由于mapply是可以接收多个参数的,所以我们在做数据操作的时候,就不需要把数据先合并为data.frame了,直接一次操作就能计算出结果了。

参考:https://blog.csdn.net/u012108367/article/details/80774977

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。