R语⾔的数据的导⼊和导出
R R 数据导⼊和导出数据导⼊和导出数据导⼊和导出
版本版本::2.2.12.2.1((2005年12⽉20⽇)
R 开发核⼼⼩组
⽬录致谢
1 概述
1.1 导⼊
1.2 导出到⽂本⽂件 1.3 XML
2 类电⼦表格格式的数据
2.1 read.table 函数的各种形式 2.2 固定长度格式⽂件 2.3 直接使⽤scan 函数 2.4 整理数据 2.5 平⾯列联表
3 导⼊其他统计软件数据
3.1 EpiInfo, Minitab, S-PLUS, SAS, SPSS, Stata, Systat 3.2 Octave
4 关系数据库
4.1 为何使⽤数据库
4.2 关系数据库管理系统概要 4.2.1 SQL 查询 4.2.2 数据类型 4.3 R 的接⼝包 4.3.1 DBI 和RMySQL 包 4.3.2 RODBC 包
5 ⼆进制⽂件
5.1 ⼆进制数据格式
5.2 dBase⽂件(DBF)
6 连接
6.1 连接的类型
6.2 连接的输出
6.3 从连接中输⼊
6.3.1 Pushback
6.4 列出和操作连接
6.5 ⼆进制连接
6.5.1 特殊值
7 ⽹络接⼝
7.1 从sockets中读取数据
7.2 使⽤download.file函数
7.3 DCOM接⼝
7.4 CORBA接⼝
8 读取Excel表格
附录A 参考⽂献
(缺少索引)
致谢
⼿册中关系数据库内容部分基于Douglas Bates和Saikat DebRoy的早期⼿册。本⼿册的主要作者是Brian Ripley。
许多志愿者为⼿册中使⽤的软件包作出了贡献。这些涉及的软件包的主要作者是:CORBA Duncan Temple Lang
foreign Thomas Lumley, Saikat DebRoy, Douglas Bates, Duncan,Murdoch and Roger Bivand
hdf5 Marcus Daniels
ncdf David Pierce
ncvar Juerg Schmidli
RMySQL David James and Saikat DebRoy
RNetCDF Pavel Michna
RODBC Michael Lapsley and Brian Ripley
RSPerl Duncan Temple Lang
RSPython Duncan Temple Lang
SJava John Chambers and Duncan Temple Lang
XML Duncan Temple Lang
Brian Ripley 是⽀持连接(connection )的作者。
第⼀章第⼀章::概述统计分析系统读⼊数据和输⼊结果报告到其他系统是让⼈沮丧的任务,会花费⽐统计分析本⾝更多的时间,虽然读者会发现统计分析要更加吸引⼈。本⼿册描述了通过R 本⾝或者通过可来⾃CRAN 的软件包读写数据的机制。虽然涉及到的软件包有的还在开发中,但是他们提供了有⽤的功能。除⾮特别说明,⼿册中描述的内容适⽤于任何平台中的R 。⼀般来说,类似R 这类统计分析系统对⼤批量的数据不是特别合适。这个⽅⾯其他系统⽐R 更加合适,⼿册⼀些地⽅提到说与其增加R 的功能,不如让其他系统进⾏这项⼯作。(⽐如,Therneau 和Grambsch (2000)说他们习惯在SAS 中操作数据,然后使⽤S 的survival 分析。)最近⼀个软件包允许以Java, perl 和python 等语⾔直接整合R 代码来开发,利⽤这些语⾔提供的功能也许适合些。(从Omegahat ⼯程www.doczj.
com/doc/7b17240413.html
上可以得到See the SJava, RSPerl and RSPython 软件包) R 和S 类似有Unix 可重⽤的⼩⼯具的传统,在导⼊数据前和输出结果后可以使⽤awk 和perl 来处理。在Becker, Chambers 和Wilks (1988, Chapter 9)的书中有⼀个例⼦就是通过Unix 的⼯具来检验和操作输⼊到S 的的数据。R ⾃⾝使⽤perl 来操作起帮助⽂件,可以使⽤read.fwf 函数来调⽤perl 脚本,知道停⽌perl 为⽌。Unix 传统的⼯具⽬前有很多,包括适⽤于Windows 平台的。
1.1 导⼊早期导⼊到R 的数据是简单的⽂本格式的⽂件,中⼩规模的数据通常是可以接受的。导⼊⽂本⽂件的基本函数是scan ,随后会有很多更加好⽤的函数将在第⼆章中讨论([Spreadsheet-like data], page 5)。然⽽所有统计顾问都会遇到客户提交的包含权限设置的⼆进制数据的软盘或者CD ,⽐如说Excel 电⼦表格或者SPSS 数据⽂件。通常,可以导出为⽂本格式的⽂件(这样统计顾问就获得了他们电脑上最普通应⽤数据格式⽂件的备份。)但是,有时候这是不可能的,第三章([Importing from other statistical systems], page 11)讨论了通过R 直接读取这些⽂件的机制。读取Excel 电⼦表格的⽅法在第⼋章([Reading Excel spreadsheets], page 25)中做了总结。有时候,数据压缩以后成为加速读取的⼆进制⽂件。我们有时候把图像数据通过这种⽅式来处理,在内存中以⽐特流的形式存在。这种形式的⽂件读取在第五章和第六章第五节([Binary files], page 18 and Section 6.5 [Binary connections], page 21)中讨论。
1.2 导出到⽂本⽂件从R 中导出结果⼀般来说没什么争议,但是还是有些缺陷。通常,⽂本格式的⽂件是最⽅便的交换媒介。(如果需要⼆进制⽂件,参照第五章[Binary files], page 18.)
函数cat成为结果导出函数的基础。cat函数通过⼀个函数作为参数,附带⼀些其他参数使得通过正确调⽤cat函数得到⼀个⽂本⽂件。更好的是,可以多次建⽴连接,打开⼀个⽂件⽤来写⼊或添加,然后关闭⽂件。
常见的⼯作是以矩阵的形式把⼀个矩阵或者数据框写⼊到⽂件中,有时候还带上⾏和列的名称。这可以通过write.table和write 函数来完成。函数write仅写出⼀个制定列数的矩阵或者向量。write.table函数更加⽅⾯,可以写出⼀个数据框(或者可以转化为数据库形式的对象),并带有⾏列标记。写出数据框到⽂本⽂件还有⼀些问题需要考虑。
1.精度问题
通过这些函数,⼤多数实数或者复数转换为完全的精度,write函数得到的精度依赖于option(digits)的当前设置。为了进⼀步细致的控制,可以使⽤format函数来⼀列⼀列的操作数据框。
2.⾸⾏问题
R默认⾸⾏为变量名称⾏,于是⽂件内容常有如下格式:
dist climb time
Greenmantle 2.5 650 16.083
…………
如果write.table函数的www.doczj/doc/7b17240413.html
s参数为NA的话,其他⼀些系统需要输⼊变量名称⾏。Excel中就是这样的情况。
3.分隔符
在英语国家中当逗号不出现在任何字段中的时候,⽂件中常见分隔符是逗号。这些⽂件被称为CSV(comma separated values)⽂件,封装好的函数write.csv提供了⼀些合适的默认选项来读取数据。⼀些情况中,逗号被⽤作进制符号(在write.table函数中设置参数dec = ","),这时候使⽤write.csv2默认参数来读取数据,使⽤分号作为分隔符。使⽤分号或者tab (sep="\t")设置是最安全的选择。
4.缺失值
默认情况下,缺失值的输出为NA,但是可以通过参数na的设置来改变。请注意,wrtie.table函数中把NaNs当作NA处理,但是cat和write函数中不是如此。
5.引号
默认情况下,字符串都有引号(包括⾏和列的名称)。参数quote决定了字符和因⼦变量的引号形式。字符串中含有引号的时候需要注意,三种有⽤的形式如下:
> df <-data.frame(a = I("a \" quote"))
> write.table(df)
"a"
python怎么读取dat文件"1" "a \" quote"
> write.table(df, qmethod = "double")
"a"
"1" "a "" quote"
> write.table(df, quote = FALSE, sep = ",")
a
1,a " quote
escape的第⼆种形式在电⼦表格较常⽤。
MASS包中的write.matrix函数提供了写出矩阵格式数据的特别接⼝,选择块的形式从⽽节省了内存消耗。
可以使⽤sink函数把标准的R输出写到⼀个⽂件,从⽽获得打印的说明。这不是通常最有效的⽅式,options(width)设置也许需要增加。
foreign包中的write.foreign函数通过使⽤write.table函数产⽣⼀个⽂本⽂件,同时也可以给出读取这些⽂本⽂件到其他统计软件包需要的代码。现在可以⽀持数据输出到SPSS和Stata的情况。
1.3 XML
从⽂本⽂件中读取数据的时候,⽤户需要知道如何定制产⽣⽂件的⼀些转换设置,⽐如说评注字符,是否需要⾸⾏(名称),值的分隔符,缺失值的表⽰等等,这些内容在1.2节([Export to text files], page 3)中做了说明。⼀种可以不仅⽤来保存内容,⽽且可以提供内容结构的标记性语⾔可以让⽂件⾃我说明,⼀次不需要提供细节就可以被软件读取数据了。
XML(可扩展性标记语⾔)可以提供这种结构,不仅可以提供技术的数据内容,⽽且可以提供负责的数据结构。XML极其流⾏并且成为通⾏标记和交换语⾔的标准。可以在不同场合下描述地理学的数据,⽐如地图,图表展⽰和数学内容等等。
XML包提供了读写XML⽂件通⽤的⼯具,在R和S-PLUS中都可以⽅便的使⽤这项技术。⼀些⼈展现了如何使⽤XML技术,同时也包括其他内容,去展⽰不同应⽤软件之间可以共同使⽤的数据集,存储R和S-PLUS的对象,使得在两个系统中都可⽤;通过SVG (Scalable Vector Graphics, XML的同义词)展⽰作图,表达函数⽂件;⽣成包括⽂本、数据和代码的动态分析报
告。
XML包的功能超出了本⼿册的范围,可以在www.doczj/doc/7b17240413.html
/RSXML这个⽹页得到XML包的详细资料和例⼦。CRAN中的StatDataML包就是基于XML的⼀个例⼦。
第⼆章类电⼦表格数据
在1.2章节中([Export to text files], page 3),我们看到电⼦表格形式的⽂本⽂件的⼏种情况,其中的数据是矩阵形式的,有的还有⾏和列的名称。本章节将要讨论读取这种格式的数据到R中。
2.1 read.table函数的⼏种形式
read.table函数是读取矩阵形式数据的最好⽅法。其他⼀些函数是调⽤了read.table函数加上了⼀些默认参数。需要注意的
是,read.table函数读取⼤数值矩阵是缺乏效率的,参见下⾯提到的scan函数。
下⾯是⼀些需要注意的⽅⾯:
1、编码:如果⽂件中含有⾮ASCII编码的字段,必须保证以正确的编码形式读⼊。这主要出现在UTF-8的情况下读取Latin-1⽂件格式,可以通过如下⽅式实现read.table(file("file.dat", encoding="latin1"))。这种⽅法可以在Latin-1名字的任何情况下成功。
2、⾸⾏:我们推荐显式的指定⾸⾏参数,依照惯例,⾸⾏表⽰列名称⽽⾮⾏名称,于是出现了⽐其他⾏少⼀个字段的情况。(在R中,设置参数header = TRUE)。如果⽂件中有
⾸个字段作为⾏名称,可以通过如下⽅式实现read.table("file.dat", header = TRUE,
www.doczj/doc/7b17240413.html
s = 1)。列名称可以显式的通过www.doczj/doc/7b17240413.html
s参数实现,显式的名称将不考虑⾸⾏。
3、分隔符:⼀般来说,可以看到⽂件内容就知道字段之间的分隔符,但是字段间有空格的时候,可能是缺失的参数sep = "",可以代表任意间隔(空格、制表符或者回车)作为分隔符。请注意,选择的分隔符会影响到带有引号的字符串。如果在制表符分隔符的⽂件中包含空字段,请使⽤sep = "\t"作为参数。
4、引号:默认情况下,字符串使⽤单引号或者双引号,这时候所有字符中的引号都作为⼀部分来匹配。引号的有效设置通过quote参数来控制。sep ="\n"默认的改变quote = ""。如果没有指定分隔符,没有被引字符串前⾯使⽤c语⾔形式的‘\’。如果指定了分隔符,被引⽤字符串中的引号在电⼦表格⽂件中连续两次出现当作通常的⼀个字符。⽐如,read.table("testfile", sep = ",")⽅式可以读取’One string isn’’t two’,"one more" ,⽽不会对缺省的分隔符产⽣作⽤。
5、缺失值:默认情况下,包含NA的字符代表缺失值,不过可以通过na.strings参数来改变设置,na.strings是包含⼀个和⼏个表⽰缺失值的字符。数值列中空值也被视作缺失值。在数值列中,NaN、Inf和-Inf是合法的。
6、尾⾏:通常从电⼦⽂档格式⽂件中导⼊的数据的时候,⽤参数fill=TRUE省略尾部空字段。
7、字符型字段中的空格:如果指定了分隔符,字符型字段中前后空格作为字段的部分存在,若想去掉这些空格,使⽤参数strip.white=TRUE.
8、空⽩⾏:缺失情况下,read.table函数略过空⽩⾏。可以通过参数blank.lines.skip=FALSE 来改变设置,这是需要配套使⽤参数fill=TRUE。
9、变量的类:除⾮你有特别的指定,read.table函数为数据框中的每⼀个变量⾃动选择⼀个合适的类。遵照如下的顺序:logical, integer, numeric and complex,略过⽆法转化的部分。如果以上所有都失败了,变量转化为因⼦(factor)。参数colClasses和as.is提供了更强的控制,as.is禁⽌字符型向量转化为因⼦。使⽤colClasses参数可以在输⼊数据的时候为各列指定类。需要注意的是,colClasses和as.is参数⽤来指定各列,不是针对每个变量,于是包含了⾏名的那⼀列(如果这列存在的话)。
10、注解:缺省情况下,read.table函数使⽤‘#’作为注释字符,如果被读⼊了,该⾏剩下的部分将被省略掉(除了使⽤引号的以保外)。空⽩⾏和注释⾏被视为空⾏。如果已知数据⽂件中没有注视,那么可以设置comment.char="",也许速度会更快。
11、Escapes:很多操作系统中,在⽂本⽂件中使⽤反斜杠作为escape字符,但是Windows 操作系统中不是如此(⽽是使⽤反斜杠作为⽂件路径名的⼀部分)。在R中是否使⽤这样的惯例风格是可选的。在read.table和scan两个函数中,有⼀个allowEscapes的参数。从R2.2.0开始,缺省设置为false,
反斜杠被解释为excape符号(在上述情况下)。如果设置为true,就解释为C语⾔风格的escape字符,称为控制字符,可以表⽰类似\a, \b, \f, \n, \r, \t, \v以及⼋进制、⼗六进制\040 和\0x2A的情况。
通⽤函数read.csv和read.delim给read.table函数提供了恰当的参数,⽤来读取英语情况下的CSV和制表符分割⽂件。⽽read.csv2和read.delim2函数提供了使⽤逗号作为⼩数点分割情况下读取类似⽂件的功能。
如果read.table函数中参数设置不正确的时候,出错提⽰信息通常有如下形式:
Error in scan(file = file, what = what, sep = sep, :
line 1 did not have 5 elements
或者
Error in read.table("files.dat", header = TRUE) :
more columns than column names
这提供了寻错误⽽需要的⾜够信息,同时count.fields这个辅助函数可以⽤来做进⼀步的审核。
在读取⼤数据的时候,效率是重要的。通过设置comment.char="",把每⼀列通过colClasses为⼀个原⼦型向量(logical, integer, numeric, complex, character 或者raw),设置nrows——读取的⾏数——做⼀个恰当的估计要⽐不做任何设置好,这些都有利于提⾼数据读取效率。可以看下⾯的例⼦。
2.2 固定宽度格式的⽂件
有时候数据⽂件中的字段没有分隔符,但是字段实现制定了列的情况。这在打卡的时代是常见的事情,现在有时候也⽤来节省⽂件的空间。
通过指定⼀个包含字符宽度的向量,read.fwf函数提供读取这种⽂件的简单途径。这个函数把整个⽂件作为整⾏读⼊内存,拆分字符,写出到⼀个临时的制表符分割的⽂件,然后调⽤read.table函数。对⼩⽂件⽽⾔这是尚可的办法,但是对任何复杂的情况,我们推荐使⽤perl等语⾔预处理⼀下⽂件转化格式。
read.fortran函数是另外⼀个读取固定格式⽂件的函数,使⽤了Fortran风格的列确定⽅法。
2.3 直接使⽤scan函数
read.table和read.fwf两个函数都通过scan函数来读取⽂件,然后处理scan函数得到的结果。这⾮常⽅便,不过有时候直接使⽤scan函数要好些。
函数scan有太多的参数,很多参数已经通过read.table函数介绍过了。最主要的参数是what,它⽤来制定读取⽂件中变量的类型的列表。如果这个列表命名了,这些命名就会作⽤到返回列表的组成部分。类型可以是数值(numeric),字符(character)或者复数(complex)等,通常可以通过例⼦来指定,⽐如0,“”,0i等。⽐如说:
cat("2 3 5 7", "11 13 17 19", file="ex.dat", sep="\n")
scan(file="ex.dat", what=list(x=0, y="", z=0), flush=TRUE)
会返回⼀个包含三个组建的列表,并且不读取⽂件中的第四列。
如果想要读取整⾏整⾏的数据便于进⼀步的处理,readLines函数可能更⽅便。
scan函数⼀个通常的⽤法是读取⼤的矩阵。假如⽂件matrix.dat恰好包含200×2000的矩阵。于是可以使⽤
A <-matrix(scan("matrix.dat", n = 200*2000), 200, 2000, byrow = TRUE)
⼀个测试表明该过程需要1秒钟(在Linux下⾯,相同硬件配置的Windows下需要3秒钟),⽽
A <-as.matrix(read.table("matrix.dat"))
需要10秒钟(⽽且需要更多的内存)。
A <-as.matrix(read.table("matrix.dat", header = FALSE, nrows = 200,
comment.char = "", colClasses = "numeric"))
则需要7秒钟。差异主要是因为读取2000分离短列的开销:当长度为2000的时候,scan 函数需要9秒钟,read.table函数使⽤有效设置后(特别的,指定colClasses)需要18秒钟,原始不设置情况下需要125秒钟。
请注意所需的时间和读取数据的类型相关,考虑读取百万个整数的情况:
writeLines(as.character((1+1e6):2e6), "ints.dat")
xi <-scan("ints.dat", what=integer(0), n=1e6) # 0.77s

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。