R语言入门秘录5/25:读取表格数据文件

数据分析网整理自tbkken的《R语言入门25招》,一招招技能带你走进R语言。

问题

读取含有数据表格的文本文件。

解决方案

用read.table函数,该函数会返回一个数据框(data frame):

代码

> dfrm <-read.table(“filename.txt”)

讨论

表格数据文件是很常见的。这是一种格式简单的文本文件:

每一行是一条记录

在每条记录中,各个字段之间都用一个字符分给,例如空格、制表符、逗号、分号等

每条记录的字段的数量是一样的

这种格式比固定宽度的格式更加灵活,每个字段的位置不再需要对齐。下面就是一个名为statisticians.txt的表格文件,是用空格符分割字段的:

代码

Fisher R.A. 1890 1962

Pearson Karl 1857 1936

Cox Gertrude 1900 1978

read.table函数就是用来读取这种文件的。缺省情况下,该函数认为数据字段是由空白(空格或制表符)分割的:

代码

> dfrm <-read.table(“statisticians.txt”)

> print(dfrm)

V1 V2 V3 V4

1 Fisher R.A. 1890 1962

2 Pearson Karl 1857 1936

如果不是用空白分割符,可以用用sep参数指定分隔符。例如,如果字段分隔符是冒号(:),就可以这样读取:

代码

> dfrm <-read.table(“statisticians.txt”, sep=”:”)

从输出中看不出什么问题,但实际上read.table会把姓和名视作factor,而不是字符串。我们可以查看一下这两列的class:

代码

> class(dfrm$V1)

[1] “factor”

为了不让read.table将字符串视为factor,把stringAsFactor参数设为FALSE:

代码

> dfrm <-read.table(“statisticians.txt”, stringsAsFactor=FALSE)

> class(dfrm$V1)

[1] “character”

现在第一列的类型就是字符了,而不是factor。

如果文件中包含“NA”,read.table函数会认为这个值是缺失的,并将其转化成NA。你自己的数据文件也可以用不同的字符串来表示缺失值,用na.strings参数来指定。例如在SAS传统中,缺失值就是用.表示的。我们可以这样来读取这样的数据:

代码

> dfrm <-read.table(“filename.txt”, na.strings=”.”)

我非常喜欢自描述的数据,就是说光从数据文件本身就就能看出它所包含的是什么内容。(用计算机学家的话来说就是,文件包含了它自己的元数据。)read.table有两个特性是支持这个功能的。第一个,数据文件的第一行可以是整个数据的头部,给每一列数据指定一个名字。这一行指定了每一列数据的名称,所使用的分隔符跟数据是一样的。下面是就是带头部信息的数据文件:

代码

lastname firstname born died

Fisher R.A. 1890 1962

Pearson Karl 1857 1936

现在在读取该文件时就要告诉read.table函数这个文件是包含头部的,该函数在构建数据框时就会把这一行数据当作每一列的名称:

代码

> dfrm <-read.table(“statisticians.txt”, header=TRUE, stringsAsFactor=FALSE)

> print(dfrm)

lastname firstname born died

1 Fisher R.A. 1890 1962

2 Pearson Karl 1857 1936

read.table的第二个功能是注释行。所有以井号(#)开头的行都会被忽略,可以把注释放在#符号后:

代码

#本文件中是一些著名统计学家的信息

# Last edited on 1994-06-18

lastname firstname born died

Fisher R.A. 1890 1962

Pearson Karl 1857 1936

Cox Gertrude 1900 1978

Yates Frank 1902 1994

Smith Kirstine 1878 1939

read.table函数有很多参数来控制它解读输入文件的方法。详见该函数的帮助页面。

扩展阅读

如果数据是逗号分割的,请参阅第6招:读取CSV文件。

本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。

(0)
上一篇 2015-12-30 00:03
下一篇 2015-12-31 13:41

相关文章

关注我们
关注我们
分享本页
返回顶部