2.1数据类型
R语言的数据类型主要有数值型、字符型、逻辑型、复数型和原味型。此外,也可以是默认值。
原味型是以二进制形式保存数据。
默认值,当一个元素或值在统计的时候是“不可得到”(not available)或“缺失值”(missing value)时,相关位置可能会被保留并且赋予一个特定的NA值。任何NA的运算结果都是NA。Is.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(),其句法是:
Array(data=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函数来创建因子,函数形式如下:
Factor(x=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