R语言学习系列之向量化计算

##R语言学习系列之向量化计算

本文主要讲解R语言向量化计算的原理及方法,希望对初学者能够提供帮助。

##一、向量化
什么是向量化计算呢?其实你可以简单的理解成这样:当我们在使用函数或者定义函数的时候发现,我们只能对单个数据进行运算。而这点显然不能满足我们的需求。那么如何使函数可以计算多个数据呢?这时就要采用向量化计算的方法了。

##二、sapply( )函数

首先,我们先定义一个判断是否为偶数的函数,返回值为布尔值:

func <- function(x){
  if(x %% 2 == 0){
    ret <- TRUE
    
  } else{
    ret <- FALSE}
  return(ret)
}

当我们使用这个函数时发现他只能对单个数据进行运算:
这里写图片描述
而多个数据时则会报错:
这里写图片描述

因此我们引出今天的主角sapply( )函数:
这里写图片描述
可以看到运行成功了。这就是向量化计算的魅力所在,因为有了向量化计算我们则可以避免再去编写一个循环来进行计算。

当然,在实际生活中我们遇到的数据不可能仅仅是一小串向量,所以sapply()函数还可以用来对数据框进行计算,在此我们导入经典的数据集鸢尾花数据集:
这里写图片描述
然后我们要对数据的前4列进行计算他们的变异系数
变异系数= 标准差/ 均值

首先我们定义全局小数为2位小数,之后采用sapply()函数,并在函数内部再定义一个函数作为参数传入。
这里写图片描述

同样的sapply()函数也可以对列表进行计算,我们先将iris数据前四列转化为列表,之后使用sapply()函数计算每一列的均值。结果如下:
这里写图片描述

##三、lapply()函数
与sapply()函数相似,R语言中还有lapply()函数,其操作方法完全相同,不过顾名思义lapply()函数输出的格式为列表。
首先我们先定义一个函数同时计算平均值与标准差,之后采用lapply()函数返回一个列表结果。
这里写图片描述
注意:lapply()返回的列表结果比较复杂,需要一定的方法转化成真的格式。如下:
这里写图片描述
上图提供两种方法都能够将结果转换为矩阵的格式。

##四、apply()函数
apply()函数是专门针对矩阵进行向量化计算的函数。
这里写图片描述
首先我们创建一个随机数种子,创建包含12个均值分布的整数的变量vec,再创建一个3到4维的矩阵mat。最后使用apply()函数计算每一行的和,使用apply()函数计算每一列的极差。
注意:apply()函数与之前的向量化计算函数存在区别,参数1表示按行进行计算,参数2表示按列进行计算。
##五、tapply()函数
tapply()函数为分组计算函数,顾名思义使用此函数可以起到分类计算的作用。
继续以鸢尾花数据集为例子,计算每一种花的长度(Spal.Length)的均值。如下所示:
这里写图片描述

注意INDEX组标签应该转换为list列表的格式才能进行分组计算,这样是防止使用别的数据集时计算更加安全稳定。

与tapply()函数类似的还有aggregate()函数,后者的功能更加强大,而且返回数据框的格式,方便之后的操作。如下所示:
这里写图片描述
##六、mapply()函数
前面我们说讨论的sappl(),lappl(),tapply()函数等都是针对一个参数进行计算,若需要对两个参数进行计算时,则可以使用mapply()函数。
例如计算九九乘法表:
这里写图片描述
mapply()函数可以看作是sapply()函数的升级版。若只处理两个参数时,R也提供一种更为方面的函数outer()返回一个矩阵格式,上面的算法可修改为:
这里写图片描述

若想让计算结果看起来更像九九乘法表可自定义函数对其进行装饰:

myfunc <- function(x,y){
  left <- paste0(x,"*",y,"=")
  right <- x * y
  ret <- paste0(left,right)
  return(ret)
}

在使用outer()进行计算,结果如下:
这里写图片描述

##七、replicate()函数
replicate()函数的作用是让调用的某个函数可以重复的使用多遍,这在统计模拟计算中很有用处。
例如生成1000个服从正态分布的随即向量,然后再计算其均值,使这个过程重复100遍,如下所示:
这里写图片描述

到此本次R语言学习系列之向量化计算就基本介绍完了,在实际处理数据的过程中情况会更为复杂,但同学们应该知道换汤不换药的原理,只要每个函数的参数与原理你搞懂了,那么复杂的数据也只是想办法化为简单的数据的问题。学习R语言并不难,难的是你在处理数据时候的分析思维。由于R语言是统计学家写的,所以这门语言在数据分析上真的是个利器。当然Python也是一门很强大的语言,很多人都在纠结到底学Python还是学R,其实我个人认为两门语言都有各自的优势。既然都有优势与其天天纠结自己学哪门语言最后啥也没学到何不如两门语言一起尽收囊中,何不快哉?哈哈


最后为自己的公众号打个广告,此公众号会定期推送贵州贵安新区大数据的最新消息(毕竟跟着ZF走才有未来!)此外还会推送一些R语言与Python语言的干货哦。聪明的小伙伴都已经关注了,你还在等什么啊?

数聚贵安(shujuguian)

这里写图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.late

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值