函数用法r语言_R语言中的apply函数族
前言
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函数族相关推荐
- map函数作用c语言,c语言中map的用法:map基本用法
c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...
- R语言中的apply函数族
原文出处:http://blog.fens.me/r-apply/ 前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么, ...
- c语言memset函数用法,深入学习C语言中memset()函数的用法
头文件: #include memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int value, size_t num ...
- stdin和stdout用法c语言,C语言中的stdin,stdout,stderr
我们在写C程序时经常遇到printf(),fprintf(),perror(),这些东西到底有什么作用.说到这不得不提及stdin,stdout,stderr.想想,我们在用C去写文件时的操作,Fil ...
- c语言strlen用法,如何使用c语言中的strlen()函数
c语言中strlen()函数的用法是:[strlen(const char *str)].该函数用于计算字符串的长度,直到空结束字符,但不包括结束字符,并返回字符串的长度. 函数介绍: (推荐教程:c ...
- C语言 SLEEP函数不起作用,C语言中的sleep() 函数 sleep函数的具体用法
导航:网站首页 > C语言中的sleep() 函数 sleep函数的具体用法 C语言中的sleep() 函数 sleep函数的具体用法 相关问题: 匿名网友: 关于sleep()函数在windo ...
- R语言中的apply函数用法
刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言本身来 ...
- c语言memcopy_C语言中memcpy 函数的用法详解
C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...
- table是什么函数c语言,c语言中table的用法
c语言中table的用法 c语言中table的用法的用法如下:1 说明1.1 RECORD定义记录数据类型. 它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的.分离 ...
最新文章
- WCF进阶:为每个操作附加身份信息
- linux下创建新用户以及删除
- Java xml 工具 JDOM 使用详解.
- Android Full-Disk Encryption
- Wordpress安装简要说明
- 如何实现SAP UI5 Web Component React控件的加载效果
- 根据创建时间搜索对应的BSP application
- cocos2d-x开发之动作游戏实战--5
- 【转】深入浅出理解有限状态机
- LeetCode 974. 和可被 K 整除的子数组(哈希map)
- Leetcode--923. 三数之和的多种可能
- WX微信小程序路由API使用
- python log函数_求你别再花大价钱学 Python 之爬虫实战
- mongodb可视化工具robo3T的安装和使用
- 转载-计算机网络原理
- Apache Shiro框架
- ireport实现金额小写转大写
- 2023年最新谷歌Google帐号Gmail邮箱账号怎么注册成功的方法与教程?
- Android学习笔记(二)
- iphone 检测屏幕触摸事件