2.2.4 数据框

2.2.4 数据框

在R语言中,数据框(Dataframe)的数据结构与矩阵相似,但是其各列的数据类型可以不同。一般情况下,数据框的每列是一个变量,每行是一个观测样本。虽然数据框内不同的列可以是不同的数据类型,但是数据框内每列的长度必须相同。

我们需要处理的数据集通常都会包含多种数据类型,如表2-1所示。

表2-1 经管学生信息

此时,表2-1中的数据集无法写入矩阵或者数组,在这种情况下,数据框是最佳选择。因此,数据框是R语言中最常处理的数据结构。

在R语言中,我们可以通过调用data.frame()函数来创建数据框,例如:

其中,列向量col可以为任何类型(字符型、数值型或者逻辑型),每一列的名称可由names()函数指定。我们也可以在数据框创建完毕后使用colnames()和rownames()函数对其进行重命名,例如:

数据框可以存储不同的数据类型,但是每一列的数据模式必须是唯一的。在进行数据分析时,我们可以以列为单位进行处理。代码中的letters会自动生成字母序列a、b、c。

选取数据框中元素的方式有很多种。我们仍然可以使用“[]”对数据框中的数据进行选取,也可以直接指定列名,或者使用“$”符号选取给定数据框中的某个特定向量。具体如下:

上述操作默认提取的是数据框的列变量,即student[1:2]提取的是数据框的第1列和第2列。如果我们想要提取数据框的行元素,可以仿照对矩阵的操作形式,使用student[1,],这样提取出来的是student数据框的第一行,且返回值是一个数据框。但是我们使用这种方式提取列变量时,需要设置drop参数,写成student[,1,drop=FALSE]的形式,否则将会返回一个向量。

我们可以使用“$”或者“[]”结合赋值符号“-”对列变量中的成分重新赋值,例如:

下面介绍因子的相关概念。因子基于数据框,是R语言在存储数据过程中提高存储效率的一种方式。数据框在存储数据时会默认选择使内存利用率更高的方式。在存储的过程中,数据的类型会发生一些改变,我们可以使用str()函数进行查看,例如:

通过上述代码可知,字符向量会在数据框中转换为因子,且相同的字符只存储一次,以节省内存。因子带有水平(Level)属性,水平指字符所有可能取值的种类。例如,性别一列中,level为2,表示只有男和女两个水平。

虽然数据框存储数据的方式提高了内存的利用效率,但是也会产生一些问题,具体如下:

上述代码会产生一个警告,这是因为在最初设定Major这一列时,相应的水平集合中没有“d”这个水平。因此,我们无法赋予Major一个水平集合中不存在的名称,如果把其他字符串添加到Major列中,R会发出警告消息,并把错误赋值的元素设置为“NA”。R语言是一种十分占用内存的语言,所以这种设定在R语言中有其合理之处,但是有时也会产生一些问题。我们可以通过设定data.frame()中的strings AsFactors参数来禁止字符变量转换成因子,具体如下: