问题
读取含有数据表格的文本文件。
解决方案
用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」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。