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



2.1数据类型

R语言的数据类型主要有数值型、字符型、逻辑型、复数型和原味型。此外,也可以是默认值。

原味型是以二进制形式保存数据。

默认值,当一个元素或值在统计的时候是“不可得到”(not available)或“缺失值”(missing value)时,相关位置可能会被保留并且赋予一个特定的NA值。任何NA的运算结果都是NAIs.na()函数用来检测数据是否缺失,如果数据缺失,则返回TRUE,否则返回FALSE

 

常见的辨别和转换数据对象类型的函数

数据类型

辨别函数

转换函数

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()

numeric

Is.numeric()

As.numeric()

 

2.2数据对象

R语言里的数据对象主要有6种结构:向量(vector)、矩阵(matrix)、数组(array)、因子(factor)、列表(list)和数据框(data frames)。

 

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

函数Paste()可以把自变量对应元素连成一个字符串 

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

> v

[1] "x 1" "x 2" "x 3" "x 4" "x 5"

 

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

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

> w

[1] 1 3 5 7

 

seq(from,to,by),from表示序列的起始值,to表示序列的终止值,by表示步长。

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

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

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

 

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

> rep(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).

   

               向量运算常见函数表

函数

用途

Sum()

求和

Max()

求最大值

Min()

求最小值

Range()

求极差(全距)

Mean()

求均值

Median()

求中位数

Var()

求方差

Sd()

求标准差

Sort()

排序

Rev()

反排序

Rank()

求秩

Append()

添加

Replace()

替换

Match()

匹配

Pmatch

部分匹配

All()

判断所有

Any()

判断所有

Prod

 

2>矩阵 是将数据用行和列排列的长方形表格,它是二维的数组,其单元必须是相同的数据类型。通常用列来表示不同的变量,用行表示各个对象。R语言生成矩阵的函数是matrix(),其句法是:matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)

其中,data项为必要的矩阵元素,nrow为行数,ncol为列数,nrow与ncol的乘积应为矩阵元素个数,dimnames给定行和列的名称,byrow项控制排列元素时是否按行进行,默认byrow=FALSE,即按列顺序排列。

取一个方阵的对角阵:

> a     [,1] [,2] [,3][1,]    1    5    9[2,]    2    6   10[3,]    3    7   11[4,]    4    8   12

> diag(a)[1]  1  6 11

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

> diag(diag(a))     [,1] [,2] [,3][1,]    1    0    0[2,]    0    6    0[3,]    0    0   11

 

   只输入一个正整数,则diag()函数将会生成一个对应维数的单位矩阵:

> diag(3)     [,1] [,2] [,3][1,]    1    0    0[2,]    0    1    0[3,]    0    0    1

 

矩阵合并还可以使用rbind()cbind()函数来对矩阵按照行或列进行合并。

> b<-matrix(c(1,1,1,1),2,2)

> rbind(b,b)

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

> cbind(b,b)

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

   对于得到的矩阵,可以使用A[i,j]得到A矩阵第i行第j列的元素,A[i,]A[,J]分别表示返回第i行和第j列的所有元素。也可以使用A[i:l,j:l]的形式来获得多行多列的子矩阵。

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

> A[2,3]

[1] 8

> A[2,]

[1]  2  5  8 11

> A[,3]

[1] 7 8 9

> A[1:3,2]

[1] 4 5 6

 

2.3数组 即可以看作是带多个下标的且类型相同的元素的集合,也可以看作是向量和矩阵的推广,一维数组就是向量,二维数组就是矩阵。数组的生成函数是array(),其句法是:

Arraydata=NA,dim=length(data),dianames=NULL

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

其中dim()函数可以返回数组的维数,例如:

> x<-array(1:24,c(3,4,2))

> x

, , 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(x)

[1] 3 4 2

Dim()还可以用来将向量转换成数组或矩阵。例如:

> z<-c(1,3,4,5,6,7,8,9,1,3,4,5)

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

> z

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

 

2.4 因子  分类型数据(category data)经常要把数据分成不同的水平或因子(factor),如学生的性别包含男和女两个因子。因子代表变量的不同可能水平(即使在数据中不出现),在统计分析中十分有用。例如,将0,1转换为“yes”和“no”就很方便。在R里可以使用factor函数来创建因子,函数形式如下:

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

其中,levels用来指定因子的水平,labels用来指定水平的名字,exclude表示在x中需要排除的水平,ordered用来决定因子的水平是否有次序。

     

2.5 列表 如果一个数据对象需要含有不同的数据类型,则可以采用列表(list)。列表中包含的对象又称为它的分量(components,分量可以是不同的模式或类型,如一个列表可以包括数值向量、逻辑向量、矩阵、字符和数组等。创建列表的函数是list(),其句法是:

List(变量1=分量1,变量2=分量2...)

例如:

> 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

 

若要访问列表的某一部分,则可以用lst[[1]],lst[[2]]的形式访问,若要访问第二个分量的前三个元素则可以用lst[[2]][1:3]:

> lst[[3]][1] 80 85 92 76 61 95 83

> lst[[2]][1:3][1] "女" "男" "男"

由于分量可以被命名,因此,我们可以在列表名称后加$符号,再写上成分名称来访问列表分量。其中,成分名可以简写到与其他成分能够区分的最短程度,如:

> lst$score

[1] 80 85 92 76 61 95 83

> lst$sc

[1] 80 85 92 76 61 95 83

2.6 数据框  是一种矩阵形式的数据,但数据框中各列可以是不同类型的数据。数据框每列是一个变量,每行是一个观测。

其句法是:

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

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

Version:1.0 StartHTML:0000000107 EndHTML:0000003042 StartFragment:0000000127 EndFragment:0000003024 

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

  x  y  z1 1 女 802 1 男 853 2 男 924 2 女 765 3 女 616 3 女 957 3 男 83

 > row.names(student)<-c("w","z","l","j","h","s","p")

> student

  x  y  zw 1 女 80z 1 男 85l 2 男 92j 2 女 76h 3 女 61s 3 女 95p 3 男 83

 

数据框的引用

(1)以数组形式访问

> student[,"z"][1] 80 85 92 76 61 95 83

> student[,3][1] 80 85 92 76 61 95 83

> student[1:5,1:3]

  x  y  zw 1 女 80z 1 男 85l 2 男 92j 2 女 76h 3 女 61

> student[,]

  x  y  zw 1 女 80z 1 男 85l 2 男 92j 2 女 76h 3 女 61s 3 女 95p 3 男 83

 

(2)以列表形式访问数据框 

> student$z

[1] 80 85 92 76 61 95 83

> student[["z"]]

[1] 80 85 92 76 61 95 83

> student[[3]]

[1] 80 85 92 76 61 95 83

还可以筛选出符合我们条件的数据,如上面的数据,要得到成绩大于80分的学生,则可以按如下的方法得到。

> student[student$z>80,]

  x  y  zz 1 男 85l 2 男 92s 3 女 95p 3 男 83

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章