2.3.6 导入 SPSS 数据
IBM SPSS数据集可以通过foreign包中的函数read.spss()导入到R中,也可以使用Hmisc
包中的spss.get()函数。函数spss.get()是对read.spss()的一个封装,它可以为你自动设
置后者的许多参数,让整个转换过程更加简单一致,最后得到数据分析人员所期望的结果。
首先,下载并安装Hmisc包(foreign包已被默认安装):
install.packages("Hmisc") 
然后使用以下代码导入数据:
library(Hmisc) 
mydataframe <- spss.get("mydata.sav", use.value.labels=TRUE) 
这段代码中,mydata.sav是要导入的SPSS数据文件,use.value.labels=TRUE表示让函数
将带有值标签的变量导入为R中水平对应相同的因子,mydataframe是导入后的R数据框。
2.3.7 导入 SAS 数据 
R中设计了若干用来导入SAS数据集的函数,包括foreign包中的read.ssd(),Hmisc包中
的sas.get(),以及sas7bdat包中的 read.sas7bdat()。如果你安装了SAS,sas.get()是
一个好的选择。 
比如说,你想导入一个名为clients.sas7bdat的SAS数据集文件,它位于一台Windows机器上的
C:/mydata文件夹中,以下代码导入了数据,并且保存为一个R数据框: 
library(Hmisc) 
datadir <- "C:/mydata" 
sasexe <- "C:/Program Files/SASHome/SASFoundation/9.4/sas.exe" 
mydata <- sas.get(libraryName=datadir, member="clients", sasprog=sasexe) 
libraryName是一个包含了SAS数据集的文件夹,member是数据集名字(去除掉后缀名 
sas7bdat),sasprog是到SAS可运行程序的完整路径。有很多可用的选项;查看help(sas.get)
获得更多细节。
你也可以在SAS中使用PROC EXPORT将SAS数据集保存为一个逗号分隔的文本文件,并使用 
2.3.2节中叙述的方法将导出的文件读取到R中。下面是一个示例:
SAS程序:

libname datadir "C:\mydata"; 
proc export data=datadir.clients 
 outfile="clients.csv" 
 dbms=csv; 
run; 
R程序:
mydata <- read.table("clients.csv", header=TRUE, sep=",") 
前面两种方法要求你安装了一套完整的可运行的SAS程序。如果你没有连接SAS的途径,函
数read.sas7dbat()也许是一个好的候选项。这个函数可以直接读取sas7dbat格式的SAS数据
集。这个例子的对应代码是:
library(sas7bdat) 
mydata <- read.sas7bdat("C:/mydata/clients.sas7bdat") 
不像sas.get(),read.sas7dbat()忽略了SAS用户自定义格式。此外,这个函数用了明 
显更多的时间来进行处理。尽管我使用这个包的时候比较好运,它依然应该被认为是实验性质的。
最后,一款名为Stat/Transfer的商业软件(在2.3.12节介绍)可以完好地将SAS数据集(包括
任何已知的变量格式)保存为R数据框。与read.sas7dbat()一样,它也不要求安装SAS。 
2.3.8 导入 Stata 数据
要将Stata数据导入R中非常简单直接。所需代码类似于:
library(foreign) 
mydataframe <- read.dta("mydata.dta") 
这里,mydata.dta是Stata数据集,mydataframe是返回的R数据框。
2.3.9 导入 NetCDF 数据
Unidata项目主导的开源软件库NetCDF(Network Common Data Form,网络通用数据格式)
定义了一种机器无关的数据格式,可用于创建和分发面向数组的科学数据。NetCDF格式通常用
来存储地球物理数据。ncdf包和ncdf4包为NetCDF文件提供了高层的R接口。
ncdf包为通过Unidata的NetCDF库(版本3或更早)创建的数据文件提供了支持,而且在
Windows、Mac OS X和Linux上均可使用。ncdf4包支持NetCDF 4或更早的版本,但在Windows
上尚不可用。
考虑如下代码:
library(ncdf) 
nc <- nc_open("mynetCDFfile") 
myarray <- get.var.ncdf(nc, myvar) 
在本例中,对于包含在NetCDF文件mynetCDFfile中的变量myvar,其所有数据都被读取并保
存到了一个名为myarray的R数组中。
值得注意的是,ncdf包和ncdf4包最近进行了重大升级,使用方式可能与旧版本不同。另外,
这两个包中的函数名称也不同。请阅读在线帮助以了解详情。
2.3.10 导入 HDF5 数据
HDF5(Hierarchical Data Format,分层数据格式)是一套用于管理超大型和结构极端复杂数
据集的软件技术方案。rhdf5包为R提供了一个HDF5的接口。这个包在Bioconductor网站上而不
是CRAN上提供。你可以用以下代码对之进行安装:
source("http://bioconductor.org/biocLite.R") 
biocLite("rhdf5") 
像XML一样,HDF5格式超出了本书的内容范围。如果想学习更多相关知识,可访问HDF 
Group 网站( http://www.hdf5group.org/ )。 由 Bernd Fischer 编写的 http://www.bioconductor.org/ 
packages/release/bioc/vignettes/rhdf5/inst/doc/rhdf5.pdf是一个rhdf5包的优秀指南。
2.3.11 访问数据库管理系统
R中有多种面向关系型数据库管理系统(DBMS)的接口,包括Microsoft SQL Server、Microsoft 
Access、MySQL、Oracle、PostgreSQL、DB2、Sybase、Teradata以及SQLite。其中一些包通过原
生的数据库驱动来提供访问功能,另一些则是通过ODBC或JDBC来实现访问的。使用R来访问存
储在外部数据库中的数据是一种分析大数据集的有效手段(参见附录F),并且能够发挥SQL和R

RODBC包允许R和一个通过ODBC连接的SQL数据库之间进行双向通信。这就意味着你不仅可
以读取数据库中的数据到R中,同时也可以使用R修改数据库中的内容。假设你想将某个数据库 
中的两个表(Crime和Punishment)分别导入为R中的两个名为crimedat和pundat的数据框,可
以通过如下代码完成这个任务:
library(RODBC) 
myconn <-odbcConnect("mydsn", uid="Rob", pwd="aardvark") 
crimedat <- sqlFetch(myconn, Crime) 
pundat <- sqlQuery(myconn, "select * from Punishment") 
close(myconn) 
这里首先载入了RODBC包,并通过一个已注册的数据源名称(mydsn)和用户名(rob)以
及密码(aardvark)打开了一个ODBC数据库连接。连接字符串被传递给sqlFetch(),它将
Crime表复制到R数据框crimedat中。然后我们对Punishment表执行了SQL语句select并将结果保存到数据框pundat中。最后,我们关闭了连接。
函数sqlQuery()非常强大,因为其中可以插入任意的有效SQL语句。这种灵活性赋予了你
选择指定变量、对数据取子集、创建新变量,以及重编码和重命名现有变量的能力。
2. DBI相关包 
DBI包为访问数据库提供了一个通用且一致的客户端接口。构建于这个框架之上的RJDBC包
提供了通过JDBC驱动访问数据库的方案。使用时请确保安装了针对你的系统和数据库的必要
JDBC驱动。其他有用的、基于DBI的包有RMySQL、ROracle、RPostgreSQL和RSQLite。这些
包都为对应的数据库提供了原生的数据库驱动,但可能不是在所有系统上都可用。详情请参阅

CRAN(http://cran.r-project.org)上的相应文档。
 
2.3.12 通过 Stat/Transfer 导入数据
在我们结束数据导入的讨论之前,值得提到一款能让上述任务的难度显著降低的商业软件。
Stat/Transfer(www.stattransfer.com)是一款可在34种数据格式之间作转换的独立应用程序,其中
包括R中的数据格式(见图2-4)。

2.4 数据集的标注
为了使结果更易解读,数据分析人员通常会对数据集进行标注。这种标注包括为变量名添加
描述性的标签,以及为类别型变量中的编码添加值标签。例如,对于变量age,你可能想附加一
个描述更详细的标签“Age at hospitalization (in years)”(入院年龄)。对于编码为1或2的性别变量
gender,你可能想将其关联到标签“male”和“female”上。
2.4.1 变量标签
遗憾的是,R处理变量标签的能力有限。一种解决方法是将变量标签作为变量名,然后通过位置下标来访问这个变量。考虑之前病例数据框的例子。名为age的第二列包含着个体首次入院 
时的年龄。代码:
names(patientdata)[2] <- "Age at hospitalization (in years)" 
将age重命名为"Age at hospitalization (in years)"。很明显,新的变量名太长,不适 2 
合重复输入。作为替代,你可以使用patientdata[2]来引用这个变量,而在本应输出age的地
方输出字符串"Age at hospitalization (in years)"。很显然,这个方法并不理想,如果
你能尝试想出更好的命名(例如,admissionAge)可能会更好一点。
2.4.2 值标签
函数factor()可为类别型变量创建值标签。继续上例,假设你有一个名为gender的变量, 
其中1表示男性,2表示女性。你可以使用代码:
patientdata$gender <- factor(patientdata$gender, 
 levels = c(1,2), 
 labels = c("male", "female")) 
来创建值标签。
这里levels代表变量的实际值,而labels表示包含了理想值标签的字符型向量。