R有许多储存数据的结构,包括标量、向量、数组、数据框和列表。它们在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同。
R的数据类型包括数值型、字符型、逻辑型(TRUE/FALSE)、复数型(虚数)和原生型(字节)。
在R语言中,连续变量是数值型。分类变量用因子(factor)表示,又分为名义型和有序型。
标量
标量是只含有一个元素的向量,例如f<-3、g<-‘US’和h<-TRUE。它们用于保存常量。
向量
向量(vector)是用于存储数值型、字符型或逻辑性数据的一维数据。执行组合功能的函数c()可以用来创建向量。
通过在方括号中给定元素所处位置的数值,可以访问向量中的元素。例如,a[c(2,4)]用于访问向量a中的第二个和第四个元素。更多示例如下:
#生成名为a的向量
a <- c('k','j','h','a','c','m')
#a的第三个元素
a[3]
[1] "h"
#a的第一、三、五个元素
a[c(1,3,5)]
[1] "k" "h" "c"
#a的2到6个元素,是使用冒号:生成的一个数值序列。
a[2:6]
[1] "j" "h" "a" "c" "m"
R语言与其他编程语言不同。元素是从1开始算的,而不是零。如果在python中,a[3],返回a,a[0]返回k。
矩阵
矩阵(matrix)是一个二维数组,只有每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。一般使用格式为:
mymatrix<-matrix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimname=list(char_vector_rownames,char_vector_colnames))
其中vector包含了矩阵的元素,nrow和ncol用来指定行和列的维数,dimnames指定行名与列名。byrow表明矩阵应按行(byrow=TRUE)或列(byrow=FALSE)填充,默认情况下按列填充。
#生成一个名y的5行4列的矩阵
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
#生成一个名为cells的向量
cells <- c(1,26,24,68)
#生成一个名为rnames的向量
rnames <- c('R1','R2')
#生成一个名为cnames的向量
cnames <- c('C1','C2')
#生成一个名为mymatrix的矩阵,它有2行2列,按行填充,行列名分别是rnames、cnames
mymatrix <- matrix(cells,nrow = 2,ncol = 2,byrow = TRUE,dimnames = list(rnames,cnames))
mymatrix
C1 C2
R1 1 26
R2 24 68
#生成一个名为mymatrix的矩阵,它有2行2列,按列填充,行列名分别是rnames、cnames
mymatrix <- matrix(cells,nrow = 2,ncol = 2,byrow = FALSE,dimnames = list(rnames,cnames))
mymatrix
C1 C2
R1 1 24
R2 26 68
可以使用下标和方括号来选择矩阵中的行、列或元素。X[i,]选中矩阵X中的第i行,X[,j]选中第j列,X[i,j]选中第i行第j列个元素。选择多行或多列时,下标i和j可为数值型向量。
#生成一个名为x的两行矩阵
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行
x[2,]
[1] 2 4 6 8 10
#选中x矩阵的第2列
x[,2]
[1] 3 4
#选中x矩阵的第1行第4列
x[1,4]
[1] 7
#选择x矩阵的第1行第4、5列
x[1,c(4,5)]
[1] 7 9
矩阵都是二维的。和向量类似,只能包含一种数据类型。当维度超过2时,则使用数组。数据类型多元时,则使用数据框
数组
数组(array)与矩阵类似,但是维度可以大于2。数组通过array函数创建,形式如下:
myarray<-array(vector,dimensions,dimnames)
其中vector包含数组中的数据,dimensions是一个数值型向量,指定各维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。
下面给出一个三维(2×3×4)数组示例
dim1 <- c('A1','A2')
dim2 <- c('B1','B2','B3')
dim3 <- c('C1','C2','C3','C4')
#生成一个名为z的数组
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
数组中的元素选取方法,同矩阵。上例中,元素z[1,2,3]为15。
数据框
数据框中不同列之间数据类型可以不同,数据框与通常在SAS、SPSS和STATA中的数据集类似。数据框是R中最常数据的数据结构。
数据框可以通过data.frame()创建:
mydata<-data.frame(col1,col2,col3,…)
其中列向量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的数据框 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
元素的选取如下:
#选中1和2列中的元素
patientdata[1:2]
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
#选中列名为diabetes和status中的元素、 patientdata[c('diabetes','status')]
diabetes status1
Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor
#选中patientdata数据框中的age列
patientdata$age
[1] 25 34 28 52
$的快捷键位shift+字母表上方的4
实例标识符
编号用于区别数据集中不同的个体,实例标识符可通过数据框函数中的rowname选项指定。例如:
1patientdata <- data.frame(patientID,age,diabetes,status,row.names = patientID)
因子
变量可以是连续性变量、名义变量和有序变量。
名义变量是没有顺序之别的分类变量。如patientdata中的Diabetes(Type1,Type2)。
有序变量是有顺序高低的分类变量
如patientdata中的status(poor、improved、excellent)
名义变量和有序变量在R中称为因子(factor)
它用函数factor()生成,以一个整数向量的形式存储类别值,整数的取值范围是[1:k]其中k是名义变量的唯一值的个数,同时一个由字符串组成的内部向量将映射到这些整数上。
名义变量示例如下:
diabetes
[1] "Type1" "Type2" "Type1" "Type1"
#生成一个名义变量
diabetes <- factor(diabetes)
diabetes
[1] Type1 Type2 Type1 Type
Levels: Type1 Type2
有序变量示例如下:
status
[1] "Poor" "Improved" "Excellent"
[4] "Poor"
#生成一个有序变量
status <- factor(status,ordered = TRUE)
status
[1] Poor Improved Excellent Poor
Levels: Excellent < Improved < Poor
在factor函数中指定levels选项可以覆盖默认排序。
status <- factor(status,ordered = TRUE,levels = c('Poor','Improved','Excellent'))
status
[1] Poor Improved Excellent Poor
Levels: Poor < Impoved < Excellent
数值型变量可以用levels和labels参数来编码成因子。例如将男性编码成1,女性编码成2。
sex <- c(1,2,1,1,2)
sex
[1] 1 2 1 1 2
sex <- factor(sex,levels = c(1,2),labels = c('Male','Female'))
sex
[1] Male Female Male Male Female
Levels: Male Female
列表
列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象的有序集合。列表允许你整合若干对象到某个对象名下。
用函数list()创建,形式如下:
mylist<-list(object1,object2,…)
还可以为列表中的对象命名:
mylist<-list(name1=object1,name2=object2,…)
示例:
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"
#选择列表中第二个成分
mylist[[2]]
[1] 25 26 18 39
#选择列表中ages成分
mylist[['ages']]
[1] 25 26 18 39
如果列表中的成分已经命名,可以用命名选中。如
mylist$ages
[1] 25 26 18 39
列表成为R中的重要数据结果的原因。首先,列表允许以一种简单的方式组织和重新调用不相干的信息。
其次,许多R函数的运行结果都是以列表的形式返回,方便分析人员选取成分。