R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。它们在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同,下面从向量开始,逐一探究每一种数据结构。
向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行c()函数可用来创建向量:
#数值型向量
a <- c(1,2,5,3,6,-2,4)
#字符型向量
b <- c("one","two","three")
#逻辑型向量
c <- c(TRUE,TRUE,FALSE,FALSE)
单一向量中的数据必须拥有相同的类型或模式,同一向量中无法混杂不同模式的数据。通过方括号给定所处位置的数值,就能访问向量中的元素:
> a <- c(1,2,5,3,6,-2,4)
> a[3]
[1] 5
> a[c(1,3,5)]
[1] 1 5 6
> a[2:6]
[1] 2 5 3 6 -2
标量
标量是只包含一个元素的向量,例如f <- 3,g <- "US"和h <- TRUE。它们通常用于保存常量。
矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式,可通过matrix()函数创建矩阵,一般使用格式为:
vector包含了矩阵元素,nrow和ncol用于指定行和列的维数,dimnames包含了以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认是按列填充。
> y<-matrix(1:20,nrow=5,ncol=4)
> y
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> cell <- c(1,26,24,68)
> rnames <- c("R1","R2")
> cnames <- c("C1","C2")
> mymatrix <- matrix(cell,nrow=2,ncol=2,dimnames = list(rnames,cnames))
> mymatrix
C1 C2
R1 1 24
R2 26 68
>#矩阵下标的使用
> x<-matrix(1:10,nrow=2)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> x[2,]
[1] 2 4 6 8 10
> x[1,4]
[1] 7
> x[1,c(4,5)]
[1] 7 9
数组
数组与矩阵类似,但是维度可以大于2。数组可通过array()函数创建,形式如下:
其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。
dim1<-c("A1","A2")
> dim2<-c("B1","B2","B3")
> dim3<-c("C1","C2","C3","C4")
> z<-array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3))
> z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
数据框
由于不同的列可以包含不同模式的数据,数据框的概念较矩阵来说更为一般,它与通常在SAS、SPSS中看到的数据集类似,数据框是在在R语言中最长处理的数据结构。通常情况下,由于数据有多种模式,无法将数据放入一个矩阵,这时使用数据框是最佳选择。可使用data.frame()函数创建:
其中的列向量col1,col2,col3可以为任何类型,每一列的名称可由函数names指定:
patientID<-c(1,2,3,4)
> age<-c(25,34,28,52)
> diabetes<-c("type1","type2","type1","type1")
> status<-c("poor","Improved","Excellent","Poor")
> patientData <- data.frame(patientID,age,diabetes,status)
> patientData
patientID age diabetes status
1 1 25 type1 poor
2 2 34 type2 Improved
3 3 28 type1 Excellent
4 4 52 type1 Poor
> patientData[1:2]
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
> patientData["diabetes","status"]
[1] <NA>
Levels: Excellent Improved poor Poor
> patientData[c("diabetes","status")]
diabetes status
1 type1 poor
2 type2 Improved
3 type1 Excellent
4 type1 Poor
> patientData$age
[1] 25 34 28 52
因子
变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别变量;有序型变量表示一种顺序关系,而非数量关系;连续型变量可以呈现为某个范围内 的任意值,并同时表示了顺序和数量。
名义型变量和有序型变量在R中称为因子,因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。函数factor()以一个整数向量的形式存储类别值,整数的取值范围[1,...,k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上,比如:
diabetes<-c("type1","type2","type1","type1")
语句diabetes <- factor(diabetes)将此向量存储为(1,2,1,1),并在内部将其关联为1=type1和2=type2,针对向量diabetes进行的任何分析将会将其当作明细型变量对待,并自动选择适合这一测量尺度的统计法那个法。
使用str(patientdata)可以显示对象的结构,使用summary(patientdata)可以显示对象的统计概要。
列表
列表是R语言中最复杂的一种数据类型。一般说来,列表就是一些对象的有序集合,列表允许整合若干对象到单个对象名下,可以使用list()函数创建列表:
下面创建一个列表,其中有四个成分,一个字符串、一个数值型向量、一个矩阵以及一个字符型向量。
g<-"My First List"
> h<-c(25,26,18,39)
> j<-matrix(1:10,nrow = 5)
> k<-c("one","two","three")
> mylist<-list(title=g,ages=h,j,k)
> mylist
$title
[1] "My First List"
$ages
[1] 25 26 18 39
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] "one" "two" "three"