写在前面的后记

昨晚写完这一篇的时候,Chris看了之后跟我讨论道:“R语言开篇讲述的基本数据类型为什么和C语言等编程语言不同?”后来得出结论:每种语言都有其最适用的领域,以R为例,它主要运用在统计学领域,处理大量数据,基本单位就是向量(vector),故将其他语言中的int类型视为最简单的一维向量,如c(5)。我后来验证了从矩阵中取出一个值,类型为vector。同样的道理,Perl语言的基本数据类型也和其他语言不同,因为它用处不同。
学习新东西的时候,不能盲目学,要勤思考,发现不同,查阅资料,融会贯通,这才是正确的学习方法。感谢Chris的指点!

Overview

R语言是一种跨平台的开源编程语言,主要用于统计分析、绘图、数据挖掘、机器学习领域。安装教程可以参考Chris写的这篇文章:Ubuntu 12.04下R的安装。由于最近开始新项目,需要用到这方面的知识,所以学习之余将这些知识点记录下来,以便不时查阅。

1. R语言概览

R语言主要应用在三个应用场景下(按照处理数据的顺序排列):数据查询(Data Exploration)、数据挖掘(Data Mining)、数据展现(Data Presentations)。在学习的过程中发现该语言的许多用法和以前自己用过的另一门统计语言matlab有很多相近的地方。

2. R语言用法

学过多门编程语言的人一定会发现,基本上编程语言的内置函数名,都是英文单词或者其缩写,当然R语言也不例外,所以R语言的语法还是比较简单的。我们从创建向量(矩阵)开始。

2.1 创建向量和矩阵

#create v1,v2
#c()表示将数值combine,生成一个向量或列表
v1=c(1,2,4,6,2) #1 2 4 6 2
v2=c(2,1,3,5,7) #2 1 3 5 7
#row bind to a matrix
m1=rbind(v1,v2) 
#   [,1] [,2] [,3] [,4] [,5]
#v1  1    2    4    6    2
#v2  2    1    3    5    7
#column bind to a matrix
m2=cbind(v1,v2) #这一步和rbind()就是行列互换了一下,就不展示了。

v1v2的数据类型感兴趣的话,可以用mode()函数查看一下

mode(v1) #结果是数字类型numeric

我们也可以创建字符类型的向量,只需将各元素加上双引号""。当然,如果是数字和字符混合类型,则统一处理为字符类型(character)
我们也可以用m=c(1:20)这样的用法创建向量,其中m20个元素,从120,也就是说,默认的步长step为1,当然,这个是可以修改的,具体用法如下。

c(1:10-1) #将从1到10这个向量每一项都-1
c(1:10*2) #将从1到10这个向量每一项都×2

还可以进行组合:

c(1:10*2+1) #四则运算有优先级,如果不确定,最好加上括号

matrix()这个函数就可以直接创建矩阵了:

matrix(1:12,nrow=3,ncol=4)#默认按列创建矩阵

默认按列创建矩阵,如果把第四个参数byrow加上,效果就会不同了

matrix(1:12,nrow=3,ncol=4,byrow=T)

其中byrowboolean类型的参数,可取TF。需要注意的是:并没有bycol这个参数。
上面的语句和下面的语句效果是一样的:

matrix(1:12,3,4,T)

也就是说,参数名不用写。
有了矩阵,就可以进行矩阵之间的运算了,当然需要满足矩阵运算的条件,具体条件可以参考线性代数,这里就不细说了。
矩阵加减:

m1+m2 #需要两矩阵行数相等,列数相等

矩阵转置:

t(m1)

矩阵相乘:

a %*% b #须a的列数与b的行数相等

对于方针,有下面的用法:

a=matrix(1:16,nrow=4,ncol=4)
diag(a) #取对角线元素1    6    11    16
diag(diag(a)) #这个用法很有意思:以1    6    11    16为对角线,其余位置补0
diag(4) #创建单位矩阵,维度为4×4

矩阵求逆:

solve(a) #a须为方阵

上式其实是solve(a,E)的简写,其中E为单位矩阵。
solve(a,b)的普遍用法就是解方程组。
求特征值和特征向量:

eigen(a,symetric)

其中a为方阵,symmetricboolean类型,可以不写。我建议不写,因为系统会自动去判断a是否为对称阵。

我们可以查看向量的长度:length(v1).那如果对m×n的矩阵用length呢?答案是m×n
还有一点:R语言是没有size函数的。
还有一个类似的函数:

seq(1,10) #产生序列1    2    3    4    5    6    7    8    9    10

默认这个等差数列公差为1,自行设置公差方法如下:

seq(1,10,by=2) #1    3    5    7    9

上面的写法中,对于我的R语言版本R version 3.2.2可以省略by=2,其他版本的可以尝试一下。
可以指定数列长度:

seq(1,10,length=11) #1.0  1.9  2.8  3.7  4.6  5.5  6.4  7.3  8.2  9.1 10.0

需要注意,公差和长度只能存在一个,不能同时使用。

2.2 从向量或矩阵中取值

我们要是想取出来向量或者矩阵当中某个元素只需v1[3]或者m1[2,3],若矩阵取值时,方括号中仅有1个数字,则按照首行首列的位置,沿列方向,若到达列尾,则继续沿着下一列的首行位置查询取值。需要注意的是,R语言取值的下标和其他编程语言从开始不同,它是从1开始的。
如果方括号中为负数,例如:

v1[-2] #将v1[2]从向量中剔除,剩余的部分将是结果
# 1    4    6    2

也可以这样连续取值:

v1[1:3] #1    2    4 

非连续取值:

v1[c(1,3,5)] #1    4    2

还有一种常见的错误写法:

v1[1,3,5] #提示“量度数目不对”

按条件取值:

v1[v1>1 & v1<5] #取出大于1且小于5的数字

以上,如果语法正确但是没有符合条件的数据,则返回:

numeric(0) #数目为0

查询下标值的函数:

which()

用法如下:

v=c(2,5,1,4,7,2,5,6,8)
which.max(v)
which.min(v)
which(v>3)
which(v==2)

以上写法返回的都是下标。
还可以排序以及逆序:

sort() #默认从小到大排列
rev() #逆序排列

2.3 求统计数据

x=c(1:100)

mean(x) #平均值mean
sum(x) #和sum
max(x) #最大数maximum
min(x) #最小数minimum
var(x) #方差variance
prod(x) #积product
sd(x) #标准差standard deviation