R语言教程(二)
2015-08-30 14:14
375 查看
R语言教程(二)
1.R语言的基本运算量——向量
1.1 什么是向量
向量是一组“数”的有序集合。这不是教数学,只要把握两点就好1.向量由一组“数”组成,“数”可以是一个也可以是多个;
2.这组“数”是有序的。
举个具体的例子:
(0,1,2)就是一个向量,它由0,1,2这三个“数”组成,并且这个三个“数”是有序的,也就是说(0,1,2)和(1,2,0)是两个不同向量。
在R语言中,这个“数”的概念比较广泛,可以数学上实数、复数,也可以是逻辑值,甚至是字符串。不过在以后的讨论中,很少会涉及到字符串,因为我觉得用的不多,并且我相信当大家掌握了其他的向量用法,字符串的使用也会融会贯通的。
PS:R语言对复数的表示有一个点需要注意,就是像6+i这种要表示为6+1i,即复数单位前的系数不可省略。这个影响有时还是很大的,比如sqrt(-17)是非法的,因为负数是无法开平方的,但是sqrt(-17+0i)是合法的,有一些数学基础的人应该很容易看出其中的区别。
1.2 如何创建一个向量
R语言中创建一个向量的方法实在是太多了,这里只介绍9种基础的方法,实践中向量的创建大部分是它们的组合。形式1:基本式
这是利用c()函数最基本的形式,x即表示你创建的向量(1,2,3)。这里有两点需要说明:
1.R语言中的赋值使用”<-“这个符合,虽然我们更熟悉“=”也是可以的,但很多人都用”<-“,所以请大家也继承这个习惯。
2.R语言是大小写敏感的,c()与C()对于R语言来说是不同的两个函数。
形式2:连续式
应该很容易看懂,指定起止数,按间隔为1或者-1生成向量。这种方式可以使用c()函数也可忽略。
ps:如果输入a<-0.1:3,向量a是什么样的呢?大家可以自己试试,体会其中的含义。
形式3:连续式,可以指定间隔
这里使用了seq函数,应该也很好理解,从2开始,到3为止,以间隔0.2生成向量。
形式4:连续式,指定起始、间隔和长度
这个也很好理解吧,从1开始,以间隔为1,生成长度为5的向量。
ps:seq的详细用法,大家可以使用help查询一下,方法上一篇讲过了。千万不要懒,官方文档永远是最好的帮助。
形式5:嵌套式
这实际上是利用一个已知向量生成新的向量的方法。向量e是利用向量d和“-1”组成的。
形式6:重复式
重复式使用了rep函数。向量g其实等价于c(f,f,f),但是如果要重复100次,rep(f,100)显然比c(f,f……)方便许多。向量h是将向量f中的每个元素重复3次形成的。
形式7:切片式
向量k是一个很长的向量,有时我们只需要向量k的一部分。这时我们可以使用向量index对向量k进行切片。切片的方法是使用“[]”。如图,向量m就是我使用向量k的第一个到第四个元素生成的新向量。向量index不需要是1:4这种连续的形式,index<-c(1,10,50)也是正确的。
对于有一定编程基础的人来说,向量index可以理解为向量k的下标,不过,R语言的下标是从1开始,而不是0开始。
形式8:切片式,使用负数下标
可以看出,这种方法实际上是删除向量k的第一到第四个元素。
形式9:赋值式
有时你可能需要改变向量中部分值,此时可以使用这种赋值的形式。
ps:向量的创建还有一些其他的方法,大家可以上网找找。
1.3 向量的运算
在R语言中,运算都是以向量为基础的。比如我们先前提到的3*5,实际上,在计算时应理解为c(3)*c(5)。其结果15也是一个向量,即c(15)。R语言向量的运算规则简单来说分三步:
1.将较短的向量补全,使运算符两侧的向量长度相等;
2.补全的规则是短向量重复,使其长度大于等于长向量,再按长向量的长度切片;
3.将两个向量中位置对应的两个元素,按运算符运算。
以上的说法很抽象,举个简单例子。
首先,3应理解为c(3),即图中的计算应理解为c(3)*c(1,2,3)。显然,c(3)的长度是1,而c(1,2,3)的长度是3,c(3)需要将长度补全为3,再进行计算。根据补全的规则,c(3)重复为c(3,3,3)。长度相等后,两者按位相乘,c(3*1,3*2,3*3),即c(3,6,9)。
再看一个例子。
看到警告信息了吧,两者长度不是整数倍。这种情况的运算过程中多了一个切片的动作,首先c(2,3)由于长度不够进行补全,为c(2,3,2,3),长度超过了3,就按长度3进行切片,变为c(2,3,2)。然后,c(2,3,2)*c(4,5,6)得到结果c(8,15,12)。
ps:实践中如果遇到这种长度不是整数倍的情况,要想想是不是哪里弄错了。
以上都是四则运算的例子,其实函数运算也可以作用于向量。比如:
sqrt是开方运算,上面的运算相当于c(sqrt(2),sqrt(4),sqrt(8))。
1.4 向量的类型和类型转换
前文提到,R语言的向量可以由实数、复数甚至字符串组成。那么,如何知道一个向量是由什么组成的呢?R语言提供了一个函数:mode()。例如:
mode函数会返回一个字符串表示向量的类型,如图所示向量a由复数组成,向量b由实数组成。
R语言同样提供了方法将不同类型的向量进行转换。比如想要将向量b转换为一个由字符串组成的向量c,我们可以如下操作:
as对象还有许多其他的方法用于类型转换,请自行help。