1、R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促 ,错误极多 ,敬请指出 。任何意见和建议请联系 : R 数据导入和导出数据导入和导出数据导入和导出数据导入和导出 版本版本版本版本 : :2.2.12.1( (20052005 年年年 年 1212 月月月 月 2020 日日日 日) ) ) R 开发核心小组开发核心小组开发核心小组开发核心小组 目录 致谢 1 概述概述概述概述 1.1 导入 1.2 导出到文本文件 1.3 XML 2 类电子表格格式的数据类电子表格格式的数据类电子表格格式的数据类电子表格格式的数据 2.1 read.table 函数的各种形式 2.
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 二进制文件二进制文件二进制文件二进制文件
3、5.1 二进制数据格式 R-data (2.2.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 表格表格表格表格
4、附录 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 Sch
5、midli 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 R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促 ,错误极多 ,敬请指出 。任何意见和建议请联系 : Brian Ripley
6、 是支持连接 ( connection)的作者 。 第一章第一章第一章第一章 : :概述 概述概述概述 统计分析系统读入数据和输入结果报告到其他系统是让人沮丧的任务 ,会花费比统计分析本身更多的时间 ,虽然读者会发现统计分析要更加吸引人 。 本手册描述了通过 R 本身或者通过可来自 CRAN 的软件包读写数据的机制 。虽然涉及到的软件包有的还在开发中 ,但是他们提供了有用的功能 。 除非特别说明 ,手册中描述的内容适用于任何平台中的 R。 一般来说 ,类似 R 这类统计分析系统对大批量的数据不是特别合适 。这个方面其他系统比 R 更加合适 ,手册一些地方提到说与其增加 R 的功能 ,不如让其他
7、系统进行这项工作 。(比如 , Therneau 和 Grambsch (2000)说他们习惯在 SAS 中操作数据 ,然后使用 S 的 survival分析 。) 最近一个软件包允许以 Java, perl 和 python 等语言直接整合 R 代码来开发 ,利用这些语言提供的功能也许适合些 。( 从 Omegahat 工程 http:/www.omegahat.org 上可以得到 See the SJava, RSPerl and RSPython 软件包 ) R 和 S 类似有 Unix 可重用的小工具的传统 ,在导入数据前和输出结果后可以使用 awk和 perl 来处理 。在 Beck
8、er, Chambers 和 Wilks (1988, Chapter 9)的书中有一个例子就是通过Unix 的工具来检验和操作输入到 S 的的数据 。 R 自身使用 perl 来操作起帮助文件 ,可以使用 read.fwf 函数来调用 perl 脚本 ,知道停止 perl 为止 。 Unix 传统的工具目前有很多 ,包括适用于 Windows 平台的 。 1.1 导入导入导入导入 早期导入到 R 的数据是简单的文本格式的文件 ,中小规模的数据通常是可以接受的 。导入文本文件的基本函数是 scan,随后会有很多更加好用的函数将在第二章中讨论( Spreadsheet-like data, pa
9、ge 5)。 然而所有统计顾问都会遇到客户提交的包含权限设置的二进制数据的软盘或者 CD,比如说 Excel 电子表格或者 SPSS 数据文件 。通常 ,可以导出为文本格式的文件 (这样统计顾问就获得了他们电脑上最普通应用数据格式文件的备份 。) 但是 ,有时候这是不可能的 ,第三章 ( Importing from other statistical systems, page 11)讨论了通过 R 直接读取这些文件的机制 。读取 Excel 电子表格的方法在第八章 ( Reading Excel spreadsheets, page 25)中做了总结 。 有时候 ,数据压缩以后成为加速读取
10、的二进制文件 。我们有时候把图像数据通过这种方式来处理 ,在内存中以比特流的形式存在 。这种形式的文件读取在第五章和第六章第五节( Binary files, page 18 and Section 6.5 Binary connections, page 21)中讨论 。 1.2 导出到文本文件导出到文本文件导出到文本文件导出到文本文件 从 R 中导出结果一般来说没什么争议 ,但是还是有些缺陷 。通常 ,文本格式的文件是最方便的交换媒介 。( 如果需要二进制文件 ,参照第五章 Binary files, page 18.) R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时
11、间仓促 ,错误极多 ,敬请指出 。任何意见和建议请联系 : 函数 cat 成为结果导出函数的基础 。 cat 函数通过一个函数作为参数 ,附带一些其他参数使得通过正确调用 cat 函数得到一个文本文件 。更好的是 ,可以多次建立连接 ,打开一个文件用来写入或添加 ,然后关闭文件 。 常见的工作是以矩阵的形式把一个矩阵或者数据框写入到文件中 ,有时候还带上行和列的名称 。这可以通过 write.table 和 write 函数来完成 。函数 write 仅写出一个制定列数的矩阵或者向量 。 write.table 函数更加方面 ,可以写出一个数据框 (或者可以转化为数据库形式的对象 ), 并带
12、有行列标记 。写出数据框到文本文件还有一些问题需要考虑 。 1.精度问题 通过这些函数 ,大多数实数或者复数转换为完全的精度 , write 函数得到的精度依赖于option( digits)的当前设置 。为了进一步细致的控制 ,可以使用 format 函数来一列一列的操作数据框 。 2.首行问题 R 默认 首行为变量名称行 ,于是文件内容常有如下格式 : dist climb time Greenmantle 2.5 650 16.083 如果 write.table 函数的 col.names 参数为 NA 的话 ,其他一些系统需要输入变量名称行 。Excel 中就是这样的情况 。 3.分
13、隔符 在英语国家中当逗号不出现在任何字段中的时候 ,文件中常见分隔符是逗号 。这些文件被称为 CSV(comma separated values)文件 ,封装好的函数 write.csv 提供了一些合适的默认选项来读取数 据。一些情况中 ,逗号被用作进制符号 (在 write.table 函数中设置参数 dec = “,“),这时候使用 write.csv2 默认参数来读取数据 ,使用分号作为分隔符 。使用分号或者 tab( sep=“t“)设置是最安全的选择 。 4.缺失值 默认情况下 ,缺失值的输出为 NA,但是可以通过参数 na 的设置来改变 。请注意 ,wrtie.table 函数中
14、把 NaNs 当作 NA 处理 ,但是 cat 和 write 函数中不是如此 。 5.引号 默认情况下 ,字符串都有引号 (包括行和列的名称 )。 参数 quote 决定了字符和因子变量的引号形 式。字符串中含有引号的时候需要注意 ,三种有用的形式如下 : df write.table(df) “a“ “1“ “a “ quote“ write.table(df, qmethod = “double“) “a“ “1“ “a “ quote“ write.table(df, quote = FALSE, sep = “,“) a 1,a “ quote escape 的第二种形式在电子表格较
15、常用 。 R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促 ,错误极多 ,敬请指出 。任何意见和建议请联系 : MASS 包中的 write.matrix 函数提供了写出矩阵格式数据的特别接口 ,选择块的形式从而节省了内存消耗 。 可以使用 sink 函数把标准的 R 输出写到一个文件 ,从而获得打印的说明 。这不是通常最有效的方式 , options(width)设置也许需要增加 。 foreign 包中的 write.foreign 函数通过使用 write.table 函数产生一个文本文件 ,同时也可以给出读取这些文本文件到其他统计软件包需要的代码 。现在可以
16、支持数据输出到 SPSS 和Stata 的情况 。 1.3 XML 从文本文件中读取数据的时候 ,用户需要知 道如何定制产生文件的一些转换设置 ,比如说评注字符 ,是否需要首行 (名称 ), 值的分隔符 ,缺失值的表示等等 ,这些内容在 1.2 节( Export to text files, page 3)中做了说明 。一种可以不仅用来保存内容 ,而且可以提供内容结构的标记性语言可以让文件自我说明 ,一次不需要提供细节就可以被软件读取数据了 。 XML(可扩展性标记语言 )可以提供这种结构 ,不仅可以提供技术的数据内容 ,而且可以提供负责的数据结构 。 XML 极其流行并且成为通行标记和交换
17、语言的标准 。可以在不同场合下描述地理学的数据 ,比如地图 ,图表展示和数学内容等等 。 XML 包提供了读写 XML 文件通用的工具 ,在 R 和 S-PLUS 中都可以方便的使用这项技术 。一些人展现了如何使用 XML 技术 ,同时也包括其他内容 ,去展示不同应用软件之间可以共同使用的数据集 ,存储 R 和 S-PLUS 的对象 ,使得在两个系统中都可用 ;通过 SVG( Scalable Vector Graphics, XML 的同义词 )展示作图 ,表达函数文件 ;生成包括文本 、数据和代码的动态分析报告 。 XML 包的功能超出了本手册的范围 ,可以在 http:/www.omeg
18、ahat.org/RSXML 这个 网页得到 XML 包的详细资料和例子 。 CRAN 中的 StatDataML 包就是基于 XML 的一个例子 。 第二章第二章第二章第二章 类电子表格数据类电子表格数据类电子表格数据类电子表格数据 在 1.2 章节中 ( Export to text files, page 3), 我们看到电子表格形式的文本文件的几种情况 ,其中的数据是矩阵形式的 ,有的还有行和列的名称 。本章节将要讨论读取这种格式的数据到 R 中。 2.1 read.table 函数的几种形式函数的几种形式函数的几种形式函数的几种形式 read.table 函数是读取矩阵形式数据的最好
19、方法 。其他一些函数是调用了 read.table 函数加上了一些默认参数 。需要注意 的是 , read.table 函数读取大数值矩阵是缺乏效率的 ,参见下面提到的 scan 函数 。 下面是一些需要注意的方面 : 1、编码 :如果文件中含有非 ASCII 编码的字段 ,必须保证以正确的编码形式读入 。这主要 出 现 在 UTF-8 的 情 况 下 读 取 Latin-1 文 件 格 式 , 可 以 通 过 如 下 方 式 实 现read.table(file(“file.dat“, encoding=“latin1“)。这种方法可以在 Latin-1 名字的任何情况下成功 。 2、首行
20、:我们推荐显式的指定首行参数 ,依照惯例 ,首行表示列名称而非行名称 ,于是出现了比 其他行少一个字段的情况 。( 在 R 中,设置参数 header = TRUE)。 如果文件中有R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促 ,错误极多 ,敬请指出 。任何意见和建议请联系 : 首个字段作为行名称 ,可以通过如下方式实现 read.table(“file.dat“, header = TRUE, row.names = 1)。列名称可以显式的通过 col.names 参数实现 ,显式的名称将不考虑首行 。 3、分隔符 :一般来说 ,可以看到文件内容就知道字段之间
21、的分隔符 ,但是字段间有空格的时候 ,可能是缺失的参数 sep = “,可以代表任意间隔 (空格 、制表符或者回车 )作为分隔符 。请注意 ,选择的分隔符会影响到带有引 号的字符串 。如果在制表符分隔符的文件中包含空字段 ,请使用 sep = “t“作为参数 。 4、引号 :默认情况下 ,字符串使用单引号或者双引号 ,这时候所有字符中的引号都作为一部分来匹配 。引号的有效设置通过 quote 参数来控制 。 sep =“n“默认的改变 quote = “。如果没有指定分隔符 ,没有被引字符串前面使用 c 语言形式的 。如果指定了分隔符 ,被引用字符串中的引号在电子表格文件中连续两次出现当作通常
22、的一个字符 。比如 ,read.table(“testfile“, sep = “,“)方式可以读取 One string isn t two ,“one more“ ,而不会对缺省的分隔符产生作用 。 5、缺失值 :默认情况下 ,包含 NA 的字符代表缺失值 ,不过可以通过 na.strings 参数来改变设置 , na.strings 是包含一个和几个表示缺失值的字符 。数值列中空值也被视作缺失值 。在数值列中 , NaN、 Inf 和 -Inf 是合法的 。 6、尾行 :通常从电子文档格式文件中导入的数据的时候 ,用参数 fill=TRUE 省略尾部空字段 。 7、字符型字段中的空格 :
23、如果指定了分隔符 ,字符型字段中前后空格作为字段的部分存在,若想 去掉这些空格 ,使用参数 strip.white=TRUE. 8、空白行 :缺失情况下 , read.table函数略过空白行 。可以通过参数 blank.lines.skip=FALSE来改变设置 ,这是需要配套使用参数 fill=TRUE。 9、变量的类 :除非你有特别的指定 , read.table 函数为数据框中的每一个变量自动选择一个合适的类 。遵照如下的顺序 : logical, integer, numeric and complex,略过无法转化的部分。如果以上所有都失败了 ,变量转化为因子 ( factor)。
24、 参数 colClasses 和 as.is 提供了更强的控制 , as.is 禁止字符型向量转化为因子 。使用 colClasses 参数可以在输入数据的时候为各列指定类 。需要注意的是 , colClasses 和 as.is 参数用来指定各列 ,不是针对每个变量 ,于是包含了行名的那一列 (如果这列存在的话 )。 10、注解 :缺省情况下 , read.table 函数使用 #作为注释字符 ,如果被读入了 ,该行剩下的部分将被省略掉 (除了使用引号的以保外 )。 空白行和注释行被视为空行 。如果已知数据文件中没有注视 ,那么可以设置 comment.char=“,也许速度 会更快 。 1
25、1、 Escapes:很多操作系统中 ,在文本文件中使用反斜杠作为 escape 字符 ,但是 Windows操作系统中不是如此 (而是使用反斜杠作为文件路径名的一部分 )。 在 R 中是否使用这样的惯例风格是可选的 。在 read.table 和 scan 两个函数中 ,有一个 allowEscapes 的参数 。从 R2.2.0开始 ,缺省设置为 false,反斜杠被解释为 excape 符号 (在上述情况下 )。 如果设置为 true,就解释为 C 语言风格的 escape 字符 ,称为控制字符 ,可以表示类似 a, b, f, n, r, t, v 以及八进制 、十六进制 040 和
26、0x2A 的情况 。 通用函数 read.csv 和 read.delim 给 read.table 函数提供了恰当的参数 ,用来读取英语情况下的 CSV 和制表符分割文件 。而 read.csv2 和 read.delim2 函数提供了使用逗号作为小数点分割情况下读取类似文件的功能 。 如果 read.table 函数中参数设置不正确的时候 ,出错提示信息通常有如下形式 : Error in scan(file = file, what = what, sep = sep, : R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促 ,错误极多 ,敬请指出 。任何意见和建
27、议请联系 : 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), 设
28、置nrows 读取的行数 做一个恰当的估计要比不做任何设置好 ,这些都有利于提高数据读取效率 。可以看下面的例子 。 2.2 固定宽度格式的文件固定宽度格式的文件固定宽度格式的文件固定宽度格式的文件 有时候数据文件中的字段没有分隔符 ,但是字段实现制定了列的情况 。这在打卡的时代是常见的事情 ,现在有时候也用来节省文件的空间 。 通过指定一个包含字符宽度的向量 , read.fwf 函数提供读取这种文件的简单途径 。这个函数把整个文件作为整行读入内存 ,拆分字符 ,写出到一个临时的制表符分割的文件 ,然后调用 read.table 函数 。对小文 件而言这是尚可的办法 ,但是对任何复杂的情况
29、,我们推荐使用 perl 等语言预处理一下文件转化格式 。 read.fortran 函数是另外一个读取固定格式文件的函数 ,使用了 Fortran 风格的列确定方法。 2.3 直接使用直接使用直接使用直接使用 scan 函数函数函数函数 read.table 和 read.fwf 两个函数都通过 scan 函数来读取文件 ,然后处理 scan 函数得到的结果 。这非常方便 ,不过有时候直接使用 scan 函数要好些 。 函数 scan 有太多的参数 ,很多参数已经通过 read.table 函数介绍过了 。最主要的参数是what,它用来制定读取 文件中变量的类型的列表 。如果这个列表命名了
30、,这些命名就会作用到返回列表的组成部分 。类型可以是数值 ( 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 函
31、数一个通常的用法是读取大的矩阵 。假如文件 matrix.dat 恰好包含 200 2000 的矩阵 。于是可以使用 A 30 ORDER BY Murder SELECT t.sch, c.meanses, t.sex, t.achieve FROM student as t, school as c WHERE t.sch = c.id SELECT sex, COUNT(*) FROM student GROUP BY sex SELECT sch, AVG(sestat) FROM student GROUP BY sch LIMIT 10 第一例是从 R 中已经被赋值到数据表中的数据
32、框 USArrests 中选择两列 ,通过第三列来选择符合条件的数据 ,并且让结果排序 。第二例完成了 student 和 school 两个数据表的连接 ,并且返回四列 。第三里和第四例查询完成交叉表 ,返回频次和平均值 (五个汇总函数是COUNT, SUM, MAX, MIN 和 AVG,每个函数用于单独一列 )。 SELECT 查询用 FROM 选择数据表 , WHERE 确定选取条 件(多个条件的时候使用 AND或者 OR 组成 ), 使用 ORDER BY 对结果进行排序 。和数据框不同 ,关系型数据库中的各行R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促
33、 ,错误极多 ,敬请指出 。任何意见和建议请联系 : 最好认为是没有顺序的 ,没有 ORDER BY 子句的时候 ,顺序是不确定的 。可以对用逗号分割的多行进行排序 (以字典顺序 )。 通过设置 DESC 在 ORDER BY 字段的后面可以反向排序。 SELECT DISTINCT 查询仅返相应数据表中回各各不同的行 。 GROUP BY 子句通过准则来选择各组的行 。如果指定了多列 ,则多维交叉分类被 5 个汇总函数进行汇总计算 。 HAVING 子句允许通过汇总计算得到的值来选择包 含或者不好某些行 。 如果 SELECT 中包含了 ORDER BY 子句会产生唯一的顺序 ,增加一个
34、LIMIT 子句可以选取 (通过数值 )连续一块数据的列 。这对一次取回一个数据行块是有用的 (当 LIMIT 子句用来优化查询的时候 ,除非顺序是唯一的 ,否则是不可靠的 )。 Kline 和 Kline (2001)讨论了 SQL 在 SQL Server 2000 、 Oracle、 MySQL 和 PostgreSQL中实现的具体细节 。 数据库中的数据可以保存为多种数据类型 。数据类型是数据库管理系统指定的 ,不过SQL 标准定义了许多类型 ,下列 是广泛地被实现了的 (通常不是通过 SQL 名称 ): float(p) 实数 ,可选精度 ,通常称为实数或者双精度数 integer
35、32 位整数 ,通常称为整数 smallint 16 位整数 character(n) 定长字符串 ,通常称为字符 character varying(n) 变长字符串 ,通常称为变长字符 ,有 255 字符的限制 Boolean true 或 false,通常称为 bool 或者 bit date 日历时间 time 当日时间 timestamp 日期时间 和时 区有关 ,有多种时间 ,以及多种日期时间 。文本和 bolb(表示大块文本和二进制数据)也被广泛的实现了 。 R 接口包广泛地的为用户实现隐藏了数据类型转换的情况 。 4.3 R 接口包接口包接口包接口包 在 CRAN 上有几个包可
36、以让 R 和 DBMSs 进行通信 。它们提供了不同层次的抽象 。有一些提供了将整个数据框读入写出到数据库中 。所有这些包中都有通过 SQL 查询语言的函数选取数据 ,读取结果分片 (通常是不同组的行 )或者整体作为数据框 7。 除了 RODBC 以外 ,其他所有的包都和一种 DBMS 相关 ,然而所有的操作都使用 DBI包 (http:/developer.r-project.org/db)作为统一的前端工具和各种作为终端工具的结合起来 ,其中开发最好的是 RMySQL 包。在 CRAN 中终端的包还有 ROracle 和 RSQLite(和内置的数据库管理系统 SQLite 结合工作 ,
37、http:/ 较早的 RmSQL 和 RPgSQL 两个包当前在 CRAN 的开发领域已经终止了支持 :BioConductor 项目有一个 RdbiPgSQL.PL.R (http:/ R 嵌入到 PostgreSQL 的项目 。 CRAN 上的 RMySQL 包提供了和 MySQL 数据库系统的接口 (参见 http:/ and Dubois, 2000.)。 这里的表示适合 0.5-0 版:早期的版本会有本质上的差异 。当前版本需要DBI 包,这里的描述只需要做很小的改变就可以适用于其他包使用 DBI 的终端 。 R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促
38、 ,错误极多 ,敬请指出 。任何意见和建议请联系 : 从 3.23.x 版本以来 ,在 GPL 下, MySQL 存在于 Unix/Linux 和 Windows。 MySQL 是一个轻量级的数据库系统 (其默认操作系统的系统文件是大小写敏感的 ,不同于 Windows 的情况 )。RMySQL 包在 Linux 和 Windows 下均可使用 。 dbDriver(“MySQL“)调用返回一个数据库连接管理对象 ,接着调用 dbConnect 函数打开数据库连接 ,随后可以使用泛型函数 dbDisconnect 来关闭数据库连接 。相应的可以在 ROracle 或 RSQLite 中使用
39、dbDriver(“Oracle“)或 dbDriver(“SQLite“) SQL 查询的发送可以通过 dbSendQuery 或 dbGetQuery 函数来实现 。 dbGetQuery 函数发送查询并取回结果保存为一个数据框 。 dbSendQuery函数则发送查询避过那发挥一个从 DBIResult类继承而来的对象中 ,这个对象可以取回结果 ,随后可以使用 dbClearResult 函数删除结果 。 函数 fetch 用来取回查询中部分或者全部的行 ,生成一个列表 。函数 dbHasCompleted 标识是否所有的行都被取回了 , dbGetRowCount 函数返回结果中的行数
40、 。 在读出 、写入和删除数据库中的表方面 ,都有方便的接口 。 dbReadTable 和 dbWriteTable 函数从一个 R 的数据框中读写数据表 ,并把数据框的行名变为 MySQL 数据表中的 row_names字段 。 library(RMySQL) # 加载 DBI 包 # 打开一个和 MySQL 的连接 con dbListTables(con) # 载入一个数据框到数据库中 ,删除已有同名的数据表 data(USArrests) dbWriteTable(con, “arrests“, USArrests, overwrite = TRUE) TRUE dbListTabl
41、es(con) 1 “arrests“ # 读取整个数据表 dbReadTable(con, “arrests“) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 . # 选择加载过的数据表 dbGetQuery(con, paste(“select row_names, Murder from arrests“, “where Rape 30 order by Murder“) row_n
42、ames Murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促 ,错误极多 ,敬请指出 。任何意见和建议请联系 : 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 dbRemoveTable(con, “arrests“) dbDisconnect(con) CRAN 上的 RODBC 包给支持 ODBC8 的数据库管理系统提供了接口 。它可以广泛存在 ,并允许
43、相同的 R 代码和不同的数据库管理系统连通 。 RODBC 在 Unix/Linux 和 Windows 均可运行 ,并且几乎所有的数据库管理系统都支持 ODBC。我们已经测试了 Windows 上的Microsoft SQL Server, Access, MySQL 和 PostgreSQL,以及 Linux 上的 MySQL, Oracle, PostgreSQL and SQLite 等。 ODBC 是一个客户服务器系统 ,可以顺利的在 Windows 客户机上 连接运行在 Unix 上的数据库管理系统 ,反之同样可以 。 在 Windows 上 , 通 常 都 有 对 ODBC 的
44、支 持 , 当 前 的 版 本 可 以 从http:/ ,作为 MDAC 的组成部分 。在 Unix/Linux 上,你也许需要一个 ODBC 驱动管理器 ,比如 unixODBC (http:/www.unixODBC.org)或者 iOBDC (http:/www.iODBC.org) 以及一个数据库管理系统的驱动程序 。 在 Windows 下不仅提供了对数据库管理系统的支持 ,而且提供了 对 Excel( .xls)数据表 、 Dbase(.dbf)文件 ,甚至文本文件的支持 (这些应用都不再用安装了 )。 并发的连接是可能的 。通过 odbcConnect或者 odbcDriverC
45、onnect函数调用 (Windows界面下 ,允许通过对话框操作 )打开一个数据库连接 ,返回一个随后对数据库进行操作的句柄 。打印一个数据库连接可以提供 ODBC 连接的一些细节 , odbcGetInfo 函数可以提供客户机和服务器的细节 。 通过调用 close 或者 odbcClose 函数可以关闭一个数据库连接 ,也可以在一个 R 流程结束时又没有 R 的对象引用其时自动的关闭 (会给出一个警告 )。 一个数据库连接中各个表格的细节可以通过 sqlTables 函数得到 。 函数 sqlSave 把一个 R 的数据框写入到数据库的一个表中 , sqlFetch 函数把数据库中的一个
46、表写到 R 中的一个数据框 。 一个 SQL 查询可以通过 sqlQuery 函数发送到数据库中 。这样返回结果到一个 R 的数据框中 。( sqlCopy 发送一个查询到数据库中 ,并且将结果保存为数据库中的一个数据表 。) 下面时一个使用 PostgreSQL 的例子 , ODBC 把列和数据框名字转化为小写 。我们将使用预先建 好的数据框 testdb,在 unixODBC 环境下把 DSN(数据源名称 )保留在 /.odbc.ini文件中。相同的代码可以使用 MyODBC 在 Linux 或者 Windows(这时候 MySQL 也把名字转化为小写 )下针对 MySQL 使用 。在 W
47、indows 操作环境下 , DSN 在“控制面板 ”中操作 ( 2000/xp版本中 ,“ ODBC 数据源 ”在管理工具选项中 )。 library(RODBC) # 把命名改为小写 channel data(USArrests) R-data (2.2.1) 刘重杰翻译初稿 由于本人水平有限 ,时间仓促 ,错误极多 ,敬请指出 。任何意见和建议请联系 : sqlSave(channel, USArrests, rownames = “state“, addPK = TRUE) rm(USArrests) # 给出数据库中的数据表 sqlTables(channel) TABLE_QUA
48、LIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS 1 usarrests TABLE # 展示数据库中数据表的内容 sqlFetch(channel, “USArrests“, rownames = “state“) murder assault urbanpop rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 . # 一个 SQL 查询 sqlQuery(channel, “select state, murder from USArrests where rape 30 order by murder“) state murder 1 Colorado 7.9 2 Arizona 8.1 3 California 9.0 4 Alaska 10.0 5 New Mexico 11.4 6 Michigan 12.1 7 Nevada 12.2 8 Florida 15.4 # 移除数据库中的数据表 sqlDrop(channel, “USArrests“) # 关