您的位置:首页 > 其它

R:读写文件(输入与输出)

2014-10-27 13:47 246 查看
►从文件中读取数据框或矩阵

可以用read.table()来读取数据框。

> z <- read.table( "D:/RCodes/zfile.txt", header=TRUE )

> z

name age1

John 252

Mary 283

Jim 19

注:此处scan()不能正确读取数据框,因为这个文件中数值和字符混杂,还含有表头。

似乎没有办法直接从文件中读取数据框,不过借助其他工具可以轻松办到。一个简单快速的办法是用scan()逐行读取,用matrix()中的byrow选项设定矩阵式按行存储,而不是按列存储。

> x <- matrix( scan("D:/RCodes/zfile.txt", quiet=TRUE),nrow=5, byrow=TRUE )

> x

[,1] [,2] [,3] [,4]

[1,] 1 0 1 0

[2,] 0 1 0 1

[3,] 1 1 0 1

[4,] 1 0 0 1

[5,] 0 0 1 0

上面的做法对于一次性的快速操作很有效,不过,还有一种方法,可以用read.table()先读取为数据框,再用as.matrix()将其转化为矩阵。这是一个通用的方法:

> read.matrix <- function( filename ){

+ as.matrix( read.table( filename ) )

+ }

> read.matrix( "D:/RCodes/zfile.txt" )

V1 V2 V3 V4

[1,] 1 0 1 0

[2,] 0 1 0 1

[3,] 1 1 0 1

[4,] 1 0 0 1

[5,] 0 0 1 0

►读取文本文件

在计算机文献中,文本文件(text file)和二进制文件(binary file)之间通常会有区别。但这种区别在某种程度上有些误导性,其实每个计算机文件都是由0和1编码组成,在这个意义上说,所有文件都可以认为是二进制文件。此处把文本文件定义为主要由ASCII字符或其他人类语言的编码(如为中文的GB编码)构成的文件,换行符的使用让人感觉文件是按行组成的。

非文本文件,如JPEG图像或可执行程序文件,通常称为“二进制文件”。

可以使用readLines()读取文本文件,无论是每次一行还是一次性全部读取。

一次性全部读取样例:

> z <- readLines( "D:/RCodes/zfile.txt" )

> z

[1] "John 25 MN" "Mary 18 NB" "Jim 36 JF"

►连接的介绍

“连接(connection)”是R中用于多种I/O(输入输出)操作的一个基本机制。它可以用于读取文件,连接一般通过调用file()、url()或其他R函数创建。可以通过“?connection”命令查看这些函数的列表。

我们可以逐行读取文件,样例如下:

> rs <- file( "D:/RCodes/zfile.txt", "r" )

> readLines( rs, n=1 )

[1] "John 25 MN"

> readLines( rs, n=1 )

[1] "Mary 18 NB"

> readLines( rs, n=1 )

[1] "Jim 36 JF"

> readLines( rs, n=1 )

character(0)

打开连接,把结果赋给变量rs,然后设定参数n=1使程序一次只能读取文件的一行。当R遇到文件结束符(EOF),就返回一个控制。我们需要设置一个连接,让R跟踪文件的进程。

> rs <- file( "D:/RCodes/zfile.txt", "r" )

> while( TRUE ){

+ rst <- readLines( rs, n=1 )

+ if( length( rst ) == 0 ){

+ print( "reached the end" )

+ break+ }

+ else{

+ print( rst )

+ }

+ }

[1] "John 25 MN"

[1] "Mary 18 NB"

[1] "Jim 36 JF"

[1] "reached the end"

如果想要“倒带”,从文件开始出重新读取,可以使用seek()函数:

> rs <- file( "D:/RCodes/zfile.txt", "r" )

> readLines( rs, n=2 )

[1] "John 25 MN" "Mary 18 NB"

> seek( con=rs, where=0 )

[1] 24

> readLines( rs, n=1 )

[1] "John 25 MN"

seek()中参数where=0表示把起始指针指向文件的最开头,即直接从开始读起。这个命令的返回值是24,说明在执行命令前指针位于24处。

可以用close()函数来关闭连接。关闭连接可以让系统知道已经完整读取了所需文件内容,现在可以正式斜土磁盘。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐