09.05.2015 Views

R 数据导入和导出.pdf - 数学建模学习资源网站

R 数据导入和导出.pdf - 数学建模学习资源网站

R 数据导入和导出.pdf - 数学建模学习资源网站

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

R 数 据 导 入 和 导 出<br />

版 本 :2.2.1<br />

2.2.1(2005<br />

2005 年 12 月 20 日 )<br />

R 开 发 核 心 小 组<br />

目 录<br />

致 谢<br />

1 概 述<br />

1.1 导 入<br />

1.2 导 出 到到 文 本 文 件<br />

1.3 XML<br />

2 类 电 子 表 格 格 式 的 数 据<br />

2.1 read.table 函 数 的 各 种 形 式<br />

2.2 固 定 长 度 格 式 文 件<br />

2.3 直 接 使 用 scan 函 数<br />

2.4 整 理 数 据<br />

2.5 平 面 列 联 表<br />

3 导 入 其 他 统 计 软 件 数 据<br />

3.1 EpiInfo, Minitab, S-PLUS, SAS, SPSS, Stata, Systat<br />

3.2 Octave<br />

4 关 系 数 据 库<br />

4.1 为 何 使 用 数 据 库<br />

4.2 关 系 数 据 库 管 理 系 统 概 要<br />

4.2.1 SQL 查 询<br />

4.2.2 数 据 类 型<br />

4.3 R 的 接 口 包包<br />

4.3.1 DBI 和和 RMySQL 包包<br />

4.3.2 RODBC 包包<br />

5 二 进 制制 文 件<br />

5.1 二 进 制制 数 据 格 式<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

5.2 dBase 文 件 (DBF)<br />

6 连 接<br />

6.1 连 接 的 类 型<br />

6.2 连 接 的 输 出<br />

6.3 从 连 接 中 输 入<br />

6.3.1 Pushback<br />

6.4 列 出 和和 操 作 连 接<br />

6.5 二 进 制制 连 接<br />

6.5.1 特 殊 值<br />

7 网 络 接 口<br />

7.1 从 sockets 中 读 取 数 据<br />

7.2 使 用 download.file 函 数<br />

7.3 DCOM 接 口<br />

7.4 CORBA 接 口<br />

8 读 取 Excel 表 格<br />

附 录 A 参 考 文 献<br />

( 缺 少 索 引 )<br />

致 谢<br />

手 册 中 关 系 数 据 库 内 容 部 分 基 于 Douglas Bates 和和 Saikat DebRoy 的 早 期 手 册 ⃞ 本 手 册 的<br />

主 要 作 者 是 Brian Ripley⃞<br />

许 多 志 愿 者 为 手 册 中 使 用 的 软 件 包包 作 出 了 贡 献 ⃞ 这 些 涉 及 的 软 件 包包 的 主 要 作 者 是 :<br />

CORBA Duncan Temple Lang<br />

foreign Thomas Lumley, Saikat DebRoy, Douglas Bates, Duncan,Murdoch and Roger<br />

Bivand<br />

hdf5 Marcus Daniels<br />

ncdf David Pierce<br />

ncvar Juerg Schmidli<br />

RMySQL David James and Saikat DebRoy<br />

RNetCDF Pavel Michna<br />

RODBC Michael Lapsley and Brian Ripley<br />

RSPerl Duncan Temple Lang<br />

RSPython Duncan Temple Lang<br />

SJava John Chambers and Duncan Temple Lang<br />

XML Duncan Temple Lang<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

Brian Ripley 是 支 持 连 接 (connection) 的 作 者 ⃞<br />

第 一 章 : 概 述<br />

统 计 分 析 系 统 读 入 数 据 和和 输 入 结 果 报 告告 到到 其 他 系 统 是 让 人 沮 丧 的 任 务 , 会 花 费 比 统 计 分<br />

析 本 身 更 多 的 时 间 , 虽 然 读 者 会 发 现 统 计 分 析 要 更 加 吸吸 引 人 ⃞<br />

本 手 册 描 述 了 通 过 R 本 身 或 者 通 过 可 来 自 CRAN 的 软 件 包包 读 写 数 据 的 机 制制 ⃞ 虽 然 涉 及<br />

到到 的 软 件 包包 有 的 还 在 开 发 中 , 但 是 他 们 提 供 了 有 用 的 功 能 ⃞<br />

除 非 特 别 说 明 , 手 册 中 描 述 的 内 容 适 用 于 任 何 平 台 中 的 R⃞<br />

一 般 来 说 , 类 似 R 这 类 统 计 分 析 系 统 对 大 批 量 的 数 据 不 是 特 别 合 适 ⃞ 这 个 方 面 其 他 系<br />

统 比 R 更 加 合 适 , 手 册 一 些 地 方 提 到到 说 与 其 增 加 R 的 功 能 , 不 如 让 其 他 系 统 进 行 这 项 工 作 ⃞<br />

( 比 如 ,Therneau 和和 Grambsch (2000) 说 他 们 习 惯 在 SAS 中 操 作 数 据 , 然 后 使 用 S 的 survival<br />

分 析 ⃞) 最 近 一 个 软 件 包包 允 许 以 Java, perl 和和 python 等 语 言 直 接 整 合 R 代 码 来 开 发 , 利 用 这<br />

些 语 言 提 供 的 功 能 也 许 适 合 些 ⃞( 从 Omegahat 工 程 http://www.omegahat.org 上 可 以 得 到到 See<br />

the SJava, RSPerl and RSPython 软 件 包包 )<br />

R 和和 S 类 似 有 Unix 可 重 用 的 小 工 具 的 传 统 , 在 导 入 数 据 前前 和和 输 出 结 果 后 可 以 使 用 awk<br />

和和 perl 来 处 理 ⃞ 在 Becker, Chambers 和和 Wilks (1988, Chapter 9) 的 书 中 有 一 个 例 子 就 是 通 过<br />

Unix 的 工 具 来 检 验 和和 操 作 输 入 到到 S 的 的 数 据 ⃞R 自 身 使 用 perl 来 操 作 起 帮 助 文 件 , 可 以 使<br />

用 read.fwf 函 数 来 调 用 perl 脚 本 , 知 道 停 止 perl 为 止 ⃞Unix 传 统 的 工 具 目 前前 有 很 多 , 包包 括<br />

适 用 于 Windows 平 台 的 ⃞<br />

1.1 导 入<br />

早 期 导 入 到到 R 的 数 据 是 简 单 的 文 本 格 式 的 文 件 , 中 小 规 模 的 数 据 通 常 是 可 以 接 受 的 ⃞<br />

导 入 文 本 文 件 的 基 本 函 数 是 scan, 随 后 会 有 很 多 更 加 好 用 的 函 数 将 在 第 二 章 中 讨 论<br />

([Spreadsheet-like data], page 5)⃞<br />

然 而 所 有 统 计 顾 问 都 会 遇 到到 客 户 提 交 的 包包 含 权 限 设 置 的 二 进 制制 数 据 的 软 盘 或 者 CD, 比<br />

如 说 Excel 电 子 表 格 或 者 SPSS 数 据 文 件 ⃞ 通 常 , 可 以 导 出 为 文 本 格 式 的 文 件 ( 这 样 统 计 顾<br />

问 就 获 得 了 他 们 电 脑 上 最 普 通 应 用 数 据 格 式 文 件 的 备 份 ⃞) 但 是 , 有 时 候 这 是 不 可 能 的 , 第<br />

三 章 ([Importing from other statistical systems], page 11) 讨 论 了 通 过 R 直 接 读 取 这 些 文 件 的<br />

机 制制 ⃞ 读 取 Excel 电 子 表 格 的 方 法 在 第 八 章 ([Reading Excel spreadsheets], page 25) 中 做 了<br />

总 结 ⃞<br />

有 时 候 , 数 据 压 缩 以 后 成 为 加 速 读 取 的 二 进 制制 文 件 ⃞ 我 们 有 时 候 把 图 像 数 据 通 过 这 种 方<br />

式 来 处 理 , 在 内 存 中 以 比 特 流 的 形 式 存 在 ⃞ 这 种 形 式 的 文 件 读 取 在 第 五 章 和和 第 六 章 第 五 节<br />

([Binary files], page 18 and Section 6.5 [Binary connections], page 21) 中 讨 论 ⃞<br />

1.2 导 出 到到 文 本 文 件<br />

从 R 中 导 出 结 果 一 般 来 说 没 什 么 争 议 , 但 是 还 是 有 些 缺 陷 ⃞ 通 常 , 文 本 格 式 的 文 件 是<br />

最 方 便 的 交 换 媒 介 ⃞( 如 果 需 要 二 进 制制 文 件 , 参 照 第 五 章 [Binary files], page 18.)<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

函 数 cat 成 为 结 果 导 出 函 数 的 基 础 ⃞cat 函 数 通 过 一 个 函 数 作 为 参 数 , 附 带 一 些 其 他 参<br />

数 使 得 通 过 正 确 调 用 cat 函 数 得 到到 一 个 文 本 文 件 ⃞ 更 好 的 是 , 可 以 多 次 建 立 连 接 , 打 开 一 个<br />

文 件 用 来 写 入 或 添 加 , 然 后 关 闭 文 件 ⃞<br />

常 见 的 工 作 是 以 矩 阵 的 形 式 把 一 个 矩 阵 或 者 数 据 框 写 入 到到 文 件 中 , 有 时 候 还 带 上 行 和和 列<br />

的 名 称 ⃞ 这 可 以 通 过 write.table 和和 write 函 数 来 完 成 ⃞ 函 数 write 仅 写 出 一 个 制制 定 列 数 的 矩 阵<br />

或 者 向 量 ⃞write.table 函 数 更 加 方 面 , 可 以 写 出 一 个 数 据 框 ( 或 者 可 以 转 化化 为 数 据 库 形 式 的<br />

对 象 ), 并 带 有 行 列 标 记 ⃞ 写 出 数 据 框 到到 文 本 文 件 还 有 一 些 问 题 需 要 考 虑 ⃞<br />

1. 精 度 问 题<br />

通 过 这 些 函 数 , 大 多 数 实 数 或 者 复 数 转 换 为 完 全 的 精 度 ,write 函 数 得 到到 的 精 度 依 赖 于<br />

option(digits) 的 当 前前 设 置 ⃞ 为 了 进 一 步 细 致 的 控 制制 , 可 以 使 用 format 函 数 来 一 列 一 列 的 操<br />

作 数 据 框 ⃞<br />

2. 首 行 问 题<br />

R 默 认 首 行 为 变 量 名 称 行 , 于 是 文 件 内 容 常 有 如 下 格 式 :<br />

dist climb time<br />

Greenmantle 2.5 650 16.083<br />

…“…“…“…“<br />

如 果 write.table 函 数 的 col.names 参 数 为 NA 的 话 , 其 他 一 些 系 统 需 要 输 入 变 量 名 称 行 ⃞<br />

Excel 中 就 是 这 样 的 情 况 ⃞<br />

3. 分 隔 符<br />

在 英 语 国 家 中 当 逗 号 不 出 现 在 任 何 字 段 中 的 时 候 , 文 件 中 常 见 分 隔 符 是 逗 号 ⃞ 这 些 文 件<br />

被 称 为 CSV(comma separated values) 文 件 , 封 装 好 的 函 数 write.csv 提 供 了 一 些 合 适 的 默 认 选<br />

项 来 读 取 数 据 ⃞ 一 些 情 况 中 , 逗 号 被 用 作 进 制制 符 号 ( 在 write.table 函 数 中 设 置 参 数 dec = ","),<br />

这 时 候 使 用 write.csv2 默 认 参 数 来 读 取 数 据 , 使 用 分 号 作 为 分 隔 符 ⃞ 使 用 分 号 或 者 tab<br />

(sep="\t") 设 置 是 最 安 全 的 选 择 ⃞<br />

4. 缺 失 值<br />

默 认 情 况 下 , 缺 失 值 的 输 出 为 NA, 但 是 可 以 通 过 参 数 na 的 设 置 来 改 变 ⃞ 请 注 意 ,<br />

wrtie.table 函 数 中 把 NaNs 当 作 NA 处 理 , 但 是 cat 和和 write 函 数 中 不 是 如 此 ⃞<br />

5. 引 号<br />

默 认 情 况 下 , 字 符 串 都 有 引 号 ( 包包 括 行 和和 列 的 名 称 )⃞ 参 数 quote 决 定 了 字 符 和和 因 子 变<br />

量 的 引 号 形 式 ⃞ 字 符 串 中 含 有 引 号 的 时 候 需 要 注 意 , 三 种 有 用 的 形 式 如 下 :<br />

> df write.table(df, qmethod = "double")<br />

"a"<br />

"1" "a "" quote"<br />

> write.table(df, quote = FALSE, sep = ",")<br />

a<br />

1,a " quote<br />

escape 的 第 二 种 形 式 在 电 子 表 格 较 常 用 ⃞<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

MASS 包包 中 的 write.matrix 函 数 提 供 了 写 出 矩 阵 格 式 数 据 的 特 别 接 口 , 选 择 块 的 形 式 从<br />

而 节 省 了 内 存 消 耗 ⃞<br />

可 以 使 用 sink 函 数 把 标 准 的 R 输 出 写 到到 一 个 文 件 , 从 而 获 得 打 印 的 说 明 ⃞ 这 不 是 通 常<br />

最 有 效 的 方 式 ,options(width) 设 置 也 许 需 要 增 加 ⃞<br />

foreign 包包 中 的 write.foreign 函 数 通 过 使 用 write.table 函 数 产 生 一 个 文 本 文 件 , 同 时 也 可<br />

以 给 出 读 取 这 些 文 本 文 件 到到 其 他 统 计 软 件 包包 需 要 的 代 码 ⃞ 现 在 可 以 支 持 数 据 输 出 到到 SPSS 和和<br />

Stata 的 情 况 ⃞<br />

1.3 XML<br />

从 文 本 文 件 中 读 取 数 据 的 时 候 , 用 户 需 要 知 道 如 何 定 制制 产 生 文 件 的 一 些 转 换 设 置 , 比 如<br />

说 评 注 字 符 , 是 否 需 要 首 行 ( 名 称 ), 值 的 分 隔 符 , 缺 失 值 的 表 示 等 等 , 这 些 内 容 在 1.2 节<br />

([Export to text files], page 3) 中 做 了 说 明 ⃞ 一 种 可 以 不 仅 用 来 保 存 内 容 , 而 且 可 以 提 供 内<br />

容 结 构 的 标 记 性 语 言 可 以 让 文 件 自 我 说 明 , 一 次 不 需 要 提 供 细 节 就 可 以 被 软 件 读 取 数 据 了 ⃞<br />

XML( 可 扩 展 性 标 记 语 言 ) 可 以 提 供 这 种 结 构 , 不 仅 可 以 提 供 技 术 的 数 据 内 容 , 而 且<br />

可 以 提 供 负 责 的 数 据 结 构 ⃞XML 极 其 流 行 并 且 成 为 通 行 标 记 和和 交 换 语 言 的 标 准 ⃞ 可 以 在 不<br />

同 场 合 下 描 述 地 理 学 的 数 据 , 比 如 地 图 , 图 表 展 示 和和 数 学 内 容 等 等 ⃞<br />

XML 包包 提 供 了 读 写 XML 文 件 通 用 的 工 具 , 在 R 和和 S-PLUS 中 都 可 以 方 便 的 使 用 这 项<br />

技 术 ⃞ 一 些 人 展 现 了 如 何 使 用 XML 技 术 , 同 时 也 包包 括 其 他 内 容 , 去 展 示 不 同 应 用 软 件 之 间<br />

可 以 共 同 使 用 的 数 据 集 , 存 储 R 和和 S-PLUS 的 对 象 , 使 得 在 两 个 系 统 中 都 可 用 ; 通 过 SVG<br />

(Scalable Vector Graphics, XML 的 同 义 词 ) 展 示 作 图 , 表 达 函 数 文 件 ; 生 成 包包 括 文 本 ⃝ 数<br />

据 和和 代 码 的 动 态 分 析 报 告告 ⃞<br />

XML 包包 的 功 能 超 出 了 本 手 册 的 范 围 , 可 以 在 http://www.omegahat.org/RSXML 这 个 网 页<br />

得 到到 XML 包包 的 详 细 资 料 和和 例 子 ⃞CRAN 中 的 StatDataML 包包 就 是 基 于 XML 的 一 个 例 子 ⃞<br />

第 二 章 类 电 子 表 格 数 据<br />

在 1.2 章 节 中 ([Export to text files], page 3), 我 们 看 到到 电 子 表 格 形 式 的 文 本 文 件 的 几 种<br />

情 况 , 其 中 的 数 据 是 矩 阵 形 式 的 , 有 的 还 有 行 和和 列 的 名 称 ⃞ 本 章 节 将 要 讨 论 读 取 这 种 格 式 的<br />

数 据 到到 R 中 ⃞<br />

2.1 read.table 函 数 的 几 种 形 式<br />

read.table 函 数 是 读 取 矩 阵 形 式 数 据 的 最 好 方 法 ⃞ 其 他 一 些 函 数 是 调 用 了 read.table 函 数<br />

加 上 了 一 些 默 认 参 数 ⃞ 需 要 注 意 的 是 ,read.table 函 数 读 取 大 数 值 矩 阵 是 缺 乏 效 率 的 , 参 见<br />

下 面 提 到到 的 scan 函 数 ⃞<br />

下 面 是 一 些 需 要 注 意 的 方 面 :<br />

1⃝ 编 码 : 如 果 文 件 中 含 有 非 ASCII 编 码 的 字 段 , 必 须 保 证 以 正 确 的 编 码 形 式 读 入 ⃞ 这 主<br />

要 出 现 在 UTF-8 的 情 况 下 读 取 Latin-1 文 件 格 式 , 可 以 通 过 如 下 方 式 实 现<br />

read.table(file("file.dat", encoding="latin1"))⃞ 这 种 方 法 可 以 在 Latin-1 名 字 的 任 何 情 况 下 成 功 ⃞<br />

2⃝ 首 行 : 我 们 推 荐 显 式 的 指 定 首 行 参 数 , 依 照 惯 例 , 首 行 表 示 列 名 称 而 非 行 名 称 , 于<br />

是 出 现 了 比 其 他 行 少 一 个 字 段 的 情 况 ⃞( 在 R 中 , 设 置 参 数 header = TRUE)⃞ 如 果 文 件 中 有<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

首 个 字 段 作 为 行 名 称 , 可 以 通 过 如 下 方 式 实 现 read.table("file.dat", header = TRUE, row.names<br />

= 1)⃞ 列 名 称 可 以 显 式 的 通 过 col.names 参 数 实 现 , 显 式 的 名 称 将 不 考 虑 首 行 ⃞<br />

3⃝ 分 隔 符 : 一 般 来 说 , 可 以 看 到到 文 件 内 容 就 知 道 字 段 之 间 的 分 隔 符 , 但 是 字 段 间 有 空<br />

格 的 时 候 , 可 能 是 缺 失 的 参 数 sep = "", 可 以 代 表 任 意 间 隔 ( 空 格 ⃝ 制制 表 符 或 者 回 车 ) 作 为<br />

分 隔 符 ⃞ 请 注 意 , 选 择 的 分 隔 符 会 影 响响 到到 带 有 引 号 的 字 符 串 ⃞ 如 果 在 制制 表 符 分 隔 符 的 文 件 中<br />

包包 含 空 字 段 , 请 使 用 sep = "\t" 作 为 参 数 ⃞<br />

4⃝ 引 号 : 默 认 情 况 下 , 字 符 串 使 用 单 引 号 或 者 双 引 号 , 这 时 候 所 有 字 符 中 的 引 号 都 作<br />

为 一 部 分 来 匹 配 ⃞ 引 号 的 有 效 设 置 通 过 quote 参 数 来 控 制制 ⃞ sep ="\n" 默 认 的 改 变 quote = ""⃞<br />

如 果 没 有 指 定 分 隔 符 , 没 有 被 引 字 符 串 前前 面 使 用 c 语 言 形 式 的 ‘\’⃞ 如 果 指 定 了 分 隔 符 , 被<br />

引 用 字 符 串 中 的 引 号 在 电 子 表 格 文 件 中 连 续 两 次 出 现 当 作 通 常 的 一 个 字 符 ⃞ 比 如 ,<br />

read.table("testfile", sep = ",") 方 式 可 以 读 取 ’One string isn’’t two’,"one more" , 而 不 会 对<br />

缺 省 的 分 隔 符 产 生 作 用 ⃞<br />

5⃝ 缺 失 值 : 默 认 情 况 下 , 包包 含 NA 的 字 符 代 表 缺 失 值 , 不 过 可 以 通 过 na.strings 参 数 来<br />

改 变 设 置 ,na.strings 是 包包 含 一 个 和和 几 个 表 示 缺 失 值 的 字 符 ⃞ 数 值 列 中 空 值 也 被 视 作 缺 失 值 ⃞<br />

在 数 值 列 中 ,NaN⃝Inf 和和 -Inf 是 合 法 的 ⃞<br />

6⃝ 尾 行 : 通 常 从 电 子 文 档 格 式 文 件 中 导 入 的 数 据 的 时 候 , 用 参 数 fill=TRUE 省 略 尾 部<br />

空 字 段 ⃞<br />

7⃝ 字 符 型 字 段 中 的 空 格 : 如 果 指 定 了 分 隔 符 , 字 符 型 字 段 中 前前 后 空 格 作 为 字 段 的 部 分 存<br />

在 , 若 想 去 掉 这 些 空 格 , 使 用 参 数 strip.white=TRUE.<br />

8⃝ 空 白 行 : 缺 失 情 况 下 ,read.table 函 数 略 过 空 白 行 ⃞ 可 以 通 过 参 数 blank.lines.skip=FALSE<br />

来 改 变 设 置 , 这 是 需 要 配 套 使 用 参 数 fill=TRUE⃞<br />

9⃝ 变 量 的 类 : 除 非 你 有 特 别 的 指 定 ,read.table 函 数 为 数 据 框 中 的 每 一 个 变 量 自 动 选 择<br />

一 个 合 适 的 类 ⃞ 遵 照 如 下 的 顺 序 :logical, integer, numeric and complex, 略 过 无 法 转 化化 的 部<br />

分 ⃞ 如 果 以 上 所 有 都 失 败 了 , 变 量 转 化化 为 因 子 (factor)⃞ 参 数 colClasses 和和 as.is 提 供 了 更 强<br />

的 控 制制 ,as.is 禁 止 字 符 型 向 量 转 化化 为 因 子 ⃞ 使 用 colClasses 参 数 可 以 在 输 入 数 据 的 时 候 为 各<br />

列 指 定 类 ⃞ 需 要 注 意 的 是 ,colClasses 和和 as.is 参 数 用 来 指 定 各 列 , 不 是 针 对 每 个 变 量 , 于 是<br />

包包 含 了 行 名 的 那 一 列 ( 如 果 这 列 存 在 的 话 )⃞<br />

10⃝ 注 解 : 缺 省 情 况 下 ,read.table 函 数 使 用 ‘#’ 作 为 注 释 字 符 , 如 果 被 读 入 了 , 该 行<br />

剩 下 的 部 分 将 被 省 略 掉 ( 除 了 使 用 引 号 的 以 保 外 )⃞ 空 白 行 和和 注 释 行 被 视 为 空 行 ⃞ 如 果 已 知<br />

数 据 文 件 中 没 有 注 视 , 那 么 可 以 设 置 comment.char="", 也 许 速 度 会 更 快 ⃞<br />

11⃝Escapes: 很 多 操 作 系 统 中 , 在 文 本 文 件 中 使 用 反 斜 杠 作 为 escape 字 符 , 但 是 Windows<br />

操 作 系 统 中 不 是 如 此 ( 而 是 使 用 反 斜 杠 作 为 文 件 路 径 名 的 一 部 分 )⃞ 在 R 中 是 否 使 用 这 样 的<br />

惯 例 风 格 是 可 选 的 ⃞ 在 read.table 和和 scan 两 个 函 数 中 , 有 一 个 allowEscapes 的 参 数 ⃞ 从 R2.2.0<br />

开 始 , 缺 省 设 置 为 false, 反 斜 杠 被 解 释 为 excape 符 号 ( 在 上 述 情 况 下 )⃞ 如 果 设 置 为 true,<br />

就 解 释 为 C 语 言 风 格 的 escape 字 符 , 称 为 控 制制 字 符 , 可 以 表 示 类 似 \a, \b, \f, \n, \r, \t, \v 以 及<br />

八 进 制制 ⃝ 十 六 进 制制 \040 和和 \0x2A 的 情 况 ⃞<br />

通 用 函 数 read.csv 和和 read.delim 给 read.table 函 数 提 供 了 恰 当 的 参 数 , 用 来 读 取 英 语 情 况<br />

下 的 CSV 和和 制制 表 符 分 割割 文 件 ⃞ 而 read.csv2 和和 read.delim2 函 数 提 供 了 使 用 逗 号 作 为 小 数 点 分<br />

割割 情 况 下 读 取 类 似 文 件 的 功 能 ⃞<br />

如 果 read.table 函 数 中 参 数 设 置 不 正 确 的 时 候 , 出 错 提 示 信 息 通 常 有 如 下 形 式 :<br />

Error in scan(file = file, what = what, sep = sep, :<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

line 1 did not have 5 elements<br />

或 者<br />

Error in read.table("files.dat", header = TRUE) :<br />

more columns than column names<br />

这 提 供 了 寻 找 错 误 而 需 要 的 足 够 信 息 , 同 时 count.fields 这 个 辅 助 函 数 可 以 用 来 做 进 一<br />

步 的 审 核 ⃞<br />

在 读 取 大 数 据 的 时 候 , 效 率 是 重 要 的 ⃞ 通 过 设 置 comment.char="", 把 每 一 列 通 过<br />

colClasses 为 一 个 原 子 型 向 量 (logical, integer, numeric, complex, character 或 者 raw), 设 置<br />

nrows—— 读 取 的 行 数 —— 做 一 个 恰 当 的 估 计 要 比 不 做 任 何 设 置 好 , 这 些 都 有 利 于 提 高 数 据<br />

读 取 效 率 ⃞ 可 以 看 下 面 的 例 子 ⃞<br />

2.2 固 定 宽 度 格 式 的 文 件<br />

有 时 候 数 据 文 件 中 的 字 段 没 有 分 隔 符 , 但 是 字 段 实 现 制制 定 了 列 的 情 况 ⃞ 这 在 打 卡 的 时 代<br />

是 常 见 的 事 情 , 现 在 有 时 候 也 用 来 节 省 文 件 的 空 间 ⃞<br />

通 过 指 定 一 个 包包 含 字 符 宽 度 的 向 量 ,read.fwf 函 数 提 供 读 取 这 种 文 件 的 简 单 途 径 ⃞ 这 个<br />

函 数 把 整 个 文 件 作 为 整 行 读 入 内 存 , 拆 分 字 符 , 写 出 到到 一 个 临 时 的 制制 表 符 分 割割 的 文 件 , 然 后<br />

调 用 read.table 函 数 ⃞ 对 小 文 件 而 言 这 是 尚 可 的 办 法 , 但 是 对 任 何 复 杂 的 情 况 , 我 们 推 荐 使<br />

用 perl 等 语 言 预 处 理 一 下 文 件 转 化化 格 式 ⃞<br />

read.fortran 函 数 是 另 外 一 个 读 取 固 定 格 式 文 件 的 函 数 , 使 用 了 Fortran 风 格 的 列 确 定 方<br />

法 ⃞<br />

2.3 直 接 使 用 scan 函 数<br />

read.table 和和 read.fwf 两 个 函 数 都 通 过 scan 函 数 来 读 取 文 件 , 然 后 处 理 scan 函 数 得 到到 的<br />

结 果 ⃞ 这 非 常 方 便 , 不 过 有 时 候 直 接 使 用 scan 函 数 要 好 些 ⃞<br />

函 数 scan 有 太 多 的 参 数 , 很 多 参 数 已 经 通 过 read.table 函 数 介 绍 过 了 ⃞ 最 主 要 的 参 数 是<br />

what, 它 用 来 制制 定 读 取 文 件 中 变 量 的 类 型 的 列 表 ⃞ 如 果 这 个 列 表 命命 名 了 , 这 些 命命 名 就 会 作 用<br />

到到 返 回 列 表 的 组 成 部 分 ⃞ 类 型 可 以 是 数 值 (numeric), 字 符 (character) 或 者 复 数 (complex)<br />

等 , 通 常 可 以 通 过 例 子 来 指 定 , 比 如 0,“‛,0i 等 ⃞ 比 如 说 :<br />

cat("2 3 5 7", "11 13 17 19", file="ex.dat", sep="\n")<br />

scan(file="ex.dat", what=list(x=0, y="", z=0), flush=TRUE)<br />

会 返 回 一 个 包包 含 三 个 组 建 的 列 表 , 并 且 不 读 取 文 件 中 的 第 四 列 ⃞<br />

如 果 想 要 读 取 整 行 整 行 的 数 据 便 于 进 一 步 的 处 理 ,readLines 函 数 可 能 更 方 便 ⃞<br />

scan 函 数 一 个 通 常 的 用 法 是 读 取 大 的 矩 阵 ⃞ 假 如 文 件 matrix.dat 恰 好 包包 含 200×2000 的<br />

矩 阵 ⃞ 于 是 可 以 使 用<br />

A


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

A


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

X1 P 23646 45190 V1<br />

X2 CC 26174 35535 V1<br />

X3 CC 27723 25691 V1<br />

X4 CC 27193 30949 V1<br />

X5 CC 24370 50542 V1<br />

X6 CC 28359 58591 V1<br />

X7 CC 25136 45801 V1<br />

X11 P 23646 50333 V2<br />

…“…“<br />

而 函 数 unstack 是 对 应 操 作 的 函 数 , 在 导 出 数 据 时 可 能 有 用 ⃞ 另 外 一 个 完 成 此 项 任 务 的 函 数<br />

是 reshape 函 数 , 通 过<br />

reshape(zz, idvar="id",timevar="var",<br />

varying=list(c("V1","V2","V3","V4")),direction="long")<br />

得 到到<br />

Status Age var V1 id<br />

1.1 P 23646 1 45190 1<br />

2.1 CC 26174 1 35535 2<br />

3.1 CC 27723 1 25691 3<br />

4.1 CC 27193 1 30949 4<br />

5.1 CC 24370 1 50542 5<br />

6.1 CC 28359 1 58591 6<br />

7.1 CC 25136 1 45801 7<br />

1.2 P 23646 2 50333 1<br />

2.2 CC 26174 2 38227 2<br />

…“…“<br />

reshape 函 数 比 stack 有 更 加 复 杂 的 句 法 , 可 在 比 本 例 单 列 更 多 列 的 “ 长 形 式 ‛ 数 据 时 候 使 用 ⃞<br />

通 过 设 置 参 数 direction="wide",reshape 函 数 可 以 完 成 相 反 任 务 ⃞<br />

2.5 平 列 联 表<br />

以 数 组 的 形 式 展 示 高 维 的 列 联 表 是 相 当 的 有 难 度 ⃞ 在 定 类 数 据 分 析 中 , 这 种 信 息 通 常 通<br />

过 包包 含 有 边 的 带 有 行 列 组 合 的 因 子 水 平 对 应 的 格 子 计 数 的 二 维 数 组 来 实 现 ⃞ 这 些 行 列 典 型 的<br />

是 “ 粗 糙 ‛ 的 , 只 有 当 它 们 改 变 的 时 候 , 标 签 才 显 示 出 来 , 以 明 显 通 用 的 行 从 顶 端 到到 底 端 列<br />

从 左 端 到到 右 端 的 方 式 ⃞ 在 R 中 , 这 种 平 列 联 表 可 以 通 过 ftable 函 数 来 实 现 , 该 函 数 生 成 一 个<br />

ftable 类 , 带 有 相 应 的 打 印 方 法 ⃞<br />

以 R 标 准 数 据 的 UCBAdmissions 作 为 一 个 简 单 的 例 子 , 其 包包 含 一 个 三 维 的 列 联 表 , 是<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

通 过 1973 年 研 究 生 申 请 UC Berkeley6 个 最 大 的 院 系 的 人 员员 依 照 录 入 和和 性 别 分 类 的 情 况 :<br />

data(UCBAdmissions)<br />

ftable(UCBAdmissions)<br />

Admit<br />

Dept A B C D E F<br />

Gender<br />

Male 512 353 120 138 53 22<br />

Admitted Female 89 17 202 131 94 24<br />

Male 313 207 205 279 138 351<br />

Rejected Female 19 8 391 244 299 317<br />

这 种 打 印 形 式 明 显 比 三 维 数 组 形 式 的 要 有 用 ⃞<br />

有 一 个 read.ftable 函 数 用 来 读 取 这 种 平 列 联 表 形 式 的 文 件 ⃞ 额 外 的 参 数 是 用 来 精 确 处 理<br />

行 列 变 量 名 称 和和 测 量 水 平 的 ⃞ 在 read.ftable 函 数 的 帮 助 中 有 一 些 有 用 的 例 子 ⃞ 平 列 联 表 可 以<br />

从 数 组 形 式 通 过 as.table 函 数 转 化化 维 标 准 列 联 表 ⃞<br />

请 注 意 平 列 联 表 通 过 其 “ 粗 糙 ‛ 的 行 列 标 签 来 定 制制 ⃞ 如 果 行 的 所 有 测 量 水 平 均 被 给 定 ,<br />

可 以 使 用 read.table 函 数 来 读 取 数 据 , 通 过 xtabs 函 数 来 生 成 一 个 列 联 表 ⃞<br />

第 三 章 : 从 其 他 统 计 软 件 中 导 入<br />

本 章 中 , 我 们 将 讨 论 从 其 他 统 计 软 件 系 统 中 读 取 二 进 制制 数 据 文 件 ⃞ 通 常 最 好 可 以 避 免 这<br />

种 情 况 , 然 而 如 果 原 有 的 系 统 不 存 在 , 这 种 情 况 就 无 法 避 免 了 ⃞<br />

3.1 EpiInfo⃝Minitab⃝S-PLUS⃝SAS⃝SPSS⃝Stata⃝Systat<br />

自 带 的 foreign 包包 ( 术 语 推 荐 包包 系 列 ) 提 供 了 其 他 统 计 软 件 系 统 数 据 导 入 的 工 具 , 以 及<br />

导 出 数 据 到到 Stata 等 ⃞ 有 时 候 , 这 些 函 数 需 要 的 内 存 比 read.table 函 数 少 一 些 ⃞write.foreign<br />

函 数 ( 参 见 1.2 节 【 导 出 到到 文 本 文 件 ⃪, 第 三 页 ) 目 前前 提 供 了 支 持 导 出 到到 SPSS 和和 Stata 的 机<br />

制制 ⃞<br />

EpiInfo 第 五 和和 第 六 版 存 储 数 据 到到 一 个 自 描 述 的 固 定 宽 度 文 本 文 件 中 ⃞read.epiinof 函 数<br />

可 以 读 取 'REC' 格 式 的 函 数 到到 R 的 data.frame 类 型 的 对 象 中 ⃞EpiData 也 生 成 这 样 的 数 据 文 件 ⃞<br />

函 数 read.mtp 导 入 “Minitab Portable Worksheet‛ 文 件 , 返 回 一 个 工 作 表 组 成 的 R 列 表 ⃞<br />

函 数 read.xport 导 入 SAS 的 可 交 换 格 式 文 件 , 返 回 一 个 包包 含 数 据 框 的 列 表 ⃞ 如 果 SAS<br />

安 装 在 电 脑 中 ,read.ssd 函 数 可 以 生 成 和和 读 取 SAS 脚 本 , 该 脚 本 中 包包 含 了 以 可 交 换 格 式 存 储<br />

的 SAS 永 久 数 据 集 ⃞ 它 通 过 read.xport 来 读 取 文 件 ⃞ 包包 HMisc 有 一 个 类 似 的 函 数 sas.get⃞<br />

函 数 read.S 可 以 读 取 S-PLUS3.x⃝4.x 和和 2000 版 本 在 UNIX 和和 Windows 系 统 中 的 二 进<br />

制制 对 象 ( 可 以 在 不 同 的 操 作 系 统 中 读 取 他 们 )⃞ 可 以 读 取 大 部 分 但 不 是 所 有 的 S 对 象 : 可 以<br />

读 取 向 量 ⃝ 矩 阵 ⃝ 数 据 框 和和 包包 含 这 些 内 容 的 列 表 ⃞<br />

函 数 data.restore 读 取 S-PLUS 的 转 移 数 据 ( 由 函 数 data.dump 生 成 ), 并 且 保 存 了 相 同<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

的 限 制制 ( 除 了 从 Aplpha 平 台 )⃞ 其 还 可 以 读 取 S-PLUS5.x 和和 6.x 版 本 的 转 移 数 据 , 这 些 数 据<br />

通 过 data.dump(oldStyle=T) 写 出 ⃞<br />

如 果 以 及 连 接 到到 S-PLUS, 转 移 S-PLUS 中 的 对 象 和和 在 R 中 提 供 转 移 文 件 是 可 靠 的 ⃞<br />

S-PLUS5.x 和和 6.x 版 本 中 需 要 使 用 dump(…“…“,oldStyle=T), 读 取 非 常 大 的 对 象 时 , 最 好 使 用<br />

批 处 理 脚 本 的 转 移 文 件 , 而 不 要 使 用 source 函 数 ⃞<br />

函 数 read.spss 读 取 SPSS 中 保 存 和和 导 出 的 文 件 , 返 回 由 保 存 数 据 集 中 每 个 变 量 组 成 的 一<br />

个 列 表 ⃞SPSS 变 量 带 有 值 标 签 的 可 以 选 择 转 化化 维 R 中 的 因 子 ⃞<br />

SPSS Data Entry 时 生 成 数 据 输 入 格 式 的 工 具 ⃞ 缺 省 情 况 下 , 生 成 的 有 额 外 格 式 信 息 的<br />

数 据 文 件 无 法 被 read.spss 函 数 来 操 作 , 但 是 其 可 以 输 出 数 据 成 为 普 通 的 SPSS 格 式 ⃞<br />

Stata 中 “.dta‛ 格 式 文 件 时 二 进 制制 格 式 的 文 件 ⃞ 从 5,6,7/SE 和和 8 版 本 的 Stata 的 得 到到<br />

的 文 件 可 以 通 过 函 数 read.dta 和和 write.dta 函 数 来 读 写 ⃞Stata 中 的 有 值 标 签 的 变 量 可 以 转 化化 维<br />

R 中 的 因 子 ⃞<br />

函 数 read.systat 读 取 在 lSystat 中 SAVE 格 式 的 长 方 形 数 据 文 件 (mtype=1)⃞ 这 些 文 件<br />

以 .sys 或 者 .syd( 最 近 的 用 法 ) 作 为 扩 展 名 ⃞<br />

3.2 Octave<br />

Octave 是 线 性 代 数 数 值 运 算 系 统 ,foreign 包包 中 的 read.octave 函 数 可 以 读 取 Octave 中<br />

ASCII 数 据 文 件 的 第 一 个 向 量 或 者 矩 阵 , 这 些 数 据 文 件 是 Octave 的 save -ascii 命命 令 生 成 的 ⃞<br />

第 四 章 : 关 系 型 数 据 库<br />

4.1 为 什 么 使 用 数 据 库<br />

R 操 作 的 数 据 类 别 是 有 限 制制 的 , 因 为 R 中 所 有 数 据 都 是 存 留 在 内 存 中 的 , 在 执 行 一 个<br />

函 数 的 过 程 中 数 据 可 能 被 生 成 好 几 份 ,R 不 适 应 操 作 大 数 据 集 ⃞ 超 过 百 兆 的 数 据 对 象 会 导 致<br />

R 耗 尽 内 存 资 源 ⃞1<br />

R 自 身 目 前前 不 容 易 支 持 数 据 获 取 ⃞ 因 为 如 果 多 个 用 户 获 取 数 据 的 时 候 , 存 在 更 新 同 一 个<br />

数 据 , 这 样 一 个 用 户 的 操 作 对 另 外 的 用 户 就 是 不 可 见 的 了 ⃞<br />

R 支 持 永 久 性 数 据 , 这 样 你 可 以 把 一 个 数 据 对 象 和和 一 个 任 务 的 整 个 工 作 表 保 存 , 并 用 于<br />

随 后 的 任 务 中 , 然 而 存 储 的 数 据 是 针 对 R 的 , 不 太 容 易 被 其 他 系 统 操 作 ⃞<br />

数 据 库 管 理 系 统 (DBMSs), 尤 其 是 关 系 型 数 据 库 管 理 系 统 2(RDBMSs) 用 来 完 成 一<br />

下 这 些 工 作 , 其 功 能 有 如 下 方 面 :<br />

1⃝ 提 供 读 取 大 数 据 集 中 快 速 选 取 部 分 数 据 的 功 能<br />

2⃝ 数 据 库 中 强 大 功 能 的 汇 总 和和 交 叉 列 表 的 功 能<br />

3⃝ 以 比 长 方 形 格 子 模 型 的 电 子 表 格 3 和和 R 数 据 库 更 加 严 格 的 方 式 保 存 数 据<br />

4⃝ 多 用 户 并 发 存 取 数 据 , 同 时 确 保 存 取 数 据 的 安 全 约 束<br />

5⃝ 作 为 一 个 服 务 器 维 大 范 围 的 用 户 提 供 服 务<br />

这 样 ,DBMS 可 能 使 用 统 计 工 具 提 取 10% 的 样 本 数 据 , 生 成 交 叉 列 表 4 从 而 得 到到 一 个 多 维<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

的 列 联 表 , 从 一 个 数 据 库 中 可 以 依 照 分 组 提 取 数 据 组 进 行 独 立 的 分 析 等 等 ⃞<br />

4.2 关 系 型 数 据 库 管 理 系 统 简 介<br />

传 统 上 , 有 大 型 ( 并 且 昂 贵 ) 的 商 业 化化 的 关 系 型 数 据 库 管 理 系 统 (Informix; Oracle;<br />

Sybase; IBM's DB/2; Microsoft SQL Server on Windows) 和和 学 术 的 ⃝ 小 型 系 统 的 数 据 库 系 统 ( 比<br />

如 MySQL, PostgreSQL, Microsoft Access 等 ), 前前 一 类 型 极 其 强 调 数 据 的 安 全 性 ⃞ 现 在 随 着 开<br />

源 的 PostgreSQL 有 了 越 来 越 高 端 的 特 点 , 以 及 “ 自 由 ‛ 版 本 的 Informix,Oracle 和和 Sybase<br />

在 Linux 上 使 用 , 这 种 界 线 正 在 变 得 模 糊 ⃞<br />

同 时 还 有 其 他 常 用 的 数 据 源 类 型 , 包包 括 电 子 表 格 , 非 关 系 型 数 据 库 , 乃 至 文 本 格 式 文 件<br />

( 可 能 是 压 缩 的 )⃞ 开 放 数 据 库 接 口 (ODBC) 是 使 用 这 些 数 据 源 的 标 准 ⃞ 其 源 于 Windows ( 参<br />

考 http://www.microsoft.com/data/odbc/), 也 可 以 在 Linux/Unix 上 实 现 ⃞<br />

本 章 随 后 提 及 的 包包 都 提 供 了 客 户 服 务 器 数 据 库 形 式 的 服 务 ⃞ 数 据 库 可 以 驻 留 在 本 机 也 可<br />

以 是 远 程 ( 通 常 如 此 ) 设 备 上 ⃞ 有 一 个 称 为 SQL( 结 构 化化 查 询 语 言 , 读 为 “sequel‛ 参 见<br />

Bowman 等 ,1996 和和 Kline and Kline,2001) 接 口 语 言 的 ISO 标 准 ( 事 实 上 有 几 个 :SQL92<br />

是 ISO/IEC 9075, 也 称 为 ANSI X3.135-1992, 同 时 SQL99 即 将 出 台 ), 数 据 库 管 理 系 统 均 不<br />

同 程 度 的 支 持 这 个 标 准 5⃞<br />

4.2.1 SQL 查 询<br />

R 中 诸 多 接 口 为 通 常 的 操 作 生 成 SQL, 然 而 直 接 使 用 SQL 需 要 复 杂 的 操 作 ⃞ 同 城 SQL<br />

使 用 大 写 字 母 拼 写 , 但 是 很 多 用 户 发 现 在 R 接 口 函 数 中 使 用 小 写 是 方 便 的 ⃞<br />

关 系 型 数 据 库 管 理 系 统 以 数 据 库 中 的 数 据 表 ( 或 者 关 系 ) 作 为 存 储 数 据 的 方 式 , 其 非 常<br />

类 R 中 的 数 据 框 , 它 们 都 是 由 相 同 类 型 的 列 或 者 叫 字 段 的 组 成 ( 数 值 ⃝ 字 符 ⃝ 日 期 ⃝ 货 币<br />

等 等 ), 行 或 者 叫 记 录 的 包包 含 整 条 的 观 测 值 ⃞<br />

SQL 查 询 在 关 系 型 数 据 库 中 是 相 当 普 遍 的 操 作 ⃞ 下 面 是 一 些 典 型 的 SELECT6 查 询 语 句 :<br />

SELECT State, Murder FROM USArrests WHERE Rape > 30 ORDER BY Murder<br />

SELECT t.sch, c.meanses, t.sex, t.achieve<br />

FROM student as t, school as c WHERE t.sch = c.id<br />

SELECT sex, COUNT(*) FROM student GROUP BY sex<br />

SELECT sch, AVG(sestat) FROM student GROUP BY sch LIMIT 10<br />

第 一 例 是 从 R 中 已 经 被 赋 值 到到 数 据 表 中 的 数 据 框 USArrests 中 选 择 两 列 , 通 过 第 三 列 来<br />

选 择 符 合 条 件 的 数 据 , 并 且 让 结 果 排 序 ⃞ 第 二 例 完 成 了 student 和和 school 两 个 数 据 表 的 连 接 ,<br />

并 且 返 回 四 列 ⃞ 第 三 里 和和 第 四 例 查 询 完 成 交 叉 表 , 返 回 频 次 和和 平 均 值 ( 五 个 汇 总 函 数 是<br />

COUNT,SUM, MAX, MIN 和和 AVG, 每 个 函 数 用 于 单 独 一 列 )⃞<br />

SELECT 查 询 用 FROM 选 择 数 据 表 ,WHERE 确 定 选 取 条 件 ( 多 个 条 件 的 时 候 使 用 AND<br />

或 者 OR 组 成 ), 使 用 ORDER BY 对 结 果 进 行 排 序 ⃞ 和和 数 据 框 不 同 , 关 系 型 数 据 库 中 的 各 行<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

最 好 认 为 是 没 有 顺 序 的 , 没 有 ORDER BY 子 句 的 时 候 , 顺 序 是 不 确 定 的 ⃞ 可 以 对 用 逗 号 分<br />

割割 的 多 行 进 行 排 序 ( 以 字 典 顺 序 )⃞ 通 过 设 置 DESC 在 ORDER BY 字 段 的 后 面 可 以 反 向 排<br />

序 ⃞<br />

SELECT DISTINCT 查 询 仅 返 相 应 数 据 表 中 回 各 各 不 同 的 行 ⃞<br />

GROUP BY 子 句 通 过 准 则 来 选 择 各 组 的 行 ⃞ 如 果 指 定 了 多 列 , 则 多 维 交 叉 分 类 被 5 个<br />

汇 总 函 数 进 行 汇 总 计 算 ⃞HAVING 子 句 允 许 通 过 汇 总 计 算 得 到到 的 值 来 选 择 包包 含 或 者 不 好 某<br />

些 行 ⃞<br />

如 果 SELECT 中 包包 含 了 ORDER BY 子 句 会 产 生 唯 一 的 顺 序 , 增 加 一 个 LIMIT 子 句 可 以<br />

选 取 ( 通 过 数 值 ) 连 续 一 块 数 据 的 列 ⃞ 这 对 一 次 取 回 一 个 数 据 行 块 是 有 用 的 ( 当 LIMIT 子<br />

句 用 来 优 化化 查 询 的 时 候 , 除 非 顺 序 是 唯 一 的 , 否 则 是 不 可 靠 的 )⃞<br />

Kline 和和 Kline (2001) 讨 论 了 SQL 在 SQL Server 2000 ⃝Oracle⃝ MySQL 和和 PostgreSQL<br />

中 实 现 的 具 体 细 节 ⃞<br />

数 据 库 中 的 数 据 可 以 保 存 为 多 种 数 据 类 型 ⃞ 数 据 类 型 是 数 据 库 管 理 系 统 指 定 的 , 不 过<br />

SQL 标 准 定 义 了 许 多 类 型 , 下 列 是 广 泛 地 被 实 现 了 的 ( 通 常 不 是 通 过 SQL 名 称 ):<br />

float(p) 实 数 , 可 选 精 度 , 通 常 称 为 实 数 或 者 双 精 度 数<br />

integer<br />

32 位 整 数 , 通 常 称 为 整 数<br />

smallint 16 位 整 数<br />

character(n) 定 长 字 符 串 , 通 常 称 为 字 符<br />

character varying(n) 变 长 字 符 串 , 通 常 称 为 变 长 字 符 , 有 255 字 符 的 限 制制<br />

Boolean true 或 false, 通 常 称 为 bool 或 者 bit<br />

date<br />

日 历 时 间<br />

time<br />

当 日 时 间<br />

timestamp 日 期 时 间<br />

和和 时 区 有 关 , 有 多 种 时 间 , 以 及 多 种 日 期 时 间 ⃞ 文 本 和和 bolb( 表 示 大 块 文 本 和和 二 进 制制 数<br />

据 ) 也 被 广 泛 的 实 现 了 ⃞R 接 口 包包 广 泛 地 的 为 用 户 实 现 隐 藏 了 数 据 类 型 转 换 的 情 况 ⃞<br />

4.3 R 接 口 包包<br />

在 CRAN 上 有 几 个 包包 可 以 让 R 和和 DBMSs 进 行 通 信 ⃞ 它 们 提 供 了 不 同 层 次 的 抽 象 ⃞ 有<br />

一 些 提 供 了 将 整 个 数 据 框 读 入 写 出 到到 数 据 库 中 ⃞ 所 有 这 些 包包 中 都 有 通 过 SQL 查 询 语 言 的 函<br />

数 选 取 数 据 , 读 取 结 果 分 片 ( 通 常 是 不 同 组 的 行 ) 或 者 整 体 作 为 数 据 框 7⃞<br />

除 了 RODBC 以 外 , 其 他 所 有 的 包包 都 和和 一 种 DBMS 相 关 , 然 而 所 有 的 操 作 都 使 用 DBI<br />

包包 (http://developer.r-project.org/db) 作 为 统 一 的 前前 端 工 具 和和 各 种 作 为 终 端 工 具 的 结 合 起 来 , 其<br />

中 开 发 最 好 的 是 RMySQL 包包 ⃞ 在 CRAN 中 终 端 的 包包 还 有 ROracle 和和 RSQLite( 和和 内 置 的 数 据<br />

库 管 理 系 统 SQLite 结 合 工 作 , http://www.hwaci.com/sw/sqlite)<br />

较 早 的 RmSQL 和和 RPgSQL 两 个 包包 当 前前 在 CRAN 的 开 发 领 域 已 经 终 止 了 支 持 :<br />

BioConductor 项 目 有 一 个 RdbiPgSQL.PL.R (http://www.joeconway.com/plr/), 是 一 个 把 R 嵌<br />

入 到到 PostgreSQL 的 项 目 ⃞<br />

CRAN 上 的 RMySQL 包包 提 供 了 和和 MySQL 数 据 库 系 统 的 接 口 ( 参 见 http://www.mysql.com and<br />

Dubois, 2000.)⃞ 这 里 的 表 示 适 合 0.5-0 版 : 早 期 的 版 本 会 有 本 质 上 的 差 异 ⃞ 当 前前 版 本 需 要<br />

DBI 包包 , 这 里 的 描 述 只 需 要 做 很 小 的 改 变 就 可 以 适 用 于 其 他 包包 使 用 DBI 的 终 端 ⃞<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

从 3.23.x 版 本 以 来 , 在 GPL 下 ,MySQL 存 在 于 Unix/Linux 和和 Windows⃞MySQL 是 一 个 轻<br />

量 级 的 数 据 库 系 统 ( 其 默 认 操 作 系 统 的 系 统 文 件 是 大 小 写 敏 感 的 , 不 同 于 Windows 的 情 况 )⃞<br />

RMySQL 包包 在 Linux 和和 Windows 下 均 可 使 用 ⃞<br />

dbDriver("MySQL") 调 用 返 回 一 个 数 据 库 连 接 管 理 对 象 , 接 着 调 用 dbConnect 函 数 打 开 数 据<br />

库 连 接 , 随 后 可 以 使 用 泛 型 函 数 dbDisconnect 来 关 闭 数 据 库 连 接 ⃞ 相 应 的 可 以 在 ROracle 或<br />

RSQLite 中 使 用 dbDriver("Oracle") 或 dbDriver("SQLite")<br />

SQL 查 询 的 发 送 可 以 通 过 dbSendQuery 或 dbGetQuery 函 数 来 实 现 ⃞dbGetQuery 函 数 发 送 查<br />

询 并 取 回 结 果 保 存 为 一 个 数 据 框 ⃞dbSendQuery 函 数 则 发 送 查 询 避 过 那 发 挥 一 个 从 DBIResult<br />

类 继 承 而 来 的 对 象 中 , 这 个 对 象 可 以 取 回 结 果 , 随 后 可 以 使 用 dbClearResult 函 数 删 除 结 果 ⃞<br />

函 数 fetch 用 来 取 回 查 询 中 部 分 或 者 全 部 的 行 , 生 成 一 个 列 表 ⃞ 函 数 dbHasCompleted 标 识 是<br />

否 所 有 的 行 都 被 取 回 了 ,dbGetRowCount 函 数 返 回 结 果 中 的 行 数 ⃞<br />

在 读 出 ⃝ 写 入 和和 删 除 数 据 库 中 的 表 方 面 , 都 有 方 便 的 接 口 ⃞dbReadTable 和和 dbWriteTable 函<br />

数 从 一 个 R 的 数 据 框 中 读 写 数 据 表 , 并 把 数 据 框 的 行 名 变 为 MySQL 数 据 表 中 的 row_names<br />

字 段 ⃞<br />

> library(RMySQL) # 加 载 DBI 包包<br />

## 打 开 一 个 和和 MySQL 的 连 接<br />

> con dbListTables(con)<br />

## 载 入 一 个 数 据 框 到到 数 据 库 中 , 删 除 已 有 同 名 的 数 据 表<br />

> data(USArrests)<br />

> dbWriteTable(con, "arrests", USArrests, overwrite = TRUE)<br />

TRUE<br />

> dbListTables(con)<br />

[1] "arrests"<br />

## 读 取 整 个 数 据 表<br />

> dbReadTable(con, "arrests")<br />

Murder Assault UrbanPop Rape<br />

Alabama 13.2 236 58 21.2<br />

Alaska 10.0 263 48 44.5<br />

Arizona 8.1 294 80 31.0<br />

Arkansas 8.8 190 50 19.5<br />

...<br />

## 选 择 加 载 过 的 数 据 表<br />

> dbGetQuery(con, paste("select row_names, Murder from arrests",<br />

"where Rape > 30 order by Murder"))<br />

row_names Murder<br />

1 Colorado 7.9<br />

2 Arizona 8.1<br />

3 California 9.0<br />

4 Alaska 10.0<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

5 New Mexico 11.4<br />

6 Michigan 12.1<br />

7 Nevada 12.2<br />

8 Florida 15.4<br />

> dbRemoveTable(con, "arrests")<br />

> dbDisconnect(con)<br />

CRAN 上 的 RODBC 包包 给 支 持 ODBC8 的 数 据 库 管 理 系 统 提 供 了 接 口 ⃞ 它 可 以 广 泛 存 在 ,<br />

并 允 许 相 同 的 R 代 码 和和 不 同 的 数 据 库 管 理 系 统 连 通 ⃞RODBC 在 Unix/Linux 和和 Windows 均<br />

可 运 行 , 并 且 几 乎 所 有 的 数 据 库 管 理 系 统 都 支 持 ODBC⃞ 我 们 已 经 测 试 了 Windows 上 的<br />

Microsoft SQL Server, Access, MySQL 和和 PostgreSQL, 以 及 Linux 上 的 MySQL, Oracle,<br />

PostgreSQL and SQLite 等 ⃞<br />

ODBC 是 一 个 客 户 服 务 器 系 统 , 可 以 顺 利 的 在 Windows 客 户 机 上 连 接 运 行 在 Unix 上 的<br />

数 据 库 管 理 系 统 , 反 之 同 样 可 以 ⃞<br />

在 Windows 上 , 通 常 都 有 对 ODBC 的 支 持 , 当 前前 的 版 本 可 以 从<br />

http://www.microsoft.com/data/odbc/ 上 获 取 , 作 为 MDAC 的 组 成 部 分 ⃞ 在 Unix/Linux 上 , 你<br />

也 许 需 要 一 个 ODBC 驱 动 管 理 器 , 比 如 unixODBC (http://www.unixODBC.org) 或 者 iOBDC<br />

(http://www.iODBC.org) 以 及 一 个 数 据 库 管 理 系 统 的 驱 动 程 序 ⃞<br />

在 Windows 下 不 仅 提 供 了 对 数 据 库 管 理 系 统 的 支 持 , 而 且 提 供 了 对 Excel(‘.xls’) 数<br />

据 表 ⃝Dbase('.dbf') 文 件 , 甚 至 文 本 文 件 的 支 持 ( 这 些 应 用 都 不 再 用 安 装 了 )⃞<br />

并 发 的 连 接 是 可 能 的 ⃞ 通 过 odbcConnect 或 者 odbcDriverConnect 函 数 调 用 (Windows 界 面 下 ,<br />

允 许 通 过 对 话 框 操 作 ) 打 开 一 个 数 据 库 连 接 , 返 回 一 个 随 后 对 数 据 库 进 行 操 作 的 句 柄 ⃞ 打 印<br />

一 个 数 据 库 连 接 可 以 提 供 ODBC 连 接 的 一 些 细 节 ,odbcGetInfo 函 数 可 以 提 供 客 户 机 和和 服 务<br />

器 的 细 节 ⃞<br />

通 过 调 用 close 或 者 odbcClose 函 数 可 以 关 闭 一 个 数 据 库 连 接 , 也 可 以 在 一 个 R 流 程 结<br />

束 时 又 没 有 R 的 对 象 引 用 其 时 自 动 的 关 闭 ( 会 给 出 一 个 警 告告 )⃞<br />

一 个 数 据 库 连 接 中 各 个 表 格 的 细 节 可 以 通 过 sqlTables 函 数 得 到到 ⃞<br />

函 数 sqlSave 把 一 个 R 的 数 据 框 写 入 到到 数 据 库 的 一 个 表 中 ,sqlFetch 函 数 把 数 据 库 中 的 一 个<br />

表 写 到到 R 中 的 一 个 数 据 框 ⃞<br />

一 个 SQL 查 询 可 以 通 过 sqlQuery 函 数 发 送 到到 数 据 库 中 ⃞ 这 样 返 回 结 果 到到 一 个 R 的 数 据<br />

框 中 ⃞(sqlCopy 发 送 一 个 查 询 到到 数 据 库 中 , 并 且 将 结 果 保 存 为 数 据 库 中 的 一 个 数 据 表 ⃞)<br />

下 面 时 一 个 使 用 PostgreSQL 的 例 子 ,ODBC 把 列 和和 数 据 框 名 字 转 化化 为 小 写 ⃞ 我 们 将 使 用 预<br />

先 建 好 的 数 据 框 testdb, 在 unixODBC 环 境 下 把 DSN( 数 据 源 名 称 ) 保 留 在 '~/.odbc.ini' 文 件<br />

中 ⃞ 相 同 的 代 码 可 以 使 用 MyODBC 在 Linux 或 者 Windows( 这 时 候 MySQL 也 把 名 字 转 化化<br />

为 小 写 ) 下 针 对 MySQL 使 用 ⃞ 在 Windows 操 作 环 境 下 ,DSN 在 “ 控 制制 面 板 ‛ 中 操 作 (2000/xp<br />

版 本 中 ,“ODBC 数 据 源 ‛ 在 管 理 工 具 选 项 中 )⃞<br />

> library(RODBC)<br />

## 把 命命 名 改 为 小 写<br />

> channel data(USArrests)<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

> sqlSave(channel, USArrests, rownames = "state", addPK = TRUE)<br />

> rm(USArrests)<br />

## 给 出 数 据 库 中 的 数 据 表<br />

> sqlTables(channel)<br />

TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS<br />

1 usarrests TABLE<br />

## 展 示 数 据 库 中 数 据 表 的 内 容<br />

> sqlFetch(channel, "USArrests", rownames = "state")<br />

murder assault urbanpop rape<br />

Alabama 13.2 236 58 21.2<br />

Alaska 10.0 263 48 44.5<br />

...<br />

## 一 个 SQL 查 询<br />

> sqlQuery(channel, "select state, murder from USArrests where rape > 30 order by murder")<br />

state murder<br />

1 Colorado 7.9<br />

2 Arizona 8.1<br />

3 California 9.0<br />

4 Alaska 10.0<br />

5 New Mexico 11.4<br />

6 Michigan 12.1<br />

7 Nevada 12.2<br />

8 Florida 15.4<br />

## 移 除 数 据 库 中 的 数 据 表<br />

> sqlDrop(channel, "USArrests")<br />

## 关 闭 连 接<br />

> odbcClose(channel)<br />

下 面 是 一 个 Windows 下 通 过 ODBC 使 用 Excel 电 子 表 格 的 例 子 , 我 们 可 以 通 过 如 下 方<br />

式 读 取 电 子 表 格 :<br />

> library(RODBC)<br />

> channel sqlTables(channel)<br />

TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS<br />

1 C:\\bdr NA Sheet1$ SYSTEM TABLE NA<br />

2 C:\\bdr NA Sheet2$ SYSTEM TABLE NA<br />

3 C:\\bdr NA Sheet3$ SYSTEM TABLE NA<br />

4 C:\\bdr NA Sheet1$Print_Area TABLE NA<br />

## 读 取 sheet1 的 内 容<br />

> sh1


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

> sh1


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

最 常 见 的 连 接 类 型 是 一 个 文 件 连 接 ,R 中 文 件 连 接 使 用 file 函 数 生 成 ⃞ 文 件 连 接 ( 如 果<br />

操 作 系 统 允 许 的 话 ) 可 以 打 开 一 个 文 件 以 便 于 以 文 本 或 二 进 制制 的 格 式 读 ⃝ 写 或 者 增 加 文 件 ⃞<br />

事 实 上 , 打 开 的 文 件 既 可 以 读 也 可 以 写 ,R 为 读 写 保 存 一 个 独 立 的 文 件 位 置 ⃞<br />

请 注 意 , 在 缺 省 情 况 下 当 一 个 连 接 生 成 时 它 还 没 有 被 打 开 ⃞ 规 则 就 是 说 如 果 连 接 没 有 打<br />

开 , 一 个 函 数 使 用 它 之 前前 必 须 要 打 开 它 ( 必 须 的 ), 如 果 打 开 连 接 后 , 使 用 以 后 关 闭 连 接 ⃞<br />

简 而 言 之 , 保 持 你 发 现 的 连 接 的 状 态 ⃞ 通 用 函 数 open 和和 close 将 显 式 的 打 开 和和 关 闭 连 接 ⃞<br />

通 过 函 数 gzip 提 供 的 算 法 压 缩 后 的 文 件 可 以 作 为 由 函 数 gzfile 产 生 的 连 接 来 使 用 , 同 时 通 过<br />

函 数 bizp2 压 缩 的 文 件 可 以 通 过 bzfile 函 数 使 用 ⃞<br />

Unix 下 的 程 序 员员 习 惯 针 对 特 殊 文 件 使 用 stdin⃝stdout 和和 stderr 函 数 ⃞ 它 们 作 为 R 中 终<br />

端 连 接 而 存 在 ⃞ 它 们 也 可 能 时 正 常 的 文 件 , 但 是 可 以 也 用 于 在 GUI 控 制制 台 输 入 和和 输 出 ⃞( 即<br />

便 是 使 用 Unix 下 标 准 的 R 接 口 ,stdin 函 数 引 用 从 readline 函 数 生 成 的 行 结 果 而 不 是 使 用 文<br />

件 ⃞)<br />

这 三 个 终 端 连 接 常 常 是 开 放 的 , 不 能 被 打 开 或 者 关 闭 ⃞ 函 数 stdout 和和 stderr 通 常 用 于 正<br />

常 的 输 出 和和 错 误 信 息 展 示 ⃞ 他 们 可 以 使 用 在 相 同 的 场 合 , 不 过 正 常 的 输 出 可 以 使 用 函 数 sink<br />

反 向 读 入 , 输 出 至 stderr 函 数 的 错 误 使 用 sink 函 数 的 时 候 , 必 须 设 置 参 数 type=”message”⃞<br />

请 注 意 此 处 的 用 语 : 连 接 不 能 是 逆 向 的 , 但 是 输 出 可 以 发 送 到到 其 他 连 接 ⃞<br />

文 本 连 接 是 输 入 的 另 外 一 个 来 源 ⃞ 使 得 R 的 字 符 向 量 可 以 像 从 文 本 文 件 中 逐 行 读 取 ⃞<br />

调 用 函 数 textConnection 生 成 并 打 开 一 个 连 接 , 连 接 生 成 时 该 函 数 复 制制 当 前前 字 符 串 向 量 到到 一<br />

个 内 部 的 缓 冲 区 ⃞<br />

文 本 连 接 也 可 以 用 于 获 取 R 输 出 到到 一 个 字 符 串 向 量 ⃞ 函 数 textConnection 可 以 生 成 一 个<br />

新 的 字 符 对 象 或 者 添 加 内 容 到到 一 个 已 有 的 字 符 对 象 上 , 两 种 情 况 都 发 生 在 用 户 的 工 作 间 ⃞ 调<br />

用 textConnection 函 数 的 时 候 连 接 打 开 , 完 整 的 列 输 出 到到 R 对 象 的 已 有 连 接 中 ⃞ 关 闭 连 接 写<br />

出 任 意 剩 余 的 输 出 到到 字 符 串 向 量 的 最 后 一 个 元 素 中 ⃞<br />

Pipe 是 一 种 连 接 到到 其 他 过 程 的 特 殊 文 件 形 式 ,pipe 连 接 使 用 函 数 pipe 来 生 成 ⃞ 打 开 一<br />

个 供 写 入 的 pipe 连 接 ( 或 者 是 追 加 内 容 到到 pipe) 运 行 操 作 系 统 命命 令 , 连 接 其 标 准 输 入 到到 R,<br />

随 后 将 内 容 写 入 到到 连 接 ⃞ 逆 过 程 是 打 开 一 个 输 入 的 pipe 连 接 , 运 行 操 作 系 统 命命 令 , 从 连 接<br />

中 获 得 R 中 已 有 的 标 准 输 出 ⃞<br />

“http://”⃝”ftp://”⃝”file://” 等 URL 类 型 可 以 使 用 函 数 url 读 取 ⃞ 为 了 方 便 起 见 , 在 调 用<br />

url 函 数 时 , 可 以 将 文 件 作 为 file 参 数 来 指 定 ⃞<br />

在 大 多 数 支 持 socket 的 Unix⃝Linux 和和 Windows 操 作 系 统 中 ,Socket 可 以 通 过 函 数<br />

socketConnection 来 作 为 连 接 使 用 ⃞Socket 可 以 读 写 , 客 户 端 和和 服 务 端 socket 都 可 以 使 用 ⃞<br />

6.2 输 出 到到 连 接<br />

我 们 已 经 说 明 了 cat⃝write⃝write.table 和和 sink 作 为 文 件 写 入 的 函 数 , 可 以 通 过 设 置 参<br />

数 append=TRUE 在 文 件 后 追 加 内 容 , 而 且 这 是 1.2.0 版 本 以 前前 的 优 先 做 法 ⃞ 现 在 的 情 形 类<br />

似 , 当 file 参 数 是 字 符 串 , 文 件 连 接 是 打 开 的 ( 供 写 入 或 者 追 加 内 容 ), 在 调 用 函 数 后 再 关<br />

闭 ⃞ 如 果 我 们 想 反 复 的 写 出 内 容 到到 同 一 个 文 件 , 显 式 的 声 明 并 打 开 一 个 连 接 , 把 连 接 对 象 作<br />

为 输 出 函 数 的 参 数 调 用 会 更 加 有 效 率 ⃞ 这 些 也 可 以 用 来 写 入 到到 pipe 中 , 早 期 通 过 file="|cmd”<br />

来 实 现 这 些 功 能 ( 现 在 也 在 使 用 )⃞<br />

函 数 writeLines 把 完 整 的 文 本 行 写 出 到到 一 个 连 接 中 ⃞ 下 面 是 一 些 简 单 的 例 子 :<br />

zz


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

cat("TITLE extra line", "2 3 5 7", "", "11 13 17",<br />

file = zz, sep = "\n")<br />

cat("One more line\n", file = zz)<br />

close(zz)<br />

## Unix 环 境 下 , 使 用 pipe 在 输 出 中 把 数 字 间 隔 符 号 转 化化 为 逗 号<br />

## R 字 符 串 和和 shell 中 需 要 双 反 斜 杠<br />

zz


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

6.3.1 Pushback<br />

C 程 序 员员 可 能 比 较 熟 悉 ungetc 函 数 , 用 来 在 文 本 输 入 中 对 一 个 字 符 进 行 压 栈 ⃞R 连 接 已<br />

一 种 更 强 大 的 方 法 实 现 相 同 的 想 法 , 函 数 pushBack 可 以 把 任 意 数 量 的 文 本 行 压 栈 到到 一 个 连<br />

接 上 ⃞Pushback 的 操 作 类 似 于 堆 栈 , 读 取 要 求 首 先 使 用 最 近 被 压 栈 的 文 本 中 的 每 一 行 , 随<br />

后 是 其 先 的 压 栈 , 最 后 是 连 接 本 身 内 容 的 读 取 ⃞ 一 旦 被 压 栈 行 完 整 读 取 后 , 其 就 被 清 除 了 ⃞<br />

压 栈 的 数 量 可 以 通 过 函 数 pushBackLength 来 设 置 ⃞<br />

一 个 简 单 的 例 子 展 示 了 这 个 想 法 :<br />

> zz readLines(zz, 2)<br />

[1] "A" "B"<br />

> scan(zz, "", 4)<br />

Read 4 items<br />

[1] "C" "D" "E" "F"<br />

> pushBack(c("aa", "bb"), zz)<br />

> scan(zz, "", 4)<br />

Read 4 items<br />

[1] "aa" "bb" "G" "H"<br />

> close(zz)<br />

压 栈 仅 供 文 本 模 式 输 入 下 的 连 接 使 用 ⃞<br />

6.4 列 出 和和 操 作 连 接<br />

用 户 当 前前 打 开 的 所 有 连 接 可 以 通 过 showConnections 函 数 列 出 , 使 用 参 数 all=TRUE 可<br />

以 把 已 经 关 闭 或 者 中 止 的 连 接 展 示 出 来 ⃞<br />

泛 型 函 数 seek 可 以 用 来 读 取 数 据 , 以 及 在 一 些 连 接 中 重 置 读 写 的 当 前前 点 ⃞ 不 幸 的 是 ,<br />

该 函 数 依 赖 于 操 作 系 统 的 功 能 , 这 些 可 能 是 不 可 信 的 ( 比 如 Windows 下 的 文 本 文 件 )⃞ 函 数<br />

isSeekabel 函 数 通 过 输 入 参 数 连 接 对 象 可 以 报 告告 连 接 的 位 置 能 否 改 变 ⃞<br />

函 数 truncate 可 以 在 当 前前 位 置 截 断 一 个 已 打 开 的 供 写 入 的 文 件 ⃞<br />

6.5 二 进 制制 连 接<br />

函 数 readBin 和和 writeBin 读 写 二 进 制制 连 接 ⃞ 以 二 进 制制 模 式 打 开 一 个 连 接 , 使 用 “b‛ 来<br />

设 置 这 种 模 式 ,“rb‛ 表 示 读 取 ,“wb‛ 或 者 “ab‛ 用 于 写 入 ⃞ 函 数 参 数 等 使 用 情 况 如 下 :<br />

readBin(con, what, n = 1, size = NA, endian = .Platform$endian)<br />

writeBin(object, con, size = NA, endian = .Platform$endian)<br />

每 个 con 是 一 个 连 接 , 在 调 用 过 程 中 需 要 的 时 候 打 开 , 如 果 是 使 用 一 个 字 符 串 , 那 么 就<br />

默 认 为 是 指 定 一 个 文 件 名 ⃞<br />

写 入 的 情 况 是 类 似 的 ⃞ 对 象 可 以 是 原 子 型 的 向 量 对 象 , 是 没 有 定 义 属 性 的 数 值 型 ⃝ 整 数<br />

型 ⃝ 逻 辑 型 ⃝ 字 符 型 ⃝ 复 数 型 或 者 raw 型 向 量 ⃞ 默 认 情 况 下 , 像 在 内 存 中 那 样 , 作 为 一 个 精<br />

确 的 比 特 流 写 出 到到 文 件 ,<br />

函 数 readBin 从 文 件 中 读 取 比 特 流 , 通 过 what 设 置 其 模 式 , 作 为 一 个 向 量 读 取 ⃞ 设 置<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

可 以 是 一 个 合 适 模 式 的 对 象 或 者 一 个 描 述 模 式 的 字 符 串 ⃞ 参 数 n 定 义 了 从 连 接 中 读 取 向 量 的<br />

元 素 的 最 大 个 数 ⃞ 参 数 signed 允 许 1-byte 或 者 2-byte 的 整 数 作 为 符 号 整 数 ( 默 认 情 况 ) 或<br />

者 无 符 号 整 数 ⃞<br />

其 他 两 个 参 数 用 于 与 其 他 程 序 和和 操 作 平 台 进 行 数 据 读 写 交 换 ⃞ 默 认 情 况 下 , 二 进 制制 数 据<br />

直 接 在 内 存 和和 连 接 之 间 交 换 ⃞ 为 了 和和 其 他 程 序 交 换 数 据 , 可 能 需 要 做 更 多 的 设 置 , 比 如 读 取<br />

16-bit 的 整 数 , 或 者 写 入 单 精 度 的 实 数 ⃞ 这 可 以 使 用 size 参 数 来 设 置 , 整 形 和和 逻 辑 型 变 量 常<br />

常 可 以 设 置 为 1⃝2⃝4⃝6, 实 数 型 常 常 可 以 设 置 为 4⃝8⃝12 或 者 16⃞ 不 同 存 储 大 小 间 转 换<br />

会 损 失 一 些 精 度 , 包包 含 NA 的 向 量 中 不 能 如 此 ⃞<br />

字 符 串 以 C 语 言 格 式 读 写 , 也 就 是 说 每 个 字 符 串 后 面 使 用 表 示 0 的 比 特 数 作 为 结 尾 ⃞<br />

函 数 readChar 和和 writeChar 提 供 了 更 多 的 灵 活 性 ⃞<br />

6.5.1 特 殊 值<br />

函 数 readBin 和和 writeBin 可 以 通 过 缺 失 值 和和 特 定 的 值 , 虽 然 大 小 发 生 变 化化 不 是 期 望 的 情<br />

况 ⃞<br />

R 中 的 逻 辑 值 和和 整 数 值 类 型 的 缺 失 值 是 INT_MIN,C 语 言 “limits.h‛ 中 定 义 的 int 型 可<br />

以 表 达 的 最 小 的 整 数 , 通 常 对 应 于 比 特 模 式 的 “0xffffffff‛⃞<br />

R 中 数 值 型 和和 复 数 型 的 特 定 值 和和 机 器 相 关 , 有 时 候 和和 编 译 器 有 关 ⃞ 使 用 它 们 最 简 单 的 办<br />

法 是 在 连 接 到到 外 部 的 应 用 中 去 除 Rmath 库 , 这 个 库 输 出 NA_REAL, R_PosInf 和和 R_NegInf,<br />

并 且 在 头 文 件 “Rmath.h‛ 中 给 出 了 ISNAN 和和 R_FINITE 的 宏 定 义 ⃞ 字 符 缺 失 值 写 为 NA⃞<br />

第 七 章 : 网 络 接 口<br />

在 底 层 水 平 在 网 络 连 接 之 间 交 换 数 据 方 面 ,R 提 供 了 一 些 有 限 的 功 能 ⃞<br />

7.1 从 socket 中 读 取<br />

R 基 本 包包 提 供 了 一 些 功 能 , 它 们 使 得 支 持 BSD socket 的 系 统 之 间 实 现 通 信 ( 包包 括 常 见<br />

的 Linux⃝Unix 和和 Windows 下 R 的 port)⃞ 使 用 socket 方 面 功 能 的 潜 在 的 问 题 在 于 为 安 全 原<br />

因 或 者 使 用 了 Web caches 而 受 到到 阻 , 因 此 这 些 函 数 在 内 部 网 比 在 外 部 网 更 加 有 用 ⃞ 对 一 个<br />

新 项 目 而 言 ,socket 连 接 可 以 使 用 ⃞<br />

早 期 底 层 接 口 通 过 make.socket⃝read.socket⃝write.socket 和和 close.socket 等 函 数 来 实 现 ⃞<br />

7.2 使 用 download.file 函 数<br />

download.file 函 数 提 供 了 通 过 FTP 和和 HTTP 方 式 从 网 页 上 读 写 文 件 的 功 能 ⃞ 通 常 都 不 会<br />

使 用 这 个 函 数 , 因 为 read.table 和和 scan 这 些 函 数 可 以 直 接 从 URL 上 读 取 数 据 , 或 者 显 式 的<br />

使 用 url 打 开 一 个 连 接 , 或 者 隐 式 的 把 URL 作 为 file 参 数 的 值 ⃞<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

7.3 DCOM 接 口<br />

DCOM 是 不 同 程 序 Windows 下 的 通 信 协 议 , 并 可 能 在 不 同 的 机 子 上 实 现 ⃞CRAN<br />

Software->Other->Non-standard 目 录 下 由 Thomas Baier 创 造 的 StatConnector 程 序 提 供 了 DLL<br />

的 代 理 接 口 , 和和 Windows 版 本 下 的 R 连 接 , 生 成 一 个 DCOM 服 务 端 ⃞ 这 样 可 以 从 R 交 换<br />

简 单 的 对 象 ( 向 量 和和 矩 阵 ), 并 执 行 到到 R 的 命命 令 ⃞<br />

这 个 程 序 还 有 一 个 Visual Basic 的 例 子 以 及 Erich Neuwirth 的 一 个 Excel 插 件 ⃞ 这 个 接 口<br />

和和 这 儿 讨 论 的 是 相 反 方 向 的 情 况 , 其 他 程 序 (Excel 或 者 Visual Basic 等 ) 成 为 客 户 端 , 而 R<br />

作 为 服 务 端 ⃞<br />

另 外 一 个 (D)COM 服 务 端 可 以 从 http://www.omegahat.org/ 上 得 到到 , 它 允 许 R 对 象 导 出 为<br />

一 个 COM 对 象 值 ⃞ 这 个 网 页 上 还 有 RDCOMClient 和和 SWinTypeLibs 包包 , 允 许 R 作 为 (D)COM<br />

的 客 户 端 ⃞<br />

7.4 CORBA 接 口<br />

CORBA 和和 DCOM 类 似 , 允 许 应 用 程 序 调 用 其 他 程 序 中 服 务 端 对 象 的 方 法 和和 操 作 , 而<br />

且 可 能 是 不 同 语 言 编 写 的 代 码 , 还 运 行 在 不 同 的 机 器 上 ⃞ 在 Omegahat 项 目 ( 在<br />

http://www.omegahat.org/RSCORBA/) 中 有 一 个 CORBA 包包 , 目 前前 是 为 Unix 环 境 提 供 的 ,<br />

Windows 版 本 也 可 能 出 来 ⃞<br />

这 个 包包 可 以 让 R 命命 令 找 到到 存 在 的 CORBA 服 务 端 , 查 询 它 们 提 供 的 方 法 , 动 态 的 激 活<br />

这 些 对 象 的 方 法 ⃞R 作 为 参 数 在 这 些 调 用 中 读 入 , 使 得 操 作 进 行 ⃞ 基 础 的 数 据 类 型 ( 向 量 和和<br />

列 表 ) 可 以 缺 省 的 进 入 , 复 杂 的 对 象 通 过 引 用 载 入 ⃞ 例 子 中 包包 含 了 和和 Gnumeric<br />

(http://www.gnumeric.org) 电 子 表 格 配 合 使 用 的 情 况 , 也 包包 含 了 和和 数 据 可 视 化化 系 统 ggobi 配 合<br />

使 用 的 例 子 ⃞<br />

也 可 以 在 R 中 创 建 CORBA 服 务 端 , 允 许 其 他 应 用 程 序 调 用 这 些 方 法 ⃞ 比 如 说 , 可 以<br />

提 供 对 某 一 个 数 据 集 的 连 接 , 或 者 到到 R 的 建 模 软 件 的 连 接 ⃞ 这 是 通 过 动 态 的 组 合 R 的 数 据<br />

对 象 和和 函 数 完 成 的 ⃞ 这 样 可 以 显 式 的 从 R 导 出 数 据 和和 函 数 ⃞<br />

也 可 使 用 CORBA 包包 在 R 上 完 成 平 行 分 布 式 的 计 算 ⃞ 一 个 R 程 序 段 作 为 管 理 者 , 发 送<br />

任 务 到到 R 中 运 行 的 其 他 程 序 段 ⃞ 这 样 可 以 在 R 中 产 生 异 时 或 后 台 的 CORBA 调 用 ⃞ 更 多 的<br />

信 息 请 参 考 http://www.omegahat.org/RSCORBA/ 上 的 Omegahat 项 目 ⃞<br />

第 八 章 读 取 Excel 电 子 表 格<br />

最 常 见 的 R 数 据 导 入 导 出 问 题 要 数 “ 我 怎 样 读 取 Excel 电 子 表 格 ‛ 了 ⃞ 本 章 汇 总 了 一 下<br />

上 面 关 于 这 个 问 题 的 建 议 和和 选 择 ⃞<br />

首 先 的 建 议 是 除 非 必 要 , 最 好 不 要 如 此 做 ⃞ 如 果 你 已 经 连 接 到到 Excel 了 , 那 么 以 制制 表 符<br />

分 割割 或 者 逗 点 分 割割 的 方 式 导 出 Excel 中 你 想 要 的 数 据 , 使 用 read.delim 或 者 read.csv 函 数 读<br />

取 数 据 到到 R 中 ( 在 使 用 逗 号 作 为 小 数 点 的 欧 洲 大 陆 地 区 需 要 使 用 read.delim2 或 者 read.csv2<br />

函 数 )⃞ 如 果 你 没 有 Excel, 在 Windows 和和 Unix 下 都 有 很 多 查 那 古 训 可 以 读 取 电 子 表 格 格 式<br />

的 数 据 文 件 并 且 导 出 为 文 本 格 式 , 比 如 说 Gnumeric (http://www.gnome.org/projects/gnumeric/)<br />

和和 OpenOffice (http://www.openoffice.org)⃞ 你 也 可 以 使 用 剪 切 复 制制 的 方 法 从 这 些 程 序 中 展 示<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com


R-data (2.2.1) 刘 重 杰 翻 译 初 稿<br />

出 来 的 电 子 表 格 和和 R 交 换 数 据 :read.table 函 数 可 以 从 R 的 控 制制 台 读 取 数 据 , 在 Windows 下 ,<br />

可 以 通 过 剪 贴 板 实 现 ( 通 过 设 置 参 数 file="clipboard" 或 者 readClipboard 函 数 )⃞<br />

值 得 注 意 的 是 , 一 个 Excel 的 ".xls" 文 件 中 包包 含 不 仅 一 张 电 子 表 格 : 而 是 包包 含 了 多 张 电 子<br />

表 格 , 而 且 表 格 中 还 包包 含 了 公 式 ⃝ 宏 等 等 ⃞ 并 非 所 有 的 读 入 都 可 以 完 成 第 一 张 表 以 外 的 表 格 ,<br />

也 许 会 被 文 件 中 的 其 他 内 容 弄 糊 涂 ⃞<br />

Windows 下 的 用 户 可 以 通 过 使 用 RODBC 包包 中 的 odbcConnectExcel 函 数 来 操 作 ⃞ 它 可 以<br />

选 择 Excel 电 子 表 格 中 的 任 何 一 张 表 格 的 某 些 行 列 ⃞<br />

Perl 使 用 者 发 布 了 一 个 叫 OLE::SpreadSheet::ParseExcel 的 组 件 , 可 以 通 过 xls2csv.pl 程<br />

序 将 Excel 电 子 表 格 转 化化 为 CSV 格 式 文 件 ⃞gdata 包包 通 过 read.xls 函 数 提 供 了 一 个 包包 装 好 的<br />

基 本 功 能 ⃞<br />

附 录 A: 参 考 文 献<br />

1) R. A. Becker, J. M. Chambers and A. R. Wilks (1988) The New S Language. A Programming<br />

Environment for Data Analysis and Graphics. Wadsworth & Brooks/Cole.<br />

2) J. Bowman, S. Emberson and M. Darnovsky (1996) The Practical SQL Handbook. Using<br />

Structured Query Language. Addison-Wesley.<br />

3) J. M. Chambers (1998) Programming with Data. A Guide to the S Language. Springer-Verlag. P.<br />

Dubois (2000) MySQL. New Riders.<br />

4) M. Henning and S. Vinoski (1999) Advanced CORBA Programming with C++.<br />

Addison-Wesley.<br />

5) K. Kline and D. Kline (2001) SQL in a Nutshell. O'Reilly.<br />

6) B. Momjian (2000) PostgreSQL: Introduction and Concepts. Addison-Wesley. Also<br />

downloadable at http://www.postgresql.org/docs/awbook.html.<br />

7) T. M. Therneau and P. M. Grambsch (2000) Modeling Survival Data. Extending the Cox Model.<br />

Springer-Verlag.<br />

8) E. J. Yarger, G. Reese and T. King (1999) MySQL & mSQL. O'Reilly.<br />

※† 由 于 本 人 水 平 有 限 , 时 间 仓 促 , 错 误 极 多 , 敬 请 指 出 ⃞ 任 何 意 见 和和 建 议 请 联 系 :pkuabel@126.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!