R语言应用

文章参考  << R 数据分析  —— 方法与案例详解  >>

R的官方网站是http://www.r-project.org,

在R官方主页点击download  R,然后选择对应的镜像后,在右侧下载和安装包栏目里会

出现三种操作系统的R版本(Linux、(Mac)  OS  X、Windows),选择点击相应的操作系

统后,再选择点击base就会进入R的下载页面,在页面上会出现R的最新版本和安装说明等

不过,要使用RStudio,除了安装R开发环境后,还需要到

http://www.rstudio.org/download/desktop/ 

上下载适合你电脑的RStudio版本并安装。 

 R的安装包有几种方法,这里主要介绍其中两种方法: 

      (1)在线安装。 

        比如需要安装”class”这个扩展包,输入命令install.packages(“class”)执行即可。 

        也可以同时安装多个包,比如需同时安装“class”,“cluster”两个包,输入命

令install.packages(c(“class”,”cluster”)  )。 

(2)利用Rstudio安装。 

       Rstudio在下一节将会详细介绍。

在Rstudio右下角栏目里点

击“packages”然后再点击  “install

 packages”,  会出现如图的对话框,

在packages对话框里输入需要安装的

包名,比如输入  class,就可以安装包

工作路径设置的函数 

函数   功能 

getwd()   显示当前工作目录 

setwd(“mydir”)   修改当前工作目录 

ls()   列出当前工作空间的所有对象 

rm()   删除一个或多个对象 

help(options)   显示可用选项的说明 

save.image(“myfile”)   保存工作空间到文件myfile.RData中 

load(“myfile”)   读取一个工作空间myfile.RData 

q()   退出。并询问是否保存当前工作空间 

二.R数据结构和基本运算

       R语言的数据类型主要有:包括数值型、逻辑型、字符型、复数型,原型  。此外,也可以

是缺省值。 

       1、数值型(numeric) 

       这种数据的形式是实数。可以写成整数(integers),小数(decimal  fractions),或

科学记数(scientific  notation)的方式。数值型实际上是两种独立模式的混合说法,即整数

型(integers)和双精度型(double-precision)。该种类型数据默认是双精度型数

据(double-precision)。 

       2、字符型(character) 

       这种数据的形式是夹在双引号“”或单引号‘  ’之间的字符串,如“MR”。 

       3、逻辑型(logical) 

       这种数据只能取T(TRUE)或F(FALSE)值。 

   

       4、复数型(complex) 

       这种数据是形如a+bi形式的复数。 

       5、原味(原始)型(raw) 

       这种类型以二进制形式保存数据。 

       6、缺省值(missing  value) 

       有些统计资料是不完整的。当一个元素或值在统计的时候是“不可得到”(not

 available)或“缺失值”(missing  value)的时候,相关位置可能会被保留并且赋予一个

特定的NA(not  available)值。任何NA的运算结果都是NA。is.na()用来检测数据是否缺失

,如果数据缺失,则返回TRUE,否则,返回FALSE。 

   

例如: 

>  z<-c(1:5,NA)   #生成向量z 

>  z   #返回z向量的结果 

[1]   1   2   3   4   5  NA 

>  is.na(z)  #识别z向量的值是否有缺失值 

[1]  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE 

上面,我们用c()函数首先生成了向量z,  c()函数的具体使用方法详见2.2.1。is.na()返回的结果

是前面5个元素都FALSE,最后1个是TRUE,这说明前面5个都不是缺失值,最后1个是缺失值。 

   

 

数据类型   辨别函数   转换函数 

numeric   is.numeric()   as.numeric() 

character   is.character()   as.character() 

complex   is.complex()   as.complex() 

double   is.double()   as.double() 

integer   is. integer()   as. integer() 

logical   is. logical()   as. logical() 

NA   is.na()   as.na() 

常见的辨别和转换对象类型的函数如下表: 

表2-1   辨别和转换数据对象类型的函数 

  R语言里的数据对象主要有六种结构:

l??向量(vector)

l??矩阵(matrix)

l??数组(array)

l??因子(factor)

l??列表(list)

l??数据框(data frames)

       不过在这之前,我们先了解一下R在浮点运算中的一些精度问题。

  例如:(0.6>0.6?) 

>  x  <-  seq(0,  1,  by  =  0.2)   #seq()生成序列的函数,详见2.2.1部分 

>  y  <-  seq(0,  1,  by  =  0.2)  

>  y[4]  

[1]  0.6 

>  x[3]  

[1]  0.4 

>  1  -  x[3]  

[1]  0.6 

>  y[4]  >  1  -  x[3]  

[1]  TRUE 

        注意:这也是在计算机运算里面经常出现的一个问题(不过表示出来结果这样其实应该

算是R的缺陷,稍微高级的数学运算软件一般都会通过一些方法来克服),简单来说就是浮点

数在计算机中的表达有限制,不能以任意精度存储,所以尤其是微小的数字或巨大的数字在

运算时经常会有些意外情况。

因此有时候在处理R里面的数据的时候,特别是在判断的时候,需要特别注意精度问题。

       (1)向量赋值    

        向量(vector)是由有相同基本类型元素组成的序列,相当于一维数组。

        例:> x <-c(1,3,5,7,9) #用c( )构建向量

        这是一个用函数c( )完成的赋值语句。这里的函数c( )可以有任意多个参数,而它输出的

值是一个把这些参数首尾相连形成的一个向量。 

      “#”符号后面跟的是注释,在写程序的时候清楚表明程序工作的注释能大大提高程序的可

读性。 

      “<-”是赋值符号,表示把<-后面的内容赋值给<-前面的内容,R的赋值符号除了“<-”外,

还有“->”、“=”,  ->的用法和<-的用法正好相反。

注意:R也允许“=”赋值,但不是标准语法,有些情况下用“=”有可能会出现问题,因此一

般情况不建议使用“=”。

  例如:

> c(1,3,5,7,9) -> y #将c()生成的数值向量赋值给y

> y

[1] 1 3 5 7 9

> z <- c("Male","Female","Female","Male","Male") #将c()生成的字符向量赋值给z

> z

[1] "Male" "Female" "Female" "Male" "Male"

> u=c(TRUE,FALSE,TRUE,FALSE,FALSE) #将c()生成的逻辑向量赋值给u

> u

[1] TRUE FALSE TRUE FALSE FALSE

       此处,y是数值向量,z是字符型向量,u是逻辑型向量。 

        注意:单个向量中的数据要求是相同类型,同一向量中无法混杂不同类型的数据。

        对于字符向量,一个很重要的函数paste()可以把自变量对应元素连成一个字符串,长

度不相同时,较短的向量被重复使用。

例如:

> v<-paste("x",1:5,sep="")

> v

[1] "x1" "x2" "x3" "x4" "x5“

        此外,也可以用assign()函数对向量进行赋值。例如:

> assign("w",c(1,3,5,7,9))

> w

[1] 1 3 5 7 9

 

       (2)向量运算

对于向量的乘法,除法,乘方运算,其方法是对应向量的每个分量做乘法、除法和乘方运算。

例如:>x <-c(1,3,5,7,9)

> c(1,3,5,7,9) -> y

> x * y #对应元素相乘 

[1] 1 9 25 49 81

> x / y

[1] 1 1 1 1 1

> x^2

[1] 1 9 25 49 81

> y^x

[1] 1 27 3125 823543 387420489

       (2)向量运算

        此外,”%/%”表示整数除法(5%/%3为1),”%%”表示求余数(5%%3为2)。 

        向量运算会对该向量的每一个元素都进行同样的运算。出现在同一个表达式的向量最好

同一长度。如果长度不一,表达式中短的向量将会被循环使用,表达式的值将是一个和最长

的向量等长的向量。 

       例如: 

> c(1,3,5)+c(2,4,6,8,10)

[1] 3 7 11 9 13

第一个向量的长度小于第二个向量,循环补齐第一向量的长度,即为c(1,3,5,1,3)

       (3)生成有规则序列

l??R可以产生正则序列,最简单的是用“::”符号,就可以产生有规律的正则序列。例如:

> (t <- 1:10)

[1] 1 2 3 4 5 6 7 8 9 10

> (r <- 5:1)

[1] 5 4 3 2 1

> 2*1:5

[1] 2 4 6 8 10

        其中,5:1表示逆向序列, 并且在表达式运算中,“:”的运算级别最高,即上面的2*1:5

,R是先生成1-5的向量,然后再乘上2。这里在表达式外面套()的意思把结果直接打印出来,

比如>t <- 1:10而不套括号,则R将运算结果保存在t对象里,但是不会把t的结果打印出来。

2.2.1 向量

       (3)生成有规则序列

l??可以用函数seq()产生有规律的各种序列,其句法是:seq(from, to, by),from表示序列的

起始值,to表示序列的终止值,by表示步长。其中,by参数(参数by)省略时,默认步长为1

。并且函数seq()也可以产生降序数列。例如:

> seq(1,10,2) #生成从1开始,10结束,步长为2的序列 

[1] 1 3 5 7 9

> seq(1,10) #默认步长为1

[1] 1 2 3 4 5 6 7 8 9 10

> seq(10,1,-1) #步长为-1

[1] 10 9 8 7 6 5 4 3 2 1

2.2.1 向量

       (3)生成有规则序列

       有时候我们需要关注的是数列的长度,这时我们可以操作如下: 

> seq(1,by=2,length=10)

[1] 1 3 5 7 9 11 13 15 17 19



       (3)生成有规则序列

l??rep()函数可以用各种复杂的方式重复一个对象。其命令是:rep(x, times, ...),其中x表示要

重复的对象,times表示重复的次数。

> rep(c(1,3),4) #将c(1,3)向量重复4次 

[1] 1 3 1 3 1 3 1 3

> rep(c(1,3),each=4)

[1] 1 1 1 1 3 3 3 3

> rep(1:3,rep(2,3))

[1] 1 1 2 2 3 3

       第一个是向量c(1,3)重复4次的情况,也可以用第二个对每个元素进行重复,第三个是函

数rep( )的嵌套使用,里层的rep(2,3)实际就等价于向量c(2,2,2)。

2.2.1 向量

 

       (4)向量的常见函数

        向量里元素的个数称为向量的长度(length)。长度为1的向量就是常数(或标量)。函

数length()可以返回向量的长度,mode()可以返回向量的数据类型,min()返回向量的最小值

,max()返回向量的最大值,range()返回向量的范围,which.min()、which.max()返回在第几

个分量求到最小、最大值。例如:

>x <-c(1,3,5,7,9)

> length(x)

[1] 5

> min(x)

[1] 1

> range(x)

[1] 1 9

       

 

       (4)向量的常见函数

R提供了很多的函数可以对向量进行运算,这里不一  一列举,下面列出几个常用函数表。

函数   用途   函数   用途 

sum()   求和   rev()   反排序 

max()   求最大值   rank()   求秩 

min()   求最小值   append()   添加 

range()   求极差(全矩)  replace()   替换 

mean()   求均值   match()   匹配 

median  ()   求中位数   pmatch()  部分匹配 

var()   求方差   all()   判断所有 

sd()   求标准差   any()   判断部分 

sort()   排序   prod()   积 

表2-2   对向量运算常见函数表 

      

       (5)向量的索引 

l??在R中提供了灵活的向量下标运算。取出向量的某一个元素可以用x[i]。也可以通过赋值语

句来改变一个或多个元素的值。例如: 

>  x  <-  c(1,3,5) 

>  x[2]   #返回x向量的第2元素 

[1]  3 

>(c(1,2,3)+4)[2]  

#先进行向量运算c(1,2,3)+4,再返回该

向量的第2个元素 

[1]  6 

>  x[2]  <-  10  #将10赋值给x向量的第2个

元素,,即替换掉原来的值 

>  x 

[1]   1  10   5 

>  x[c(1,3)]  <-  c(9,11)  #将9和11赋值给x

向量的第1和第3个元素 

>  x 

[1]   9  10  11 

2.2.1 向量

?>  x  <-  c(1,3,5) 

?>  x  <  4   

?#返回逻辑结果,即x向量的元素是否小于4 

?[1]   TRUE   TRUE  FALSE 

?>  x[x<4]  #返回x向量里小于4的元素 

 ?[1]  1  3 

?>  z  <-  c(-1,1:3,NA) 

?>  z 

?[1]  -1   1   2   3  NA 

>  z[is.na(z)]  <-  0  #将0赋值给z向量里的N

A值 

>  z 

[1]  -1   1   2   3   0 

>  z  <-  c(-1,1:3,NA) 

y  <-  z[!is.na(z)]  

#将z里的非缺失值赋值给y 

>  y 

[1]  -1   1   2   3 

l??       把i换成逻辑语句也可以对向量进行逻辑运算。例如: 

2.2.1 向量

?>  x<-c(-3,-2,-1,0,5,7) 

?>  y  <-  numeric(length(x))  

?#生成于x向量长度相同的数值型向量 

 ?>  y 

?[1]  0  0  0  0  0  0 

?>  y[x<0]  <-  1-x[x<0]  

?#求出x中小于0元素对应位置,y对应位

置的值用1-x[x<0]替代 

>  y 

[1]  4  3  2  0  0  0 

>y[x>=0]  <-  1+x[x>=0]   

#求出x中大等于0元素对应位置,y对应位

置的元素用1-x[x<0]赋值 

>  y 

[1]  4  3  2  1  6  8 

第二章     数据结构与基本运算

l??       这种方法可以用在对分段函数的定义上。例如: 

l??       如果x[i],i取值是小于0的负整数,则表示删除相应位置的元素。 

        矩阵(matrix)是将数据用行和列排列的长方形表格,它是二维的数组,其单元必须是

相同的数据类型。通常用列来表示不同的变量,用行表示各个对象。R语言生成矩阵的函数

是matrix ( ),其句法是: 

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

其中,data 项为必要的矩阵元素,nrow 为行数,ncol 为列数,注意  nrow 与  ncol 的乘积应为

 矩阵元素个数, dimnames 给定行和列的名称,byrow 项控制排列元素时是否按行进行,默

认byrow=FALSE,即按列顺序排列。 

  例如:> matrix(1:12,nrow=4,ncol=3) #默认按列填充 

       [,1] [,2] [,3]

[1,] 1 5 9

[2,] 2 6 10

[3,] 3 7 11

[4,] 4 8 12

> matrix(1:12,nrow=4,ncol=3,byrow=T) #按行填充 

       [,1] [,2] [,3]

[1,] 1 2 3

[2,] 4 5 6

[3,] 7 8 9

[4,] 10 11 12

        矩阵的运算种类多,方法多,此处作简要介绍。

l??矩阵的转置可以用函数t()来计算,类似的,若将函数  t()作用于一个向量x,则当做x为列向量,

返回结果为一个行向量。若想得到一个列向量,可用  t(t(x))。 

>  (A  <-  matrix(1:12,nrow=3,ncol=4)) 

       [,1]  [,2]  [,3]  [,4] 

[1,]     1     4     7    10 

[2,]     2     5     8    11 

[3,]     3     6     9    12 

>  t(A) 

       [,1]  [,2]  [,3] 

[1,]     1     2     3 

[2,]     4     5     6 

[3,]     7     8     9 

[4,]    10    11    12 

        矩阵的运算种类多,方法多,此处作简要介绍。

l??矩阵的加减法 

>A  <-  B  <-  matrix(1:12,nrow=3)  

#将生成的矩阵赋给B,同时又赋给A 

>  A+B 

       [,1]  [,2]  [,3]  [,4] 

[1,]     2     8    14    20 

[2,]     4    10    16    22 

[3,]     6    12    18    24 

l??矩阵的数乘 

>  3*A 

       [,1]  [,2]  [,3]  [,4] 

[1,]     3    12    21    30 

[2,]     6    15    24    33 

[3,]     9    18    27    36 

        矩阵的运算种类多,方法多,此处作简要介绍。

l??矩阵的乘法,除了矩阵需要满足可以相乘的要求之外,在R中需要用运算符“%*%”来进行

计算。“*”运算只是对应的元素相乘。如果要计算t(A)%*%B还可以用函数crossprod(A,B),

这种计算的效率更高。

> B <- t(A)

> A%*%B

[,1] [,2] [,3]

[1,] 166 188 210

[2,] 188 214 240

[3,] 210 240 270

  l??R中还可以对矩阵的对角元素进行计算,例如要取一个方阵的对角元素:

> (A <- matrix(1:16,nrow=4))

[,1] [,2] [,3] [,4]

[1,] 1 5 9 13

[2,] 2 6 10 14

[3,] 3 7 11 15

[4,] 4 8 12 16

> diag(A)

[1] 1 6 11 16

 

另外,对一个向量应用diag()函数可以产生以这样向量的元素为对角元的对角矩阵 

> diag(diag(A))

[,1] [,2] [,3] [,4]

[1,] 1 0 0 0

[2,] 0 6 0 0

[3,] 0 0 11 0

[4,] 0 0 0 16

        如果输入只有一个正整数的话,diag()函数将会生成一个对应维数的单位阵。

> diag(3)

[,1] [,2] [,3]

[1,] 1 0 0

[2,] 0 1 0

[3,] 0 0 1

 

l??求逆,在R中使用solve()函数可以计算,如果是solve(a,b)的话是解线性方程组ax=b,b默

认为单位矩阵。

> (A <- matrix(rnorm(16),4,4)) #rnorm()是生成16个标准正态分布随机数 

            [,1] [,2] [,3] [,4]

[1,] 0.44576927 -0.9841294 -0.1291554 0.18165406

[2,] 1.04034856 1.3658480 -0.6905046 0.06254394

[3,] -0.02689138 -0.5389127 -0.1356344 1.71923910

[4,] -0.05693438 1.4905866 -0.2479709 0.03399939

> solve(A)

[,1] [,2] [,3] [,4]

[1,] -4.538443 2.6321129 0.4872459 -5.232100

[2,] -1.936148 0.7670728 0.2011416 -1.237585

[3,] -10.806250 4.0894901 1.1996337 -10.448150

[4,] -1.530421 0.6042453 0.7469654 -1.294048

  l??求特征值和特征向量的运算,在R中可以通过函数eigen()来得到。

> (A <- diag(4)+1)

[,1] [,2] [,3] [,4]

[1,] 2 1 1 1

[2,] 1 2 1 1

[3,] 1 1 2 1

[4,] 1 1 1 2

> (A.eigen <- eigen(A,symmetric=T))

$values #此处返回的结果是列表格式,具体详见2.2.5

[1] 5 1 1 1

$vectors

[,1] [,2] [,3] [,4]

[1,] -0.5 0.8660254 0.0000000 0.0000000

[2,] -0.5 -0.2886751 -0.5773503 -0.5773503

[3,] -0.5 -0.2886751 -0.2113249 0.7886751

[4,] -0.5 -0.2886751 0.7886751 -0.2113249

 

l??对于正定矩阵A,可以对其进行Choleskey分解,即A=P T P,其中P为上三角矩阵,在R中

可以用函数chol()进行Choleskey分解。 

>  chol(A) 

         [,1]       [,2]       [,3]       [,4] 

[1,]  1.414214  0.7071068  0.7071068  0.7071068 

[2,]  0.000000  1.2247449  0.4082483  0.4082483 

[3,]  0.000000  0.0000000  1.1547005  0.2886751 

[4,]  0.000000  0.0000000  0.0000000  1.1180340 



 

      若矩阵为对称正定阵,则可以利用Choleskey分解来求行列式的值以及矩阵的逆,并且这

种用法更有效。 

>  prod(diag(chol(A))^2)#求出A矩阵的对角元素,然后求平方,再求连乘积 

[1]  5 

>  det(A)  #求A矩阵行列式 

[1]  5 

>  chol2inv(chol(A))  求Choleskey分解后的逆 

     [,1]  [,2]  [,3]  [,4] 

[1,]   0.8  -0.2  -0.2  -0.2 

[2,]  -0.2   0.8  -0.2  -0.2 

[3,]  -0.2  -0.2   0.8  -0.2 

[4,]  -0.2  -0.2  -0.2   0.8 

  l??奇异值分解: 

    若A为m行n列矩阵,秩为r,则矩阵可以进行奇异值分解得到A=UDV T 。在R中可以通过svd(

)函数进行计算。    $u 

           [,1]         [,2]        [,3] 

[1,]  -0.5290354   0.74394551   0.4082483 

[2,]  -0.5760715   0.03840487  -0.8164966 

[3,]  -0.6231077  -0.66713577   0.4082483 

$v 

            [,1]         [,2]        [,3] 

[1,]  -0.07736219  -0.71960032  -0.4076688 

[2,]  -0.19033085  -0.50893247   0.5745647 

[3,]  -0.30329950  -0.29826463  -0.0280114 

[4,]  -0.41626816  -0.08759679   0.2226621 

[5,]  -0.52923682   0.12307105  -0.6212052 

[6,]  -0.64220548   0.33373889   0.2596585 

>  (A  <-  matrix(1:18,3,6)) 

     [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 

[1,]     1     4     7    10    13    16 

[2,]     2     5     8    11    14    17 

[3,]     3     6     9    12    15    18 

>(A.svd  <-  svd(A))  

#求矩阵A的svd分解,并将结果赋值给A.svd 

$d 

[1]  4.589453e+01  1.640705e+00  1.366522e-15 

  l?? QR分解: 

     实数矩阵A的QR分解是把A分为A=QR,这里的Q是正交矩阵,而R是上三角矩阵。QR分

解在R中可以用函数qr()计算.其中,rank项返回矩阵的秩,qr项包含了矩阵Q和R的信息,

要得到对应矩阵,可以用函数qr.R(),qr.Q()计算。 

2.2.2 矩阵

第二章     数据结构与基本运算

  l?? QR分解。例如: 

>  B  <-  matrix(1:16,4,4) 

>  qr(B) 

$qr 

           [,1]         [,2]           [,3]           [,4] 

[1,]  -5.4772256  -12.7801930  -2.008316e+01  -2.738613e+01 

[2,]   0.3651484   -3.2659863  -6.531973e+00  -9.797959e+00 

[3,]   0.5477226   -0.3781696   1.601186e-15   2.217027e-15 

[4,]   0.7302967   -0.9124744  -5.547002e-01  -1.478018e-15 

$rank  #矩阵的秩 

[1]  2 

$qraux  #Q中的额外信息 

[1]  1.182574e+00  1.156135e+00  1.832050e+00  1.478018e-15 

$pivot  #分解过程中的旋转信息 

[1]  1  2  3  4 

attr(,"class")  #返回属性 

[1]  "qr" 

  l?? QR分解。 

例如: 

>  qr.R(qr(B))  #提取R矩阵 

          [,1]        [,2]           [,3]           [,4] 

[1,]  -5.477226  -12.780193  -2.008316e+01  -2.738613e+01 

[2,]   0.000000   -3.265986  -6.531973e+00  -9.797959e+00 

[3,]   0.000000    0.000000   1.601186e-15   2.217027e-15 

[4,]   0.000000    0.000000   0.000000e+00  -1.478018e-15 

>  qr.Q(qr(B))  #提取Q矩阵 

           [,1]           [,2]        [,3]         [,4] 

[1,]  -0.1825742  -8.164966e-01  -0.4000874  -0.37407225 

[2,]  -0.3651484  -4.082483e-01   0.2546329   0.79697056 

[3,]  -0.5477226  -1.665335e-16   0.6909965  -0.47172438 

[4,]  -0.7302967   4.082483e-01  -0.5455419   0.04882607 

  l??可用kronecker()来计算矩阵的Kronecker积。 



m×n

>  (A  <-  matrix(1:4,2,2)) 

      [,1]  [,2] 

[1,]     1     3 

[2,]     2     4 

>  kronecker(A,B) 

       [,1]  [,2]  [,3]  [,4] 

[1,]     1     1     3     3 

[2,]     1     1     3     3 

[3,]     2     2     4     4 

[4,]     2     2     4     4 

>  (B  <-  matrix(rep(1,4),2,2)) 

       [,1]  [,2] 

[1,]     1     1 

[2,]     1     1 

  l??在R中可使用dim()得到矩阵的维数,nrow()求行数,ncol()求列数;  rowSums()求各行和,

 rowMeans()求行均值,  colSums()求各列和,  colMeans()求列均值。 

l??计算X T X这样的矩阵逆,例如OLS中的系数矩阵。在R的strucchange包里面有函

数solveCrossprod()函数可以很方便的计算。其具体形式如下: 

     solveCrossprod(X,  method  =  c("qr",  "chol",  "solve")) 

      对于method中的求逆方法,qr效率最高,chol精度最高,而solve与solve(crossprod(x,x)

)的效果相同。例如: 

>  A  <-  matrix(rnorm(16),4) 

>  solveCrossprod(A,method="qr")  #利用qr分解方法求逆矩阵 

           [,1]        [,2]       [,3]        [,4] 

[1,]   1.5752935   0.3617794  -1.269400   1.5530569 

[2,]   0.3617794   0.2996626  -0.139547   0.4616545 

[3,]  -1.2694003  -0.1395470   1.741550  -1.1275450 

[4,]   1.5530569   0.4616545  -1.127545   2.1345205 

  l?? 计算X T X这样的矩阵逆  ,在R的strucchange包里面有函数solveCrossprod()函数可以很

方便的计算。 

续例: 

>  solveCrossprod(A,method="chol")  #利用Choleskey分解方法求逆矩阵 

           [,1]        [,2]       [,3]        [,4] 

[1,]   1.5752935   0.3617794  -1.269400   1.5530569 

[2,]   0.3617794   0.2996626  -0.139547   0.4616545 

[3,]  -1.2694003  -0.1395470   1.741550  -1.1275450 

[4,]   1.5530569   0.4616545  -1.127545   2.1345205 



  l?? 计算X T X这样的矩阵逆  ,在R的strucchange包里面有函数solveCrossprod()函数可以很

方便的计算。 

续例: 

>  solveCrossprod(A,method="solve") 

           [,1]        [,2]       [,3]        [,4] 

[1,]   1.5752935   0.3617794  -1.269400   1.5530569 

[2,]   0.3617794   0.2996626  -0.139547   0.4616545 

[3,]  -1.2694003  -0.1395470   1.741550  -1.1275450 

[4,]   1.5530569   0.4616545  -1.127545   2.1345205 

>  solve(crossprod(A,A)) 

           [,1]        [,2]       [,3]        [,4] 

[1,]   1.5752935   0.3617794  -1.269400   1.5530569 

[2,]   0.3617794   0.2996626  -0.139547   0.4616545 

[3,]  -1.2694003  -0.1395470   1.741550  -1.1275450 

[4,]   1.5530569   0.4616545  -1.127545   2.1345205 

  l??可使用lower.tri(),upper.tri()提取到矩阵的上三角和下三角矩阵。结果返回为逻辑矩阵,

其中diag为T时包含对角元,默认不含对角元。 

     lower.tri(x,  diag  =  FALSE)  

     upper.tri(x,  diag  =  FALSE) 

例如: 

>  lower.tri(A,diag=T) 

     [,1]   [,2]   [,3]   [,4] 

[1,]  TRUE  FALSE  FALSE  FALSE 

[2,]  TRUE   TRUE  FALSE  FALSE 

[3,]  TRUE   TRUE   TRUE  FALSE 

[4,]  TRUE   TRUE   TRUE   TRUE 

>  A[lower.tri(A)]=0 

>  A 

     [,1]  [,2]  [,3]  [,4] 

[1,]     1     5     9    13 

[2,]     0     6    10    14 

[3,]     0     0    11    15 

[4,]     0     0     0    16 

>  A  <-  matrix(1:16,4) 

>  lower.tri(A) 

      [,1]   [,2]   [,3]   [,4] 

[1,]  FALSE  FALSE  FALSE  FALSE 

[2,]   TRUE  FALSE  FALSE  FALSE 

[3,]   TRUE   TRUE  FALSE  FALSE 

[4,]   TRUE   TRUE   TRUE  FALSE 

  l??在R中定义了row()和col()函数用来返回矩阵的行列下标。另外,也可以通过使

用x[row(x)<col(x)]=0等语句来得到矩阵的上下三角矩阵。 

例如: 

>  col(A) 

     [,1]  [,2]  [,3]  [,4] 

[1,]     1     2     3     4 

[2,]     1     2     3     4 

[3,]     1     2     3     4 

[4,]     1     2     3     4 

>  A[row(A)<col(A)]=0 

>  A 

     [,1]  [,2]  [,3]  [,4] 

[1,]     1     0     0     0 

[2,]     2     6     0     0 

[3,]     3     7    11     0 

[4,]     4     8    12    16 

>  A  <-  matrix(1:16,4) 

>  row(A) 

     [,1]  [,2]  [,3]  [,4] 

[1,]     1     1     1     1 

[2,]     2     2     2     2 

[3,]     3     3     3     3 

[4,]     4     4     4     4 

l??矩阵中计算行列式的值可以使用函数det()来计算,例如对上面的下三角矩阵求行列式: 

>  det(A) 

[1]  1056 

  l??在R的使用过程中,经常需要将矩阵转化为向量化算子,编写一个小函数即可实现。 

例如: 

>  vec(A) 

     [,1] 

[1,]     1 

[2,]     2 

[3,]     3 

[4,]     4 

[5,]     5 

[6,]     6 

>  vec  <-  function(x){ 

+    t(t(as.vector(x)))  

+    }  

#函数编写详细请见3.4 

>  (A  <-  matrix(1:6,2,3))  

     [,1]  [,2]  [,3] 

[1,]     1     3     5 

[2,]     2     4     6 



  l??在时间序列分析中,常常需要用到滞后序列,R中的fMultivar包中的函数tslag()可以实现

。首先,我们需要安装fMultivar,然后再载入该包。  tslag的用法为 

     tslag(x,  k  =  1,  trim  =  FALSE) 

其中,x为一个向量,k为滞后期数,trim默认返回序列与原序列长度相同,但包含NA值,

若trim=T,则返回不含NA值。例如: 

>  tslag(x,1:4,trim=T) 

     [,1]  [,2]  [,3]  [,4] 

[1,]     4     3     2     1 

[2,]     5     4     3     2 

>  x  <-  1:6 

>  tslag(x,1:4,trim=F) 

     [,1]  [,2]  [,3]  [,4] 

[1,]    NA    NA    NA    NA 

[2,]     1    NA    NA    NA 

[3,]     2     1    NA    NA 

[4,]     3     2     1    NA 

[5,]     4     3     2     1 

[6,]     5     4     3     2 

   l??对于矩阵的运算,我们还可以使用apply()函数来进行各种计算,其用法为 

     apply(X,  MARGIN,  FUN,  ...)   。其中,X表示需要处理的数据,MARGIN表示函数的作用

范围,1为对行运算,2为对列运算。FUN为需要运用的函数。例如: 

A  <-  matrix(1:12,3,4) 

>  apply(A,2,sum)  #矩阵的列求和 

[1]   6  15  24  33 

>  apply(A,2,mean)  #矩阵的列求均值 

[1]   2   5   8  11 

>  apply(A,2,var)  #矩阵的列求方差 

[1]  1  1  1  1 

>  apply(A,2,sd)  #矩阵的列求标准差 

[1]  1  1  1  1 

  l??矩阵合并可以使用rbind()和cbind()函数来对矩阵按照行和列进行合并。例如: 

>  B=matrix(c(1,1,1,1),2,2)  #生成2×2的矩阵 

>  rbind(B,B)  #将B和B矩阵按行合并 

     [,1]  [,2] 

[1,]     1     1 

[2,]     1     1 

[3,]     1     1 

[4,]     1     1 

>  cbind(B,B)  #将B和B矩阵按列合并 

     [,1]  [,2]  [,3]  [,4] 

[1,]     1     1     1     1 

[2,]     1     1     1     1 

  l??对于得到的矩阵,可以使用A[i,j]得到A矩阵第i行第j列的元素,A[i,]和A[,j]分别表示返回第i

行和第j列的所有元素。也可以使用A[i:k,j:l]的形式来获得多行多列的子矩阵。 

例如: 

>  A=matrix(1:12,3,4) 

>  A[2,3]  #返回矩阵第2行第3列元素 

[1]  8 

>  A[2,]  #返回矩阵第2行所有元素 

[1]   2   5   8  11 

>  A[,3]  #返回矩阵第3列所有元素 

[1]  7  8  9 

>  A[1:3,2]  #返回矩阵第1到3行,且是第2列的元素 

[1]  4  5  6 



l??使用as.matrix()把非矩阵格式的转换成矩阵格式,函数is.matrix()可以辨别是否矩阵。 

       数组(array)可以看作是带有多个下标的类型相同的元素的集合。也可以看作是向量和

矩阵的推广,一维数组就是向量,二维数组就是矩阵。数组的生成函数是array(),其句法是: 

array(data  =  NA,  dim  =  length(data),  dimnames  =  NULL) 

其中data表示数据,可以为空,dim表示维数,dimnames可以更改数组的维度的名称。例如: 

>  (xx  <-  array(1:24,c(3,4,2)))     #  产生维数为(3,4,2)的3维数组 

,  ,  1 

     [,1]  [,2]  [,3]  [,4] 

[1,]     1     4     7    10 

[2,]     2     5     8    11 

[3,]     3     6     9    12 

,  ,  2 

     [,1]  [,2]  [,3]  [,4] 

[1,]    13    16    19    22 

[2,]    14    17    20    23 

[3,]    15    18    21    24 

       索引数组类似于索引矩阵,索引向量可以利用下标位置来定义;其中dim()函数可以返回

数组的维数,dim()还可以用来将向量转化成数组或矩阵(见下例)。数组也可以

用“+”、“-”、“*”、“/”以及函数等进行运算,其方法和矩阵相类似,这里不再详述。 

>  xx[2,3,2] 

[1]  20 

>  xx[2,1:3,2] 

[1]  14  17  20 

>  xx[,2,] 

     [,1]  [,2] 

[1,]     4    16 

[2,]     5    17 

[3,]     6    18 

>  dim(xx) 

[1]  3  4  2 

>zz=c(2,5,6,8,1,4,6,9,10,7,3,5) 

>dim(zz)=c(2,2,3)  

#将向量转成维度为(2,2,3)

的数组 

>  zz 

  ,  ,  1 

       [,1]  [,2] 

  [1,]     2     6 

  [2,]     5     8 

  ,  ,  2 

       [,1]  [,2] 

  [1,]     1     6 

  [2,]     4     9 

  ,  ,  3 

       [,1]  [,2] 

  [1,]    10     3 

  [2,]     7     5 

       分类型数据(category  data)经常要把数据分成不同的水平或因子(factor)。比如,

学生的性别包含男和女两个因子。因子代表变量的不同可能的水平(即使在数据中不出现)

。在统计模型统计分析中十分有用,例如将0,1转换为’yes’,’no’就很方便,在R里可以

使用factor函数来创建因子,函数形式如下: 

factor(x  =  character(),  levels,  labels  =  levels,  exclude  =  NA,  ordered  =  is.ordered(x)) 

       其中,levels用来指定因子的水平;labels用来指定水平的名字;exclude表示在x中需要

排除的水平;ordered用来决定因子的水平是否有次序。 

  例如一组学生数据: 

>  y  <-  c("女","男","男","女","女","女","男")  

>  (f  <-  factor(y))  #生成因子 

[1]  女  男  男  女  女  女  男 

Levels:  女  男 

>  levels(f)  #提取因子的水平 

[1]  "女"  "男" 

倘若要表示因子之间有大小顺序(考虑因子之间的顺序),则可以利用ordered()函数产生。 

>  score  <-  c("B","C","D","B","A","D","A") 

>  (score_o  <-  ordered(score,levels=c("D","C","B","A")))  #生成有序因子 

[1]  B  C  D  B  A  D  A 

Levels:  D  <  C  <  B  <  A 

 

       向量、矩阵和数组的元素都单元必须是同一类型的数据。如果一个数据对象需要含有不

同的数据类型,可以采用列表(list)这种数据对象的形式(数据对象形式)。列表是一个对

象的有序集合构成的对象,列表中包含的对象又称为它的分量(components),分量可以

是不同的模式或类型,如一个列表可以包括数值向量、逻辑向量、矩阵、字符、数组等。创

建列表的函数是list(),其句法是:list(变量1=分量1,变量2=分量2,….)。 

例如:下面是某校部分学生的情况,其中,x、y、z分别表示班级、性别和成绩。 

>x  <-  c(1,1,2,2,3,3,3)  

>  y  <-  c("女","男","男","女","女","女","男")   

>  z  <-  c(80,85,92,76,61,95,83) 

>  (LST  <-  list(class=x,sex=y,score=z)) 

$class 

[1]  1  1  2  2  3  3  3 

$sex 

[1]  "女"  "男"  "男"  "女"  "女"  "女"  "男" 

$score 

[1]  80  85  92  76  61  95  83 

  l??若要访问列表的某一成分,可以用LST[[1]],LST[[2]]的形式访问,要访问第二个分量的前三

个元素可以用LST[[2]][1:3]: 

>  LST[[3]]  #返回列表的第三个成分的值 

[1]  80  85  92  76  61  95  83 

>  LST[[2]][1:3]  #返回列表第二个成分的第1到3元素 

[1]  "女"  "男"  "男“ 

由于分量可以被命名,这时,我们可以在列表名称后加$符号,再写上成分名称来访问列

表分量。其中成分名可以简写到可以与其它成分能够区分的最短程度,如LST$sc与LS

T$score表示同样的分量。例如: 

>  LST$score  #返回socre值 

[1]  80  85  92  76  61  95  83 

>  LST$sc  #返回socre值 

[1]  80  85  92  76  61  95  83 

l??函数length()、mode()、names()可以分别返回列表的长度(分量的数目)、数

据类型、列表里成分的名字。 

l??在这里要注意LST[[1]]和LST[1]的差别,[[…]]是选择单个元素的操作符,而[…]是一个一般

通用的下标操作符。因此前者得到的是LST中的第一个对象,并且包含分量名字的命名列

表中的分量名字会被排除在外的1;而后者得到的则是LST中仅仅由第一个元素构成的子

列表。 

       1、数据框的生成 

       数据框(data  frame)是一种矩阵形式的数据,但数据框中各列可以是不同类型的数据

。数据框每列是一个变量,每行是一个观测。数据框可以看成是矩阵(matrix)的推广,也

可以看作是一种特殊的列表对象(list)。数据框是R语言特有的数据类型,也是进行统计分

析最为有用的数据类型。不过对于可能列入数据框中的列表有如下一些限制: 

l??分量必须是向量(数值,字符,逻辑),因子,数值矩阵,列表或者其他数据框。 

l??矩阵,列表和数据框为新的数据框提供了尽可能多的变量,因为它们各自拥有列、元素或者

变量。 

l??数值向量、逻辑值、因子保持原有格式,而字符向量会被强制转换成因子并且它的水平就是

向量中出现的独立值。 

l??在数据框中以变量形式出现的向量结构必须长度一致,矩阵结构必须有一样的行数。 

       R语言中用函数data.frame  (  )生成数据框,其句法是: 

       data.frame(...,  row.names  =  NULL,  check.rows  =  FALSE,  ...) 

数据框的列名默认为变量名,也可以对列名、行名进行重新命名。例如: 

>  (student  <-  data.frame(class=x,sex=y,score=z)) 

      class  sex  score 

1      1   女     80 

2      1   男     85 

3      2   男     92 

4      2   女     76 

5      3   女     61 

6      3   女     95 

7      3   男     83 

>  (student  <-  data.frame(x,y,z)) 

  x   y   z 

1  1  女  80 

2  1  男  85 

3  2  男  92 

4  2  女  76 

5  3  女  61 

6  3  女  95 

7  3  男  83 

       当然,我们也可以对数据框的行名进行修改,例如: 

>  row.names(student)  <-  c("王x","张x","赵x","刘x","黄x","孙x","李x") 

>  student 

        class  sex  score 

王x      1   女     80 

张x      1   男     85 

赵x      2   男     92 

刘x      2   女     76 

黄x      3   女     61 

孙x      3   女     95 

李x      3   男     83 



       2、数据框的引用 

l??以数组形式访问。数据框可以看作是特殊的数组。数组是储存数据的有效方法,可以按行或

列访问,就像电子表格一样,但输入的数据必须是同一类型。数据框可以看作数组是因为数

据框的列表示变量、行表示样本观察数,因此我们可以访问指定的行或列。 

       例如: 

>  student[,"score"]      #返回y变量的所有样本观察数 

[1]  80  85  92  76  61  95  83 

>  student[,3] 

[1]  80  85  92  76  61  95  83 

>  student[1:5,1:3]   #返回第1至第5行,第1至第3列的观察数 

>  student[,]               #返回所有行所有列数据 

       2、数据框的引用 

l??以列表形式访问数据框。列表比数据框更为一般、更为广泛。列表是对象的集合,而且这些

对象可以是不同类型的。数据框是特殊的列表,数据框的列看作向量,而且要求是同一类型

对象。以列表形式访问数据框,只要在列表名称后面加$符号,再写上变量名即可。例如: 

>  student$score  

[1]  80  85  92  76  61  95  83 

       除了用$形式访问外,还可以用列表名[[变量名(号)]]形式访问: 

>  student[["score"]] 

[1]  80  85  92  76  61  95  83 

>  student[[3]] 

[1]  80  85  92  76  61  95  83 

       2、数据框的引用 

       还可以筛选出符合我们条件的数据,比如对上面的数据要得到成绩大于80分的学生,可

以按如下的方法得到。例如: 

>  student[student$score>80,] 

    class  sex  score 

张x      1   男     85 

赵x      2   男     92 

孙x      3   女     95 

李x      3   男     83 



       3、数据框绑定Attach()函数 

       数据框的主要用途是保存统计建模的数据。R软件的统计建模功能都需要以数据框为输入

数据。可把数据框当成一种矩阵来处理。在使用数据框的变量时可以用“数据框名$变量名”

的记法。但这样使用较麻烦,R软件提供了attach()函数可以把数据框中的变量“链接”到内

存中,将数据框“连接(绑定)”入当前的名字空间,从而可以直接用数据框中的变量名访

问而不必用“数据框名$变量名”这种格式。要取消连接,用函数detach()即可。 

 

       3、数据框绑定Attach()函数 

       例如上面student数据框有三个变量,对于数据框里的变量我们不能直接引用,可以用“

数据框名$变量名”的格式,或是利用attach(  )把数据框“连接(绑定)”入当前的名字空间。 

>  score 

错误:  找不到对象‘score‘ 

>  student$score 

[1]  80  85  92  76  61  95  83 

>  attach(student) 

>  score 

[1]  80  85  92  76  61  95  83 

       要取消连接,用函数detach()即可。 

时间: 2024-10-10 07:54:40

R语言应用的相关文章

使用R语言计算均值,方差等

R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] 5.92 3 计算标准差 sd(height) [1] 0.1871719 4 计算方差 var(height) [1] 0.03503333 5 计算两个变量之间的相关系数 cor(height,log(height)) [1] 0

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的

R语言学习-词频分析

概念 1.语料库-Corpus 语料库是我们要分析的所有文档的集合,就是需要为哪些文档来做词频 2.中文分词-Chinese Word Segmentation 指的是将一个汉字序列切分成一个一个单独的词语. 3.停用词-Stop Words 数据处理的时候,自动过滤掉某些字或词,包括泛滥的词如Web.网站等,又如语气助词如的.地.得等. 需要加载的包 1.tm包 安装方式:install.packages("tm") 语料库: Corpus(x,readerControl) x-语料

R语言使用机器学习算法预测股票市场

quantmod 介绍 quantmod 是一个非常强大的金融分析报, 包含数据抓取,清洗,建模等等功能. 1. 获取数据 getSymbols 默认是数据源是yahoo 获取上交所股票为 getSymbols("600030.ss"), 深交所为 getSymbols("000002.sz").  ss表示上交所, sz表示深交所 2. 重命名函数 setSymbolLookup 3. 股息函数 getDividends 4. 除息调整函数 adjustOHLC

R语言数据挖掘实战系列(2)

二.R语言简介 R语言是一种为统计计算和图形显示而设计的语言环境,具有免费.多平台支持,同时可以从各种类型的数据源中导入数据,具有较高的开放性以及高水准的制图功能.R是一个体系庞大的应用软件,主要包括核心的R标准包和各专业领域的其他包.R在数据分析.数据挖掘领域具有特别优势. R安装 R可在其主页(https://www.r-project.org/)上获得,根据所选择的平台进行下载安装.安装完成之后启动R.为了方便使用R,可使用免费的图形界面编辑器RStudio,可从https://www.r

survival analysis 生存分析与R 语言示例 入门篇

生存分析,survival analysis,顾名思义是用来研究个体的存活概率与时间的关系.例如研究病人感染了病毒后,多长时间会死亡:工作的机器多长时间会发生崩溃等.  这里“个体的存活”可以推广抽象成某些关注的事件. 所以SA就成了研究某一事件与它的发生时间的联系的方法.这个方法广泛的用在医学.生物学等学科上,近年来也越来越多人用在互联网数据挖掘中,例如用survival analysis去预测信息在社交网络的传播程度,或者去预测用户流失的概率. R里面有很成熟的SA工具. 本文介绍生存分析的

用蒙特卡洛方法计算派-python和R语言

用蒙特卡洛方法算pi-基于python和R语言 最近follow了MOOC上一门python课,开始学Python.同时,买来了概率论与数理统计,准备自学一下统计.(因为被鄙视过不是统计专业却想搞数据分析) 有趣的是书里面有一块讲蒲丰投针计算Pi,这是一种随机模拟法,也就是蒙特卡洛法.蒲丰投针之于我太难,暂时没想到怎么用计算机模拟这一过程. python课中,老师也提到用随机模拟法,也就是蒙特卡洛法(MonteCarlo),用计算机模拟几千次实验,计算pi的近似值.好巧. 就拿python课中的

R语言学习资源

入门视频教程 R语言初级课程(1)- R语言快速入门http://cos.name/videos/intro-2-r/ 代码 #对象 1+1*3 c(1,2,3,4,5) c('helloworld','i am a R user') c("hehe","haha") 1:6 6:1 exp(1:4) log(1:3) a<-c(1,2,3,4,5) a[1] a[1:3] a[-4] a>3 a[a>3] #数组,类型需要一致 x<-1:1

R 语言学习日志 1

  1. CSV文件的的读取与写出 2. 数据集筛选 3. 简单随机抽样 sample函数 正文: 1. CSV文件的的读取与写出 文件读取: df2 <- read.table("C:\\Users\\Lee\\Desktop\\R语言\\dummyData.csv", header= TRUE, sep=",") 文件写出:write.table(df1, "C:\\Users\\Lee\\Desktop\\R语言\\dummyData.csv&

中文分词实践(基于R语言)

背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来,然后做中文分词+词频统计,最后将统计结果简单做个标签云,效果如下: 后续:中文分词是中文信息处理的基础,分词之后,其实还有特别多有趣的文本挖掘工作可以做,也是个知识发现的过程,以后有机会再学习下. ================================================== * 中文分词常用实现: 单机:R语言+Rwordseg分词包 (建议数据量<1G) 分布式:Hadoop+Smallse