数据框(data.frame)

数据框是S中类似SAS数据集的一种数据结构。它通常是矩阵形式的数据,但矩阵各列 可以是不同类型的。数据框每列是一个变量,每行是一个观测。

但是,数据框有更一般的定义。它是一种特殊的列表对象,有一个值为“data.frame”的class 属性,各列表成员必须是向量(数值型、字符型、逻辑型)、因子、数值型矩阵、列表,或 其它数据框。向量、因子成员为数据框提供一个变量,如果向量非数值型则会被强制转换为 因子,而矩阵、列表、数据框这样的成员为新数据框提供了和其列数、成员数、变量数相同 个数的变量。作为数据框变量的向量、因子或矩阵必须具有相同的长度(行数)。

尽管如此,我们一般还是可以把数据框看作是一种推广了的矩阵,它可以用矩阵形式显示 ,可以用对矩阵的下标引用方法来引用其元素或子集。

数据框生成

数据框可以用data.frame()函数生成,其用法与list()函数相同,各自变量变成数据 框的成分,自变量可以命名,成为变量名。例如:

> d <- data.frame(name=c("李明", "张聪", "王建"), age=c(30, 35, 28),
+      height=c(180, 162, 175))
> d
  name age height
1 李明  30    180
2 张聪  35    162
3 王建  28    175

如果一个列表的各个成分满足数据框成分的要求,它可以用as.data.frame()函数强 制转换为数据框。比如,上面的d如果先用list()函数定义成了一个列表,就可以强制为一个 数据框。

一个矩阵可以用data.frame()转换为一个数据框,如果它原来有列名则其列名被作为 数据框的变量名,否则系统自动为矩阵的各列起一个变量名(如X1,X2)。

数据框引用

引用数据框元素的方法与引用矩阵元素的方法相同,可以使用下标或下标向量,也可 以使用名字或名字向量。如d[1:2, 2:3]。数据框的各变量也可以用按列表引用(即用双括号[[]] 或$符号引用)。

数据框的变量名由属性names定义,此属性一定是非空的。数据框的各行也可以定义名字 ,可以用rownames属性定义。如:

> names(d)
[1] "name"   "age"    "height"
> rownames(d)
[1] "1" "2" "3"

attach()函数

数据框的主要用途是保存统计建模需要的数据。S的统计建模功能都需要以数据框为 输入数据。我们也可以把数据框当成一种矩阵来处理。

在使用数据框的变量时可以用“数据框名$变量名”的记法。但是,这样使用较麻烦,S提 供了attach()函数可以把数据框“连接”入当前的名字空间。例如,

> attach(d)

> r <- height / age

后一语句将在当前工作空间建立一个新变量r,它不会自动进入数据框d,要把新变量赋值 到数据框中,可以用

> d$r <- height / age

这样的格式。

为了取消连接,只要调用detach()(无参数即可)。

注意:S和R中名字空间的管理是比较独特的。它在运行时保持一个变量搜索路径表,在读 取某个变量时到这个变量搜索路径表中由前向后查找,找到最前的一个;在赋值时总是在位 置1赋值(除非特别指定在其它位置赋值)。attach()的缺省位置是在变量搜索路径表的位置2 ,detach()缺省也是去掉位置2。所以,S编程的一个常见问题是当你误用了一个自己并没有 赋值的变量时有可能不出错,因为这个变量已在搜索路径中某个位置有定义,这样不利于程 序的调试,需要留心这样的问题。

除了可以连接数据框,也可以连接列表。