“ 对于向量来说,除了对它进行创建和增删改查操作,我们还有很多魔法一样的操作来处理向量。”
首先给出上一篇文章末尾练习的答案,
# 创建5元素向量三个 一个数值型 一个字符串型 一个布尔型
Numv <- c(2,6,7,1,9)
Strv <- c('bb','gg','mm','lala',"pp")
Tfv <- c(T,F,F,T,F)
# 使用布尔向量对数值向量进行索引
> Numv[Tfv]
[1] 2 1
# 自己构建索引查找字符向量的1 3 5位置的元素
> Strv[c(1,3,5)]
[1] "bb" "mm" "pp"
# 合并字符向量和数值向量 名为mer1
mer1 <- c(Strv,Numv)
# 删除mer1向量的第一个元素
mer1 <- mer1[-1]
# 在mer1末尾插入元素lalala
mer1 <- c(mer1,'lalala') # fun1
mer1[length(mer1)+1] <- 'lalala' # fun2
# 删除所有的元素
rm(list = ls())
上节课里,我们学习到了R语言里最基本的变量 - 向量,然后学习到了如何创建一个向量,以及如何对一个向量进行增加元素,删除元素,修改元素和索引元素。但是我们创建向量是要用来使用的,所以我们怎么来进行使用呢?那当然是进行各种运算操作来使用了。
基本运算
计算机的创建之初就是为了计算而生的,而我们日常使用的各种功能在底层,其实都是各种运算,不过大部分都是逻辑的运算,我们不需要去了解。
而今天我们要讲的运算就是各种复杂运算的原子元素,即最简单的四则运算,以及余数,取整操作,其中取整操作又包含了多种情况,后面我们会细致的讨论。
首先是最简单的四则运算
# 创建两组向量
a <- c(6,3,2)
b <- c(4,2,1)
# 加减乘除
a+b
a-b
a*b
a/b
结果清晰可见,而且大家有没有发现,R的操作是向量化的,也就是R让两组向量对应位置进行计算,不需要我们写一个循环去进行操作,大大节省了我们编程的时间,提高了代码的可读性。
在讲完了四则运算以后,我们讲解一下使用超级多的取余数操作,这应该是编程中使用非常大量的操作了
# 取余数
a %% b
[1] 2 1 0
R中的取余数操作符是 %% 符号,大家一定要记住,取余操作非常有用,很多编程的思路和算法的实现里大部分都有余数操作的身影,后面写的多了,自然也就知道了。
接下来就是取整操作,这在科学计算中是非常重要的操作,我们常常需要进行小数的取整方便使用或者因为某些特殊原因需要对其进行取整。
在R里,取整包括三个重要操作,一个是四舍五入取整,一个是向上取整,一个是向下取整。
第一个是四舍五入的取整 - round()
# 四舍五入
# 首先创建一个包含了浮点数的向量
> c <- c(1.345,2.456,3.567)
# 直接使用round会默认取到整数位置,也就是所谓的四舍五入
> round(c)
[1] 1 2 4
# 第二个参数是保留小数的位数 这是保留两位
> round(c,2)
[1] 1.34 2.46 3.57
# 保留一位小数
> round(c,1)
[1] 1.3 2.5 3.6
然后是向上取整和向下取整 floor和ceiling
# 向上取整
> floor(c)
[1] 1 2 3
# 向下取整
> ceiling(c)
[1] 2 3 4
这就是R里的基本运算,后面还会单独的讲解数学运算(均值,方差,最值,分位数,.。。)等等的函数,因为篇幅限制,此处就暂时不做讲解。
循环补齐
这一部分要讲一个有趣的概念,这是你学习其他语言学不到的一个东西,我们称它为 - 循环补齐,如果你有np pd 或者 torch的使用经验的话,你应该听说过有一个叫做广播机制的东西。R中的循环补齐大约就是这个意思,这个一个非常灵活而又有用的向量化的操作方式。
那么什么叫做循环补齐呢,大家可能还记得,我们过去定义的向量都是等长的,我故意没有举出不等长的向量进行 索引,运算 操作会发生什么。而这个时候就是循环补齐出场的时候了,直接上例子说明大家可能就懂了。
使用循环补齐让a的每个位置值都加一
> a + 1
[1] 7 4 3
这种操作你看起来好像没什么问题,但是在计算机的世界里,这太荒唐了,让一个长度为3的向量和长度为1的向量相加,这不是在开玩笑吗?
但是R会进行循环补齐。过程如下,首先发现1长度为1,a长度为3,然后R会主动通过循环把1补充成c(1,1,1)的形式,然后进行相加,得到 7 4 3。
那么,如我们让a + c(1,2)会发生什么呢?
a + c(1,2)
# R会把1 2 循环补齐变成 1 2 1然后相加
[1] 7 5 3
再考虑一种情况,如果a加上一个比自己长的向量呢?
> a + c(1,2,3,4)
# R会把短的向量循环补齐到和长向量相同的长度 然后进行运算
[1] 7 5 5 10
到这里为止,大家应该已经知道了循环补齐的概念了,下面再给出几个案例进行深入的理解
# 寻循环补齐进行值的索引
d <- c(1,2,3,4,5,6,7,8,9)
> d[c(T,F)]
[1] 1 3 5 7 9
是不是很神奇,R给我们自动的取出了所有奇数位置的元素,然后做成了一个新的向量。
那我们怎么取出偶数位置的向量呢?
d[c(F,T)]
[1] 2 4 6 8
好了,相信大家到这里对循环补齐已经有了比较深入的了解了,后面我们会经常遇到关于循环补齐的应用的,而且我们经常不知不觉的就使用到了这个特性。如果你的未来因为循环补齐的事情导致代码出了bug,相信你也知道应该怎么解决了。
放一点简单的小练习,
# 创建两组长为3的数值型向量 一组都是整数 一组都是四位小数
# 计算向量之间的加法并且保存结果到向量3
# 对小数向量向上取整
# 对小数向量四舍五入保留两位小数
# 创建1-20的向量d
d <- 1:20
# 在d中取出 3 6 9 .。。
# 取出d中的5的倍数
# 对d中的奇数位置乘2,偶数位置乘3
今天的分享就到这里了,下一次的分享将是如何使用一些特定的运算符或者函数来为我们生成我们想要的向量以及如何获取一个向量的长度。
下次内容更精彩哦,关注不迷路!
如果你喜欢我的文章,请收藏我的文章并且给我个赞,你的支持就是我更新的最大的动力,关注我会有更多惊喜哦,专注于生物信息学以及数据分析入门和进阶教程,也许我给不了你从10-100,但是我可以给你最好的从0-10!
最后,关注我的公众号,领取更多学习资料吧!!!
打开v搜索,”轻松玩转生信“或者从下面文章进去获取二维码关注哦