20 第2章创建数据集 表2-1病例数据 病人编号 入院时间 年龄 糖尿病类型 病情 (PatientID) (AdmDate) (Age) (Diabetes) (Status) 1 10/15/2009 25 Typel Poor 2 11/01/2009 34 Type2 Improved 3 10/21/2009 28 Typel Excellent 4 10/28/2009 52 Typel Poor 不同的行业对于数据集的行和列叫法不同。统计学家称它们为观测(observation)和变量 (variable),数据库分析师则称其为记录(record)和字段(field),数据挖掘/机器学习学科的研 究者则把它们叫做示例(example)和属性(attribute)。我们在本书中通篇使用术语观测和变量。 你可以清楚地看到此数据集的结构(本例中是一个矩形数组)以及其中包含的内容和数据类 型。在表2-l所示的数据集中,PatientID是行/实例标识符,AdmDate是日期型变量,Age是连 续型变量,Diabetes是名义型变量,Status是有序型变量。 R中有许多用于存储数据的结构,包括标量、向量、数组、数据框和列表。表2-1实际上对应 着R中的一个数据框。多样化的数据结构赋予了R极其灵活的数据处理能力。 R可以处理的数据类型(模式)包括数值型、字符型、逻辑型(℉UE/FALSE)入、复数型(虚 数)和原生型(字节)。在R中,PatientID、AdmDate和Age将为数值型变量,而Diabetes和 Status则为字符型变量。另外,你需要分别告诉R:PatientID是实例标识符,AdmDate含有 日期数据,Diabetes和Status分别是名义型和有序型变量。R将实例标识符称为cownames(行 名),将类别型(包括名义型和有序型)变量称为因子(factors)。我们会在下一节中讲解这些 内容,并在第3章中介绍日期型数据的处理。 2.2数据结构 R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。它们 在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均 有所不同。图2-1给出了这些数据结构的一个示意图。 让我们从向量开始,逐个探究每一种数据结构。 一些定义 R中有一些术语较为独特,可能会对新用户造成困扰。 在R中,对象(object)是指可以赋值给变量的任何事物,包括常量、数据结构、函数, 甚至图形。对象都拥有某种模式,描述了此对象是如何存储的,以及某个类,像prit这样的 泛型函数表明如何处理此对象。 与其他标准统计软件(如SAS、SPSS和Stata)中的数据集类似,数据框(data frame)是R 中用于存储数据的一种结构:列表示变量,行表示观测。在同一个数据框中可以存储不同类型 (如数值型、字符型)的变量。数据框将是你用来存储数据集的主要数据结构。 图灵社区会员matrixvirus(matrixvirus@163.com))专享尊重版权
20 第 2 章 创建数据集 表2-1 病例数据 病人编号 (PatientID) 入院时间 (AdmDate) 年龄 (Age) 糖尿病类型 (Diabetes) 病情 (Status) 1 10/15/2009 25 Type1 Poor 2 11/01/2009 34 Type2 Improved 3 10/21/2009 28 Type1 Excellent 4 10/28/2009 52 Type1 Poor 不同的行业对于数据集的行和列叫法不同。统计学家称它们为观测(observation)和变量 (variable),数据库分析师则称其为记录(record)和字段(field),数据挖掘/机器学习学科的研 究者则把它们叫做示例(example)和属性(attribute)。我们在本书中通篇使用术语观测和变量。 你可以清楚地看到此数据集的结构(本例中是一个矩形数组)以及其中包含的内容和数据类 型。在表2-1所示的数据集中,PatientID是行/实例标识符,AdmDate是日期型变量,Age是连 续型变量,Diabetes是名义型变量,Status是有序型变量。 R中有许多用于存储数据的结构,包括标量、向量、数组、数据框和列表。表2-1实际上对应 着R中的一个数据框。多样化的数据结构赋予了R极其灵活的数据处理能力。 R可以处理的数据类型(模式)包括数值型、字符型、逻辑型(TRUE/FALSE)、复数型(虚 数)和原生型(字节)。在R中,PatientID、AdmDate和Age将为数值型变量,而Diabetes和 Status则为字符型变量。另外,你需要分别告诉R:PatientID是实例标识符,AdmDate含有 日期数据,Diabetes和Status分别是名义型和有序型变量。R将实例标识符称为rownames(行 名),将类别型(包括名义型和有序型)变量称为因子(factors)。我们会在下一节中讲解这些 内容,并在第3章中介绍日期型数据的处理。 2.2 数据结构 R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。它们 在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均 有所不同。图2-1给出了这些数据结构的一个示意图。 让我们从向量开始,逐个探究每一种数据结构。 一些定义 R中有一些术语较为独特,可能会对新用户造成困扰。 在R中,对象(object)是指可以赋值给变量的任何事物,包括常量、数据结构、函数, 甚至图形。对象都拥有某种模式,描述了此对象是如何存储的,以及某个类,像print这样的 泛型函数表明如何处理此对象。 与其他标准统计软件(如SAS、SPSS和Stata)中的数据集类似,数据框(data frame)是R 中用于存储数据的一种结构:列表示变量,行表示观测。在同一个数据框中可以存储不同类型 (如数值型、字符型)的变量。数据框将是你用来存储数据集的主要数据结构。 图灵社区会员 matrixvirus(matrixvirus@163.com) 专享 尊重版权
2.2数据结构 21 因子(factor)是名义型变量或有序型变量。它们在R中被特殊地存储和处理。你将在2.2.5 节中学习因子的处理。 其他多数术语你应该比较熟悉了,它们基本都遵循统计和计算中术语的定义。 b)矩阵 (c)数组 (a)向量 (d)数据框 向量 数组 (e)列表 数据框 各列的模式(modes)可以不同 列表 图2-1R中的数据结构 2.2.1向量 向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来 创建向量。各类向量如下例所示: a<-c(1,2,5,3,6,-2,4) b <-c("one","two","three") c <-c(TRUE,TRUE,TRUE,FALSE,TRUE,FALSE) 这里,a是数值型向量,b是字符型向量,而c是逻辑型向量。①注意,单个向量中的数据必 须拥有相同的类型或模式(数值型、字符型或逻辑型)。同一向量中无法混杂不同模式的数据。 注意 标量是只含一个元素的向量,例如E<-3、g<-"US"和h<-RUB。它们用于保存 常量。 通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。例如,a[c(2,4)] 用于访问向量a中的第二个和第四个元素。更多示例如下: ①由于R中内置了同名函数c(),最好不要在编码时使用c作为对象名,否则可能产生一些不易察觉的问题。一译者注 图灵社区会员matrixvirus(matrixvirus(@163.com)专享尊重版权
2.2 数据结构 21 1 2 3 4 5 16 6 7 8 9 10 11 12 13 14 15 因子(factor)是名义型变量或有序型变量。它们在R中被特殊地存储和处理。你将在2.2.5 节中学习因子的处理。 其他多数术语你应该比较熟悉了,它们基本都遵循统计和计算中术语的定义。 图2-1 R中的数据结构 2.2.1 向量 向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来 创建向量。各类向量如下例所示: 这里,a是数值型向量,b是字符型向量,而c是逻辑型向量。①注意,单个向量中的数据必 须拥有相同的类型或模式(数值型、字符型或逻辑型)。同一向量中无法混杂不同模式的数据。 注意 标量是只含一个元素的向量,例如f <- 3、g <- "US"和h <- TRUE。它们用于保存 常量。 通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。例如,a[c(2, 4)] 用于访问向量a中的第二个和第四个元素。更多示例如下: —————————— ① 由于R中内置了同名函数c(),最好不要在编码时使用c作为对象名,否则可能产生一些不易察觉的问题。——译者注 图灵社区会员 matrixvirus(matrixvirus@163.com) 专享 尊重版权
22 第2章创建数据集 >a<-c(1,2,5,3,6,-2,4) >a[31 [115 >a[e(1,3,5)] [1]156 >a[2:6] 【1]2536-2 最后一个语句中使用的冒号用于生成一个数值序列。例如,a<-c(2:6)等价于a<-c(2, 3,4,5,6)。 2.2.2矩阵 矩阵是一一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通 过函数matrix创建矩阵。一般使用格式为: myymatrix <-matrix(vector,nrow=number_of_rows,ncol=number_of_columns, byrow=logical value,dimnames=list( char_vector_rownames,char_vector_colnames)) 其中vector包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选的、 以字符型向量表示的行名和列名。选项oyrow则表明矩阵应当按行填充(byrow=TRUE)还是按 列填充(byrow=FALSE),默认情况下按列填充。代码清单2-1中的代码演示了matrix函数的 用法。 代码清单2-1 创建矩阵 >y <matrix(1:20,nrow=5,ncol=4) 了①创建一个5×4的矩阵 >y [,1]【,2][,3]【,4] [1,] 1 611 16 [2,] 2 7 12 17 【3,1 813 18 [4,] 0 9 14 19 [5,] 101520 cells <-c(1,26,24,68) rnames <-C("R1","R2) 2按行填充的2×2矩阵 cnames <-c("C1","C2") mymatrix- matrix(cells,nrow-2,nco1-2,byrow-TRUE dimnames=list (rnames,cnames)) mymatrix C1 C2 R1126 R22468 mymatrix <matrix(cells,nrow=2,ncol=2,byrow=FALSE, dimnames=list (rnames,cnames)) mymatrix 3按列填充的 C1 C2 2×2矩阵 R1124 R22668 我们首先创建了一一个5×4的矩阵①,接着创建了一个2×2的含列名标签的矩阵,并按行进行 图灵社区会员matrixvirus(matrixvirus@163.com))专享尊重版权
22 第 2 章 创建数据集 最后一个语句中使用的冒号用于生成一个数值序列。例如,a <- c(2:6)等价于a <- c(2, 3, 4, 5, 6)。 2.2.2 矩阵 矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通 过函数matrix创建矩阵。一般使用格式为: 其中vector包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选的、 以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按 列填充(byrow=FALSE),默认情况下按列填充。代码清单2-1中的代码演示了matrix函数的 用法。 代码清单2-1 创建矩阵 我们首先创建了一个5×4的矩阵 ,接着创建了一个2×2的含列名标签的矩阵,并按行进行 创建一个5×4的矩阵 按行填充的2×2矩阵 按列填充的 2×2矩阵 图灵社区会员 matrixvirus(matrixvirus@163.com) 专享 尊重版权
2.2数据结构23 填充②,最后创建了一个2×2的矩阵并按列进行了填充3。 我们可以使用下标和方括号来选择矩阵中的行、列或元素。x[i,]指矩阵x中的第i行,x[,] 指第列,X[i,]指第i行第个元素。选择多行或多列时,下标和i可为数值型向量,如代码 清单2-2所示。 代码清单2-2矩阵下标的使用 >x<-matrix(1:10,nrow=2) 【,11【,2]【,31[,4]【,5] [1,] 13579 [2,] 246810 >x[2,] [1】246810 >x1,2] 【1]34 >×[1,4] [1]7 >xI1,c(4,5)] [1]79 首先,我们创建了一个内容为数字1到10的2×5矩阵。默认情况下,矩阵按列填充。然后, 我们分别选择了第二行和第二列的元素。接着,又选择了第一行第四列的元素。最后选择了位于 第一行第四、第五列的元素。 矩阵都是二维的,和向量类似,矩阵中也仅能包含一种数据类型。当维度超过2时,不妨使 用数组(2.2.3节)。当有多种模式的数据时,不妨使用数据框(2.2.4节)。 2.2.3 数组 数组(array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建,形式如下: myarray <-array(vector,dimensions,dimnames) 其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大 值,而dimnames是可选的、各维度名称标签的列表。代码清单2-3给出了一个创建三维 (2×3×4)数值型数组的示例。 代码清单2-3创建一个数组 >din1<-c("A1","A2"} >dim2<-C("B1","B2","B3") >dim3<-c("c1","C2","C3","c4") z <-array(1:24,c(2,3,4),dimnames=list (dimi,dim2,dim3)) >z ,,C1 B1 B2 B3 A1135 A2246 图灵社区会员matrixvirus(matrixvirus@163.com))专享尊重版权
2.2 数据结构 23 1 2 3 4 5 16 6 7 8 9 10 11 12 13 14 15 填充 ,最后创建了一个2×2的矩阵并按列进行了填充 。 我们可以使用下标和方括号来选择矩阵中的行、列或元素。X[i,]指矩阵X中的第i 行,X[,j] 指第j 列,X[i, j]指第i 行第j 个元素。选择多行或多列时,下标i 和j 可为数值型向量,如代码 清单2-2所示。 代码清单2-2 矩阵下标的使用 首先,我们创建了一个内容为数字1到10的2×5矩阵。默认情况下,矩阵按列填充。然后, 我们分别选择了第二行和第二列的元素。接着,又选择了第一行第四列的元素。最后选择了位于 第一行第四、第五列的元素。 矩阵都是二维的,和向量类似,矩阵中也仅能包含一种数据类型。当维度超过2时,不妨使 用数组(2.2.3节)。当有多种模式的数据时,不妨使用数据框(2.2.4节)。 2.2.3 数组 数组(array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建,形式如下: 其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大 值,而dimnames是可选的、各维度名称标签的列表。代码清单2-3给出了一个创建三维 (2×3×4)数值型数组的示例。 代码清单2-3 创建一个数组 图灵社区会员 matrixvirus(matrixvirus@163.com) 专享 尊重版权
24 第2章创建数据集 ,,C2 B1 B2 B3 A17911 A281012 ·C3 B⊥B2B3 A1131517 A2141618 ,,C4 B1 B2 B3 A1192123 A2202224 如你所见,数组是矩阵的一个自然推广。它们在编写新的统计方法时可能很有用。像矩阵一 样,数组中的数据也只能拥有一种模式。 从数组中选取元素的方式与矩阵相同。上例中,元素z[1,2,3]为15。 2.2.4数据框 由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更 为一般。它与你通常在SAS、SPSS和Stata中看到的数据集类似。数据框将是你在R中最常处理的 数据结构。 表2-1所示的病例数据集包含了数值型和字符型数据。由于数据有多种模式,无法将此数据 集放入一个矩阵。在这种情况下,使用数据框是最佳选择。 数据框可通过函数data.frame()创建: mydata <-data.frame(col1,col2,col3,...) 其中的列向量co11,co12,co13,.可为任何类型(如字符型、数值型或逻辑型)。每一列的 名称可由函数names:指定。代码清单2-4清晰地展示了相应用法。 代码清单2-4创建一个数据框 patientID <-c(1,2,3,4) >age<-c(25,34,28,52) diabetes <-c("Typel","Type2","Typel","Typel") status <-c("Poor"."Improved","Excellent","Poor") patientdata <-data.frame(patientID,age,diabetes,status) patientdata patientID age diabetes status 1 125 Typel Poor 234 Type2 Improved 3 328 Typel Excellent 452 Typel Poor 图灵社区会员matrixvirus(matrixvirus@163.com))专享尊重版权
24 第 2 章 创建数据集 如你所见,数组是矩阵的一个自然推广。它们在编写新的统计方法时可能很有用。像矩阵一 样,数组中的数据也只能拥有一种模式。 从数组中选取元素的方式与矩阵相同。上例中,元素z[1,2,3]为15。 2.2.4 数据框 由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更 为一般。它与你通常在SAS、SPSS和Stata中看到的数据集类似。数据框将是你在R中最常处理的 数据结构。 表2-1所示的病例数据集包含了数值型和字符型数据。由于数据有多种模式,无法将此数据 集放入一个矩阵。在这种情况下,使用数据框是最佳选择。 数据框可通过函数data.frame()创建: 其中的列向量col1, col2, col3,… 可为任何类型(如字符型、数值型或逻辑型)。每一列的 名称可由函数names指定。代码清单2-4清晰地展示了相应用法。 代码清单2-4 创建一个数据框 图灵社区会员 matrixvirus(matrixvirus@163.com) 专享 尊重版权