R是一门著名的可用于数据和统计分析的程序语言,本文翻译自R软件官方文档教程《An Introduction to R》,仅供学习和参考。
7 从文件中读取数据
大型的数据对象通常从外部文件中读取,而不是直接通过键盘输入。 R的 数据导入很简单,但要求相当严格,甚至可以说相当不灵活。 R 的设计者有一个明确的假定,即您将能够使用其他工具修改您的数据文件以适应 R 的要求。通常这很简单。
如果数据变量主要保存在数据框中(强烈建议),可以使用 read.table()
函数直接读取整个数据框。还有一个更原始的数据读取函数,scan()
。
7.1 read.table()函数
为了直接读取整个数据框,文件通常需要满足以下特殊形式:
-
文件的第一行应该是数据框各列变量的名称
-
文件的每一行由行标和数据值组成
文件的第一行可以比其他行少一个元素。所以,可以读取的文件看起来像这个样子:
默认情况下,数值列(除行标签外)作为数值型变量被读取。非数值列,如例子中的Cent.heat
,作为字符串变量读取。如果有必要,可以改变这一点。
可以使用函数read.table()
直接读取数据框:
> HousePrice <- read.table("houses.data")
> HousePrice
Price Floor Area Rooms Age Cent.heat
01 52.00 111 830 5 6.2 no
02 54.75 128 710 5 7.5 no
03 57.50 101 1000 5 4.2 no
04 57.50 131 690 6 8.8 no
05 59.75 93 900 5 1.9 yes
通常您会希望在读取的时候省略行标签,而使用默认行标签。
> HousePrice <- read.table("houses.data", header=TRUE)
这会显式地将第一行看做列标题。
7.2 scan()函数
假设数据向量长度相等并且要并行读取。进一步假设,有三个向量,第一个是字符串向量,其余两个是数值向量,文件是input.dat
。
我们要做的第一步,是使用scan()
函数将三个向量作为一个列表整体读入,如下:
> inp <- scan("input.dat", list("",0,0))
> inp
[[1]]
[1] "A" "B" "C"
[[2]]
[1] 1 2 3
[[3]]
[1] 1.1 2.2 3.3
第二个参数我们传入了一个虚拟列表,它建立了要读取的三个向量的类型:字符串""
,数值0
,数值0
。结果保存在inp
中,是一个列表,其组件是读入的三个向量。要将数据项分成三个单独的向量,请使用如下赋值:
> label <- inp[[1]]; x <- inp[[2]]; y <- inp[[3]]
更方便的是,虚拟列表可以具有命名组件,在这种情况下,名称可用于访问读入的向量。例如:
> inp <- scan("input.dat", list(id="", x=0, y=0))
> inp
$id
[1] "A" "B" "C"
$x
[1] 1 2 3
$y
[1] 1.1 2.2 3.3
> inp$id
[1] "A" "B" "C"
如果第二个参数是单个值而不是列表,则读入单个向量,其所有分量必须与虚拟值具有相同的类型。
7.3 访问内置数据集
R 提供了大约 100 个内置数据集(在datasets
包中),其他数据集则在其它包中提供(包括 R 提供的推荐包)。要查看当前可用的数据集列表,请使用
> data()
R 提供的所有数据集都可以直接通过名称获得。然而,许多包仍然使用过时的约定,即使用data()
函数将数据集加载到 R 中,例如:
> data(infert)
7.3.1 从其他 R 包加载数据
要访问特定包中的数据,请指定package
参数,例如
> data(package="rpart")
> data(Puromycin, package="datasets")
如果包已被library()
附加,则其数据集会自动包含在搜索路径中.
用户提供的包可以是丰富的数据集来源。
7.4 编辑数据
当在数据框或矩阵上调用时,edit()
函数会打开一个单独的类似电子表格的窗口来进行编辑。这对于在读取数据集后进行小的更改很有用。
> xnew <- edit(xold)
以上代码将允许您编辑数据集xold
,完成后将更改的对象分配给 xnew
。如果要改变原始数据集xold
,最简单的方法是使用fix(xold)
,这相当于xold <- edit(xold)
。
使用
> xnew <- edit(data.frame())
通过电子表格界面输入新数据。