“ 上节课我们讲解了向量的基本运算和R语言中非常重要的概念,循环补齐机制,但是我们还不能很方便的创建特定样式的向量,今天就要解决这个问题”
首先给出上一篇文章末尾练习的答案,
# 创建两组长为3的数值型向量 一组都是整数 一组都是四位小数
v1 <- c(3,6,9)
v2 <- c(1.4567,2.4365,3.7897)
# 计算向量之间的加法并且保存结果到向量3
v3 <- v1 + v2
# 对小数向量向上取整
ceiling(v2)
# 对小数向量四舍五入保留两位小数
round(v2,2)
# 创建1-20的向量d
d <- 1:20
# 在d中取出 3 6 9 .。。
d[c(F,F,T)]
# 取出d中的5的倍数
d[c(F,F,F,F,T)]
# 对d中的奇数位置乘2,偶数位置乘3
d * c(2,3)
相信你一定已经学会了上一文章的内容,那么我们就开始今天的内容吧。
我们第一节的内容讲解了如何创建一个向量,但是我们是通过手打的方式,数量少的情况还好,如果数量非常多的话,那么对我们的身心都是一种折磨。
尤其是比较特殊的情况,比如 我想生成一个长度为20的内容都是6的向量,或者我想生成1到100的数值向量等等。我们总不能自己去一个一个的按,这种情况下,就需要我们今天的知识了。如何创建特殊的向量以及取向量的长度操作。
获取向量长度
取向量长度的操作非常的简单,但是它非常的重要,大部分的算法以及数据的自动处理流程中,都有着取向量长度的身影。
取向量长度:length()
> d <- c(1,2,3,4,5)
> length(d)
[1] 5
> f <- c(T,F,F,T,T,T)
> length(f)
[1] 6
就是这么简单粗暴,直接返回一个标量值,是你向量的长度,就这样,没有其它花哨的,简约美,优雅美,而且还实用冒号运算符
讲完了使用length函数取向量的长度,我们再来讲个简单粗暴的好东西 -- :运算符。
这个运算符可以帮我们取等差数列,如果你使用过python的range的话,那么你会惊喜的发现这两个东西非常相似(实际是有区别的哦),都是给定范围,然后取等差数列。
下面给两个演示,大家一看就能明白,
# 生成1-6的序列
> v3 <- 1:6
> v3
[1] 1 2 3 4 5 6
# 生成8-0的序列
> 8:0
[1] 8 7 6 5 4 3 2 1 0
是不是已经理解了:运算符的作用呢,这个运算符常常用来配合循环和取数据特定长度或者位置的操作。
下面给出两个示例
(取特定长的值和使用索引操作模拟rev函数)
# 随便生成一组向量
testv1 <- 1:20
# 现在取向量testv1的5-12位置的值
> testv1[5:12]
[1] 5 6 7 8 9 10 11 12
# 模拟rev函数
> testv1[20:1]
[1] 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
创建等差序列 - seq
上面我们讲解了使用冒号运算符生成序列,但是我们发现,冒号运算符好像不允许我们生成步长更大的序列,比如我们想要1 3 5 7 9或者1 11 21 31...等等的序列。
我们过去学过的循环补齐操作也是可以实现这个功能的,但是对于实现1 11 21.。已经是非常复杂的操作了,更别说实现100 200 300 .。。等等更大的数字的等差序列了。而且我们偶尔还有对于小数序列的需求,这连循环补齐都做不到了,我们该怎么办呢?
不要着急,这么重要的功能,R已经给我们内置好了,那就是使用我们的seq函数,轻松完成取等差序列的操作,不止整数,小数也能随便取哦!
**seq(...):Generate regular sequences. **
下面给出案例看一看,
# 生成1:10的步长为2的等差序列
> seq(1,10,2)
[1] 1 3 5 7 9
# 生成1-2的步长为0.2的等差序列
> seq(1,2,.2)
[1] 1.0 1.2 1.4 1.6 1.8 2.0
# 生成1-120步长为15的等差序列
> seq(1,120,15)
[1] 1 16 31 46 61 76 91 106
大家看懂上面的案例了吗,这就是使用seq函数进行取定步长的操作,这是非常有用的操作,大家也可以在各大函数库以及各种层次的代码中见到它的身影。
但是我们的seq函数能做到的可不止这个,它还有另一个很常用的功能,这就是它可以取两个值之间给定长度数目的向量。什么意思呢,好比你给了1和2,你要在这之间取5个数,seq就会自动给你计算,然后返回给你1 1.2 1.4.。。。2的向量。
# 取给定数量的向量
> seq(1,2,length.out = 2)
[1] 1 2
> seq(1,2,length.out = 4)
[1] 1.000000 1.333333 1.666667 2.000000
> seq(1,2,length.out = 5)
[1] 1.00 1.25 1.50 1.75 2.00
seq函数会自动给我们进行计算,所以对于我们想取特定长度的向量的时候就不需要自己计算步长了,比如我想要325到600之间取5个向量,我们完全不需要指定步长,直接使用length.out参数指定为5即可
> seq(325,600,length.out = 5)
[1] 325.00 393.75 462.50 531.25 600.00
上面就是关于seq函数的所有了,你学会了吗?
创建重复值向量 - rep
我们在提取数据或者生成索引或者进行编码的时候,常常会用到重复值,所以R也给我们提供了一个非常好用的重复值生成函数,rep函数,同样,它也是我们平时写代码必不可少的好伙伴。
rep(x, ...):rep replicates the values in x.
rep可以让我们很好的取得重复值,下面给出案例
rep的参数有必要讲一下,它的第一个参数是需要重复的向量,后面是具名参数,一个是each一个是length.out,each是重复次数,length.out默认是重复所有,如果你进行指定的话则只会输出Length.out的总长度。
# 取10个1
> rep(1,each = 10)
[1] 1 1 1 1 1 1 1 1 1 1
# 指定length.out进行阻断
> rep(1,each = 10,length.out = 2)
[1] 1 1
下面再给出几个案例,大家好好体会一下each和length.out
# 生成1 1 2 2 3 3
> rep(c(1,2,3),each = 2)
[1] 1 1 2 2 3 3
# 生成TTT FFF TT
> rep(c(T,F,T),each = 3,length.out = 8)
[1] TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE
我们上面的操作只让每个值都重复了两次,现在我们想让整体进行重复,我们目前的参数好像很难进行指定了,这就需要新的参数,times参数,指定整体的重复次数
# 生成 123 123 123
> rep(c(1,2,3),times = 3)
[1] 1 2 3 1 2 3 1 2 3
# 参数还可以一起进行指定
> rep(c(1,2,3),times = 2,each = 3)
[1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3
最后,rep函数还有一组操作,就是使用向量来指定重复次数,
# 生成1 22 333
> rep(c(1,2,3),c(1,2,3))
[1] 1 2 2 3 3 3
(注意,使用了向量指定次数以后不可以再使用times和each)
上面就是今天的所有内容了,从取向量的长度开始,然后到如何生成等差序列,以及各种各样的生成重复值的方法。这些内容都是非常实用的知识,必须要认真的掌握,了解每个内容的使用方法,才能再后面的操作中更好的应用。
下次内容更精彩哦,关注不迷路!
如果你喜欢我的文章,请收藏我的文章并且给我个赞,你的支持就是我更新的最大的动力,关注我会有更多惊喜哦,专注于生物信息学以及数据分析入门和进阶教程,也许我给不了你从10-100,但是我可以给你最好的从0-10!
最后,关注我的公众号,领取更多学习资料吧!!!
打开v搜索,”轻松玩转生信“或者从下面文章进去获取二维码关注哦