R语言和关系型数据库的两种配合方式。

  • 用SQL来提取需要的数据,存为文本再由R来读入。
  • 将R与外部数据库连接,直接在R中操作数据库。

连接方式的两种选择:

  • ODBC方式,需要安装RODBC包并安装ODBC驱动(个人感觉,这种方法相对DBI方式不太方便,所以不做过多介绍)
  • DBI方式,可以根据已经安装的数据库类型来安装相应的驱动

1. ODBC数据源方法

基于ODBC协议

如果你决定应用ODBC协议,那么你要确认可以应用该协议和数据库进行通信,这可能需要在数据库端安装相关的驱动程序。在R端,需要安装RODBC包。如果在Windows系统上运行R,那么无论MySQL数据库服务器在该台计算机上还是在另一台计算机上(可以是其他操作系统),从R连接数据库的最简便的方法是通过ODBC(开放性数据库互连)协议。

MySQL ODBC接口具体配置流程如下:

  1. windows:控制面板->管理工具->数据源(ODBC)->双击->添加->选中mysql ODBC driver一项填写:data source name 一项填入你要使用的名字, 自己随便命名例如:mysql_data
  2. description一项随意填写,例如mydata。TCP/IP Server 填写服务器IP,本地数据库一般为:127.0.0.1。 user 填写你的mysql用户名,password 填写你的mysql密码。 然后数据库里会出现你的mysql里的所有数据库,选择一个数据库。确定。

(1). 读取数据实现过程

载入RODBC

library(RODBC)

因为数据表gspc存放在本机计算机MySQL的mysql数据库中,所以首先建立与mysql数据库的连接myodbc,然后连接数据库mysql

channel = odbcConnect(dsn = "myodbc", uid = "root", pwd = "wangzf711235813")

在mysql数据库中提取出数据表gspc

Data = sqlFetch(channel, sqtable = "gspc", rownames = TRUE, colnames = TRUE)

展示读取的数据, 并查看数据的状态

dim(Data)
head(Data)
str(Data)

关闭数据库连接

odbcClose(channel)

(2). ODBC包主要函数

install.packages("RODBC")
library(RODBC)

channel <- odbcConnect(dsn, uid, pwd)  #建立本地连接

sqlTables(channel)                     #查看你在上面所选数据库中的所有表
data <- sqlFetch(channel, sqtable)     #将使用的数据库中的表sqtable连接到R,这样就实现了在R中操作数据库中的数据
sqlSave(channel, dat)                  #将R中的数据集dat存储到MySQL
query = "SELECT * 
         FROM table_name
         WHERE condition;"
sq <- sqlQuery(channel, query)         #在R中通过sql语句query来提取数据

odbcClose(channel)                     #关闭连接

2. DBI–RMySQL包方法

基于DBI包提供的通用接口和每个数据库管理系统(DBMS)专有的包

(1). 数据读取实现

Example 1

## 载入DBI包
library(DBI)
## 与服务器建立连接,这里的连接是MySQL类型的,也可以是其他类型的服务器,例如SQL Sever...,这里我们应用一个给定读取数据权限的Web数据库,用户名和主机名已经给定。
ucscDb = dbConnect(RMySQL::MySQL(), user = "genome", host = "genome-mysql.cse.ucsc.edu")
## 向连接的服务器发出查询请求,要求列出连接到服务器中的所有数据库
databases = dbGetQuery(conn = ucscDb, statement = "show databases;")
##断开与服务器的连接
dbDisconnect(ucscDb)

## 列出查询结果,这里就是列出了该服务器中的所有数据库
head(databases)
dim(databases)
## 对其中的数据库hg1g进行探索,那就建立与数据库hg19的连接
hg19 = dbConnect(RMySQL::MySQL(), dbname = "hg19", user = "genome", host = "genome-mysql.cse.ucsc.edu")
## 列出hg19中的所有数据表,并查看所有表的个数,这里只列出前6个表
allTables = dbListTables(hg19)
## table个数
length(allTables)
head(allTables)
## 列出数据库hg19中表`affyU133Plus2`的所有变量名及数据的观测值个数
dbListFields(hg19, "affyU133Plus2")
dbGetQuery(hg19, "select count(*) from affyU133Plus2")
## 读取数据表affyU133Plus2
affyData = dbReadTable(hg19, "affyU133Plus2")
head(affyData, 3)
## 记得断开与数据库的连接
dbDisconnect(hg19)

Example 2

探索本人电脑上的MySQL数据库, 其中pagedb数据库是我硕士论文中用到的6个用Boosting算法分类的数据。

library(DBI)
library(RMySQL)
channel1 = dbConnect(drv = RMySQL::MySQL(), username = "root", password = "wangzf711235813")
dbGetQuery(conn = channel1, statement = "show databases;")
dbDisconnect(channel1)

channel2 = dbConnect(drv = RMySQL::MySQL(), dbname = "pagedb", username = "root", password = "wangzf711235813")
summary(channel2)
dbGetInfo(channel2)
dbListResults(channel2)
dbGetException(channel2)
show(channel2)

db = RMySQL::MySQL()
db
dbGetInfo(db)
dbListConnections(db)
summary(db)


dbListTables(conn = channel2)
simu5_data = dbReadTable(conn = channel2, name = "simulation_5")
head(simu5_data)
dbListFields(conn = channel2, name = "simulation_5")

dbWriteTable(channel2, name = "mtcars", value = mtcars, overwrite = TRUE)
res = dbSendQuery(channel2, "SELECT * FROM mtcars ORDER BY cyl")
dbApply(res, INDEX = "cyl", function(x, grp) quantile(x$mpg, names=FALSE))
dbClearResult(res)
dbRemoveTable(channel2, name = "mtcars")
dbDisconnect(channel2)

(2). 主要函数介绍

channel = dbConnect(MySQL(), dbname, username, password) #建立本地连接
summary(channel)
dbGetInfo(channel)
dbListResults(channel)
dbGetException(channel)
show(channel)

db = RMySQL::MySQL()
db
dbGetInfo(db)
dbListConnections(db)
summary(db)

dbListTables(channel)                                    #查看数据库的表
dbReadTable(channel, name)                               #获取整个name表数据
dbListFields(channle, name)                              #获取name表的变量名
dbWriteTable(channel, name, value)                       #将R中的数据导出到MySQL数据库
dbRemoveTable(channel, name)                             #删除MySQL数据库中的name表



res = dbSendQuery(conn, statement)
dbGetStatement(res)
dbColumnInfo(res)
dbGetRowsAffected(res)
dbGetRowCount(res)
dbHasCompleted(res)
dbGetInfo(res)
dbClearResult(res)
# transactions: DBMS事务管理
dbCommit(conn)                                           #提交事务(数据库中的数据发生变化)
dbBegin(conn)                                            #设置事务起始点(数据库中的数据原始状态)
dbRollback(conn)                                         #返回事务起始点(数据库中的数据不发生变化)
dbDisconnect(channel)                                     #关闭连接