数据集的概念
1.1何为数据集
数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。
不同的行业对于数据集的行和列叫法不同。统计学家称它们为观测(observation)和变量(variable),数据库分析师则称其为记录(record)和字段(field),数据挖掘和机器学习学科的研究者则把它们叫作示例(example)和属性(attribute)。我们在本篇使用术语观测和变量。
你可以清楚地看到此数据集的结构(本例中是一个矩形数组)以及其中包含的内容和数据类型。在表2-1所示的数据集中,PatientID是行/实例标识符,AdmDate是日期型变量,Age是连续型变量,Diabetes是名义型变量,Status是有序型变量。
1.2 数据结构
R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。它们在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同。
1.2.1向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量。各类向量如下例所示:
a<-c(1,2,3,4,5,6)
b<-c('one','two','three')
c<-c(TRUE,TRUE,FALSE,FALSE)
a
b
c
显示结果:
> a
[1] 1 2 3 4 5 6
> b
[1] "one" "two" "three"
> c
[1] TRUE TRUE FALSE FALSE
这里,a是数值型向量,b是字符型向量,而c是逻辑型向量。注意,单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型)。同一向量中无法混杂不同模式的数据。
通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。例如,a[c(2, 4)]用于访问向量a中的第二个和第四个元素。更多示例如下:
a<-c('k','j','h','a','c','m')
a[3]
a[c(1,3,5)]
a[2:6]
显示结果:
> a[3]
[1] "h"
>
> a[c(1,3,5)]
[1] "k" "h" "c"
> a[2:6]
[1] "j" "h" "a" "c" "m"
1.2.2 矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。一般使用格式为:
y<-matrix(1:20,nrow=5,ncol=4,byrow=FALSE)
y
rnames<-c('R1','R2','R3','R4','R5')
cnames<-c('c1','c2','c3','c4')
y<-matrix(1:20,nrow=5,ncol=4,byrow=FALSE,dimnames=list(rnames,cnames))
y
显示结果:
> y<-matrix(1:20,nrow=5,ncol=4,byrow=FALSE)
> 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
> rnames<-c('R1','R2','R3','R4','R5')
> cnames<-c('c1','c2','c3','c4')
> y<-matrix(1:20,nrow=5,ncol=4,byrow=FALSE,dimnames=list(rnames,cnames))
> y
c1 c2 c3 c4
R1 1 6 11 16
R2 2 7 12 17
R3 3 8 13 18
R4 4 9 14 19
R5 5 10 15 20
注:byrow=TRUE,代表通过行来填充;dimnames=list(行名,列名)与byrow是否按行按列无关。
1.2.3 数组
数组(array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建,形式如下:
myarray <- array(vector, dimensions, dimnames)
其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。
dim1<-c('A1','A2')
dim2<-c('B1','B2','B3')
dim3<-c('C1','C2','C3','C4')
myarray<-array(1:10,c(2,3,4),dimnames=list(dim1,dim2,dim3))
myarray
显示结果:
> myarray
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 1
A2 8 10 2
, , C3
B1 B2 B3
A1 3 5 7
A2 4 6 8
, , C4
B1 B2 B3
A1 9 1 3
A2 10 2 4
数组是矩阵的一个自然推广。它们在编写新的统计方法时可能很有用。像矩阵一样,数组中的数据也只能拥有一种模式。从数组中选取元素的方式与矩阵相同。上例中,元素z[1,2,3]为15。
1.2.4 数据框
由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更为一般。
patientID<-c(1,2,3,4)
age<-c(25,34,28,52)
diabetes<-c('Type1','Type2','Type3','Type4')
status<-c('Poor','Improved','Excellent','Poor')
patientdata<-data.frame(patientID,age,diabetes,status)
patientdata
显示结果:
> patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type3 Excellent
4 4 52 Type4 Poor
每一列数据的模式必须唯一,不过你却可以将多个模式的不同列放到一起组成数据框。
1.2.5 因子
变量可归结为名义型、有序型或连续型变量.
类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。
函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
diabetes<-c("Type1", "Type2", "Type1", "Type1")
diabetes<-factor(diabetes)
diabetes
显示结果:
> diabetes
[1] Type1 Type2 Type1 Type1
Levels: Type1 Type2
要表示有序型变量,需要为函数factor()指定参数ordered=TRUE。
status<-c("Poor", "Improved", "Excellent", "Poor")
status<-factor(status,ordered = TRUE)
status
显示结果:
> status
[1] Poor Improved Excellent Poor
Levels: Excellent < Improved < Poor
可以通过指定levels选项来覆盖默认排序。
status<-c("Poor", "Improved", "Excellent", "Poor")
status<-factor(status,ordered = TRUE,levels=c('Poor','Improved','Excellent'))
status
显示结果:
> status
[1] Poor Improved Excellent Poor
Levels: Poor < Improved < Excellent
数值型变量可以用levels和labels参数来编码成因子。
sex<-c(1,2,1,2,2,1)
sex<-factor(sex,levels=c(1,2),labels=c('man','woman'))
sex
显示结果:
> sex
[1] man woman man woman woman man
Levels: man woman
1.3 数据的输入
现在你已经掌握了各种数据结构,可以放一些数据进去了。作为一名数据分析人员,你通常会面对来自多种数据源和数据格式的数据,你的任务是将这些数据导入你的工具,分析数据,并汇报分析结果。R提供了适用范围广泛的数据导入工具。
read.table()的选项
1.4 数据集的标注
为了使结果更易解读,数据分析人员通常会对数据集进行标注。这种标注包括为变量名添加描述性的标签,以及为类别型变量中的编码添加值标签。例如,对于变量age,你可能想附加一个描述更详细的标签“Age at hospitalization (in years)”(入院年龄)。对于编码为1或2的性别变量gender,你可能想将其关联到标签“male”和“female”上。
函数factor()可为类别型变量创建值标签。继续上例,假设你有一个名为gender的变量,其中1表示男性,2表示女性。
gender<-c(1,2,1,2)
patientdata$gender<-gender
patientdata$gender<-factor(patientdata$gender,levels=c(1,2),labels=c("male", "female"))
patientdata
显示结果:
patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type3 Excellent
4 4 52 Type4 Poor
> gender<-c(1,2,1,2)
> patientdata$gender<-gender
> patientdata
patientID age diabetes status gender
1 1 25 Type1 Poor 1
2 2 34 Type2 Improved 2
3 3 28 Type3 Excellent 1
4 4 52 Type4 Poor 2
> patientdata$gender<-factor(patientdata$gender,levels=c(1,2),labels=c("male", "female"))
> patientdata
patientID age diabetes status gender
1 1 25 Type1 Poor male
2 2 34 Type2 Improved female
3 3 28 Type3 Excellent male
4 4 52 Type4 Poor female