►从文件中读取数据框或矩阵
可以用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 <- 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()函数来关闭连接。关闭连接可以让系统知道已经完整读取了所需文件内容,现在可以正式斜土磁盘。