![R语言:迈向大数据之路](https://wfqqreader-1252317822.image.myqcloud.com/cover/909/27110909/b_27110909.jpg)
4-1 数值型的向量对象
数值型的向量对象可分为规则型的数值向量对象或不规则型的数值向量对象。
4-1-1 建立规则型的数值向量对象应使用序列符号
从起始值到最终值,每次递增1,如果是负值则每次增加-1。例如从1到5,可用1:5的方式表达。从11到16,可用11:16的方式表达。在“1:5”或“11:16”的表达式中的“:”符号,即冒号,在R语言中称其为序列符号(Sequence)。
实例ch4_1:使用序列号“:”建立向量对象。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00113.jpg?sign=1739527455-U1mSmZmp1gKffTmDtaiEHhWVUp4tQUSX-0-3e814d1c85193da6abb60b2b81a4d6a9)
这种方式也可以应用于负值,每次增加-1。例如,从-3到-7,可用-3:-7的方式表达。
实例ch4_2:使用序列号建立含负数的向量对象。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00114.jpg?sign=1739527455-hlYC1p5uM3tBjXfeK7JyrTnEJ4yu2W0u-0-4b3510ee041df0cce2e520761536d564)
同理,这种方式也可以应用于实数,每次增加正1或-1。
实例ch4_3:使用序列号建立实数的向量对象。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00115.jpg?sign=1739527455-ziSr0UqEsKAYOC48MQllCX6zfVGdmyTm-0-44d797d29381b0de4051decc4436e19c)
在建立向量对象时,如果写成1.5:4.7,结果会如何呢?这相当于建立含下列元素的向量对象,1.5、2.5、3.5、4.5共4个元素,至于多余部分即4.5至4.7之间的部分则可不理会。若向量对象的元素为负值时,依此类推。
实例ch4_4:另一个使用序列号建立实数的向量对象。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00116.jpg?sign=1739527455-3WcGwcFWCfX7jA9syk0nnqS7hiGkbhu3-0-bda1d9d2e8d5a47d4bdfc977415d6995)
4-1-2 简单向量对象的运算
向量对象的一个重要功能是向量对象在执行运算时,向量对象内的所有元素将同时执行运算。
实例ch4_5:将每一个元素加3的执行情形。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00117.jpg?sign=1739527455-PqlACcuswyVqXeD9oREsOYs17rrJvzgN-0-84361aec837d7a50da6dd6e61c352ddd)
一个向量对象也可以与另一个向量对象相加。
实例ch4_6:向量对象相加的实例。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00118.jpg?sign=1739527455-6eK13QzglvwJsPTq82VCKLFbHojHKTGB-0-59ed28fb5a655c64820f6855d1f07141)
读至此节,相信各位读者一定已经感觉到R语言的强大功能了,如果上述指令使用非向量语言,则需使用循环指令处理每个元素,要好几个步骤才可完成。在执行向量对象元素的运算时,也可以处理不相同长度的向量对象运算,但先决条件是较长的向量对象的长度是较短的向量对象的长度的倍数。如果不是倍数,则会出现错误信息。
实例ch4_7:不同长度的向量对象相加,出现错误信息的实例。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00119.jpg?sign=1739527455-lIp553YSMZiENTqhS6k7ceicvlkGtD68-0-f0732e5feb150b7c6476958476b070fb)
由于上述较长的向量对象有5个元素,较短向量对象有4个元素,所以较长向量的长度不是较短向量的长度的倍数,因此最后执行后出现警告信息。
实例ch4_8:不同长度的向量对象相加,较长向量对象的长度是较短向量对象的长度的倍数的运算实例。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00120.jpg?sign=1739527455-kXISpUXS3kixmaFyJoKnbbIyWzvOe3KL-0-29278289d3ebbbe23623b37b989e5040)
上述的运算规则是,向量对象y的长度与较长的向量对象的长度相同,其长度是6,较长向量对象的第1个元素与1:3的1相加,较长向量对象的第2个元素与1:3的2相加,较长向量对象的第3个元素与1:3的3相加,较长向量对象的第4个元素与1:3的1相加,较长向量对象的第5个元素与1:3的2相加,较长向量对象的第6个元素与1:3的3相加。未来如果碰上不同倍数的情况,运算规则可依此类推。
实例ch4_9:下列是另一个不同长度向量对象相加的实例。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00121.jpg?sign=1739527455-XSlWIkYY7xr7VVVohcOC8ffzuM2p00G0-0-7b20492b1ce3b407d3cb10ec123e16cc)
在上述实例中,x向量对象有5个元素,y向量对象有1个元素,碰上这种加法,相当于每个x向量元素均加上y向量的元素值。过去的实例,在输出时,笔者均直接输入向量对象变量,即可在Console窗口打印此向量对象变量的值,在此例中,可以看到第3列,即使仍是一个数学运算,Console窗口仍将打印此数学运算的结果。
4-1-3 建立向量对象函数seq()
seq()函数可用于建立一个规则型的数值向量对象,它的使用格式如下所示。
seq(from, to, by = width, length.out = numbers)
上述from是数值向量对象的起始值,to是数值向量对象的最终值,by则指出每个元素的增值。如果省略by参数,同时没有length.out参数存在,则增值是1或-1。length.out参数字段可设定seq()函数所建立的元素个数。
实例ch4_10:使用seq()建立规则型的数值向量对象。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00122.jpg?sign=1739527455-fbgi1SIRwmfjG6pN0vM8TZvJmQ0zGwnI-0-4db7e395d363b7b8282707b968fa4a89)
4-1-4 连接向量对象函数c()
c()函数中的c是concatenate的缩写。这个函数并不是一个建立向量对象的函数,只是一个将向量元素连接起来的函数。
实例ch4_11:使用c()函数建立一个简单的向量对象。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00123.jpg?sign=1739527455-dWCt6a3217Jh8ITm66eNKvGcBHLbIOCx-0-49ee2d985ce5d4e470ffc2945e02ce30)
上述x是一个向量对象,共有5个元素,分别是1、3、7、2、9。
适当地为变量取一个容易记的变量名称,可以增加程序的可读性。例如,我们想建立NBA球星Lin,2016年前6场赛季进球数的向量对象,那么假设他的每场进球数如下所示。
7, 8, 6, 11, 9, 12
此时可用baskets.NBA2016.Lin当变量名称,相信这样处理后,即使程序放再久,也可以轻易了解程序内容。
实例ch4_12:建立NBA球星进球数的向量对象。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00124.jpg?sign=1739527455-Vwui8MCH3vCXuYiaaiWIeAyLVXyN6aRX-0-1a91121d43e3c1cbcb5304383aa879e4)
如果球星Lin的进球皆是2分球,则他每场得分如下。
实例ch4_13:计算NBA球星的得分。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00125.jpg?sign=1739527455-iY8JAagqmerLSrGDGYcSdUAfMACUhICe-0-ef81123530df4577065f466342bd18c5)
假设队友Jordon前6场进球数分别是10, 5, 9, 12, 7, 11,我们可以用如下方式计算每场两个人的得分总计。
实例ch4_14:计算NBA球星Lin和Jordon的每场总得分。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00126.jpg?sign=1739527455-FV5P1FP3yoNj7dFLwIrjHOhguyKht4mm-0-073180c14b8295a36297829bec1590f0)
先前介绍可以使用c()函数,将元素连接起来,其实也可以将两个向量对象连接起来,下面是将Lin和Jordon进球连接起来,结果是一个含12个元素的向量对象的实例。
实例ch4_15:使用c()函数建立向量对象,其中c()函数内有多个向量对象参数。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00127.jpg?sign=1739527455-D4d5kQ2vQeoBDec6Y94owkyXKesuzlbb-0-4c298eea5e2ef7e4591901b335985d4b)
从上述执行结果可以看到,c()函数保持了每个元素在向量对象内的顺序,这个功能很重要,因为未来我们要讲解如何从向量对象中存取元素值。
4-1-5 重复向量对象函数rep()
如果向量对象内某些元素是重复的,则可以使用rep()函数建立这类型的向量对象,它的使用格式如下所示。
rep(x, times = 重复次数, each = 每次每个元素的重复次数, length.out = 向量长度)
如果rep()函数内只含有x和times参数,则“times =”参数可省略。
实例ch4_16:使用rep()函数建立向量对象的应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00128.jpg?sign=1739527455-N2mD37vvuW8JkUBElzuRg4cPEUPSijIu-0-78f6f2907358d08e815a19980f1c3951)
4-1-6 numeric()函数
numeric()也是一个建立函数,主要是可用于建立一个固定长度的向量对象,同时向量对象元素的默认值是0。
实例ch4_17:建立一个含10个元素的向量对象,同时这些向量对象元素的值皆为0。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00129.jpg?sign=1739527455-EXLrg8l3l3GcJB7qSeHktC4yqnFCfqfP-0-b77c19ae599c4ad45973718d8348c5d8)
4-1-7 程序语句跨行的处理
在本章4-1-5节的最后一个实例中,可以很明显看到rep()函数包含说明文字已超出一行,其实R语言是可以识别这行的命令未完,下一列是相同行的。除了上述情况外,下列是几种可能发生程序跨行的情况。
1)该行以数学符号(+、-、*、/)作结尾,此时R语言的编译程序会知道下一行是接续此行的。
实例ch4_18:以数学符号作结尾,了解程序语句跨行的处理。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00130.jpg?sign=1739527455-wFaVniKIJvpNK5wUUZAmMP8rGv8WRtoc-0-1ea06f7d20991e8379490c68072accdf)
2)使用左括号“(”,R编辑器会知道在下一行出现的片断数据是同一括号内的命令,直至出现右括号“)”,才代表命令结束。
实例ch4_19:使用左括号“(”和右括号“)”,了解程序跨列的处理。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00131.jpg?sign=1739527455-5JnIQ6oeGMDvhBK7OgcqcmtNlZgC4lIv-0-24738aa0bdebec9a285c34745a389352)
3)字符串是指双引号间的文字字符,在设定字符串时,如果有了第一个双引号,但尚未出现第二个双引号,R语言编辑器可以知道下一行出现的字符串是同一字符串向量变量的数据,但此时换行字符“/n”将被视为字符串的一部分。
有关字符串数据的概念,将在4-4节说明。
实例ch4_20:使用字符串,了解程序语句跨行的处理。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00132.jpg?sign=1739527455-KqXsZWaVctvkB5li3Ts5AeI0VAVDgSaj-0-ffddfa3a646a31d8bd0887fff3568072)