前言

apply函数族是R语言中数据处理的一组核心函数,通过使用apply函数,我们可以实现对数据的循环、分组、过滤、类型控制等操作。但是,由于在R语言中apply函数与其他语言循环体的处理思路是完全不一样的,所以apply函数族一直是初学者玩不转的一类核心函数。很多R语言新手,写了很多的for循环代码,也不愿意多花点时间把apply函数的使用方法了解清楚,最后把R代码写的跟C似得。

简介

由于R语言的apply家族函数是用C写的,所以使用apply进行遍历的执行效率远远高于自己编写的循环语句。为了面向不同的数据类型,不同的返回值,apply函数组成了一个函数族,包括了8个功能类似的函数,具体如下表所示。下面我们一个一个来介绍。

apply函数

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

apply(X, MARGIN, FUN, ...)

X: 是一个数组(array),也就是说输入必须都是相同类型的数据,要么都是数值型,要么都是字符型。如果是一个混合数据类型的data.frame,那么就会尝试用as.matrix强制转换数据。

MARGIN:表示对行(1)或者是对列(2)应用函数。

FUN: 可是R自带函数,如mean,sum等。也可以是自己编写的函数。

... :FUN中的额外参数。

现在假设我们需要对一个矩阵的每一行求和,那么用apply怎么实现呢?

xapply(x, 1, sum)[1] 15 18 21 24

一行代码搞定!当然你说可以使用 rowSums(x)也一样能得到结果,但是如果稍微复杂点,rowSums函数就不行了。比如说让数据框的x1列加1,并计算出x1,x2列的均值,这个时候就需要利用apply调用自定义函数了,可以说这才是apply强大的真正原因。

第一步,生成matrix

x      x1 x2[1,] 10  1[2,] 10  2[3,] 10  3[4,] 10  4[5,] 10  2[6,] 10  3[7,] 10  4[8,] 10  5

第二步,自定义函数myFUN,第一个参数x为数据, 第二、三个参数为自定义参数,可以通过apply的'...'进行传入。

myFUN function(x, c1, c2) {  c(sum(x[c1], 1), mean(x[c2])) }

第三步,通过apply调用上面自定义的函数

apply(x, 1, myFUN, c1='x1', c2=c('x1', 'x2'))     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8][1,] 11.0   11 11.0   11   11 11.0   11 11.0[2,]  5.5    6  6.5    7    6  6.5    7  7.5

是不是很简单,通过for循环的方式,也可以很容易的实现上面计算过程,但是需要一些额外的操作,比如构建循环体、定义结果数据集、合并每次循环的结果到结果数据集。

lapply函数

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

下面以计算list中的每个元素对应数据的分位数为例,展示该函数的特性。

# 构建一个list数据集x,分别包括a,b,c 三个KEY值。x list(a = # 分别计算每个KEY对应数据的分位数。lapply(x, fivenum)$`a`[1]  5.0  8.5 12.5 16.5 20.0$b[1]  3.772836 11.750169 14.611470 17.395703 23.898115$c[1] 0 0 1 1 1

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

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

sapply函数

sapply函数是一个简化版的lapply,sapply增加了2个参数simplify和USE.NAMES,主要就是让输出看起来更友好,返回值为向量,而不是list对象。

vapply函数

vapply类似于sapply,提供了FUN.VALUE参数,用来控制返回值的行名,这样可以让程序更健壮。

mapply函数

mapply是sapply的变形函数,类似多变量的sapply,但是参数定义有些变化。第一参数为自定义的FUN函数,第二个参数’…’可以接收多个数据,作为FUN函数的参数调用。比如,比较3个向量大小,按索引顺序取较大的值。

# 定义3个向量x y z # 按索引顺序取较大的值。mapply(max, x, y, z)[1] 10  9  8  7  8  9 10

又比如想生成4个符合正态分布的数据集,分别对应的均值和方差为c(1,10,100,1000)。

# m为均值,v为方差m <- v <- c(1, 10, 100, 1000)# 生成4组数据,按列分组mapply(rnorm, rep(4,4), m, v)[,1]      [,2]      [,3]      [,4][1,] 1.1321892 11.119809 -12.65840  525.4851[2,] 3.3765492  8.032937 -44.84486  700.5648[3,] 0.1849429  6.717259 157.55199 1430.6167[4,] 1.8121539 15.392016  32.86186 1621.0613

tapply函数

tapply用于分组的循环计算,通过INDEX参数可以把数据集X进行分组,相当于group by的操作。例如,计算不同品种的鸢尾花的花瓣(iris)长度的均值。

# 通过iris$Species品种进行分组tapply(iris$Petal.Length, iris$Species, mean)    setosa versicolor  virginica      1.462      4.260      5.552

rapply函数

rapply是一个递归版本的lapply,它只处理list类型数据,对list的每个元素进行递归遍历,如果list包括子元素则继续遍历。例如,对一个list的数据进行过滤,把所有数字型的数据进行从小到大的排序。

x y lst =x, y=y)rapply(lst, sort, classes='numeric', how='replace')$`x`$`x`$`a`[1] 12$`x`$b[1] 1 2 3 4$`x`$c[1] "b" "a"$ya  b1  -2.28818912  12  -1.11604471  23  -0.71061407  34  -0.47929464  45  -0.45064871  56  -0.32539516  67  -0.09147763  78   0.32032781  89   1.67678507  910  1.71896910 10

eapply函数

对一个环境空间中的所有变量进行遍历。eapply函数平时很难被用到,但对于R包开发来说,环境空间的使用是必须要掌握的。特别是当R要做为工业化的工具时,对变量的精确控制和管理是非常必要的。

总结

从上面这8个函数的参数定义,我们可以发现它们都接收一个函数作为它的参数,在编程的世界里,这种把函数作为参数传入的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。这种编程范式与面向对象的范式的差异如下图

函数用法r语言_R语言中的apply函数族相关推荐

  1. map函数作用c语言,c语言中map的用法:map基本用法

    c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...

  2. R语言中的apply函数族

    原文出处:http://blog.fens.me/r-apply/ 前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么, ...

  3. c语言memset函数用法,深入学习C语言中memset()函数的用法

    头文件: #include memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int value, size_t num ...

  4. stdin和stdout用法c语言,C语言中的stdin,stdout,stderr

    我们在写C程序时经常遇到printf(),fprintf(),perror(),这些东西到底有什么作用.说到这不得不提及stdin,stdout,stderr.想想,我们在用C去写文件时的操作,Fil ...

  5. c语言strlen用法,如何使用c语言中的strlen()函数

    c语言中strlen()函数的用法是:[strlen(const char *str)].该函数用于计算字符串的长度,直到空结束字符,但不包括结束字符,并返回字符串的长度. 函数介绍: (推荐教程:c ...

  6. C语言 SLEEP函数不起作用,C语言中的sleep() 函数 sleep函数的具体用法

    导航:网站首页 > C语言中的sleep() 函数 sleep函数的具体用法 C语言中的sleep() 函数 sleep函数的具体用法 相关问题: 匿名网友: 关于sleep()函数在windo ...

  7. R语言中的apply函数用法

    刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言本身来 ...

  8. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

  9. table是什么函数c语言,c语言中table的用法

    c语言中table的用法 c语言中table的用法的用法如下:1 说明1.1 RECORD定义记录数据类型. 它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的.分离 ...

最新文章

  1. WCF进阶:为每个操作附加身份信息
  2. linux下创建新用户以及删除
  3. Java xml 工具 JDOM 使用详解.
  4. Android Full-Disk Encryption
  5. Wordpress安装简要说明
  6. 如何实现SAP UI5 Web Component React控件的加载效果
  7. 根据创建时间搜索对应的BSP application
  8. cocos2d-x开发之动作游戏实战--5
  9. 【转】深入浅出理解有限状态机
  10. LeetCode 974. 和可被 K 整除的子数组(哈希map)
  11. Leetcode--923. 三数之和的多种可能
  12. WX微信小程序路由API使用
  13. python log函数_求你别再花大价钱学 Python 之爬虫实战
  14. mongodb可视化工具robo3T的安装和使用
  15. 转载-计算机网络原理
  16. Apache Shiro框架
  17. ireport实现金额小写转大写
  18. 2023年最新谷歌Google帐号Gmail邮箱账号怎么注册成功的方法与教程?
  19. Android学习笔记(二)
  20. iphone 检测屏幕触摸事件

热门文章

  1. 数据流重导向 -- 第11章   认识与学习 BASH
  2. IOS上路_04-简单示例-图片浏览器
  3. 说人话很难。。。。。。
  4. DIY斑竹管理初稿的确定
  5. Docker加入裁员大军,关键时期Docker将何去何从?
  6. Cap22_信息系统安全管理
  7. AngularJS第六课(路由)
  8. Linux下的微秒级定时器: usleep, nanosleep, select, pselect
  9. iOS核心动画 - CALayer
  10. 关于SAP性能优化的讨论