R中有多种面向关系型数据库管理系统(DBMS)的接口,包括Microsoft SQL Server、Microsoft、Access、MySQL、Oracle、PostgreSQL、DB2、Sybase、Teradata以及SQLite。其中一些包通过原生的数据库驱动来提供访问功能,另一些则是通过ODBC或JDBC来实现访问的。使用R来访问存储在外部数据库中的数据是一种分析大数据集的有效手段,并且能够发挥SQL和R各自的优势。
►ODBC接口
在R中通过RODBC包访问一个数据库也许是最流行的方式,这种方式允许R连接到任意一种拥有ODBC驱动的数据库,其实几乎就是市面上的所有数据库。第一步是针对你的系统和数据库类型安装和配置合适的ODBC驱动——它们并不是R的一部分。针对选择的数据库安装并配置好驱动后,安装RODBC包。
RODBC包中主要的函数及说明
函数 | 描述 |
odbcConnect( dsn, uid="", pwd="" ) | 建立一个到ODBC数据库的连接 |
sqlFetch( channel, sqltable ) | 读取ODBC数据库中的某个表到一个数据框中 |
sqlQuery( channel, query ) | 向ODBC数据库提交一个查询并返回结果 |
sqlSave( channel, mydf, tablename = sqtable, append=FALSE ) | 将数据框写入或更新(append=TRUE)到ODBC数据库的某个表中 |
sqlDrop( channel, sqtable ) | 删除ODBC数据库中的某个表 |
close( channel ) | 关闭连接 |
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语句。这种灵活性赋予了你选择指定变量、对数据取子集、创建新变量,以及重编码和重命名现有变量的能力。
►DBI相关包
DBI包为访问数据库提供了一个通用且一致的客户端接口。构建于这个框架之上的RJDBC包提供了通过JDBC驱动访问数据库的方案。使用时请确保安装了针对你的系统和数据库的必要JDBC驱动。其他有用的、基于DBI的包有RMySQL、ROracle、RPostgreSQL和RSQLite。这些包都为对应的数据库提供了原生的数据库驱动,但可能不是在所有系统上都可用。详情请参阅CRAN(http://cran.r-project.org)上的相应文档。