1、包 DBI 和 RMySQL
dbReadTable
和 dbWriteTable
实现一个 R 数据框的复制进和复制出数据库,把数据框的行名字映射到 MySQL
表的row_names
字段。
> library(RMySQL) # will load DBI as well
## 打开一个MySQL数据库的连接
> con <- dbConnect(dbDriver("MySQL"), dbname = "test")
## 列出数据库中表
> dbListTables(con)
## 把一个数据框导入到数据库,删除任何已经存在的拷贝
> data(USArrests)
> dbWriteTable(con, "arrests", USArrests, overwrite = TRUE)
TRUE
> dbListTables(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_names 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
> dbRemoveTable(con, "arrests")
> dbDisconnect(con)
2 包 RODBC
这里是用PostgreSQL的一个例子,其中ODBC 驱动把列和数据框的名字映射成小写。我们用一个事先创建的数据库testdb
,还有一个个设置在unixODBC
下文件
~/.odbc.ini的数据源名字(Data Source Name,DSN)。同样的代码在MyODBC访问Linux或Windows上的MySQL数据库时一样有效(其中,MySQL依然会把名字映射成小写)。在 Windows,DSN在控制面板的
ODBC 工具里面设置(在Windows 2000/XP,设置`管理工具'部分的`数据源(ODBC)')。
> library(RODBC) ## 让函数把名字映射成小写 > channel <- odbcConnect("testdb", uid="ripley", case="tolower") ## 把一个数据框导入数据库 > data(USArrests) > sqlSave(channel, USArrests, rownames = "state", addPK = TRUE) > rm(USArrests) ## 列出数据库的表 > sqlTables(channel) TABLE_QUALIFIER 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") ## 关闭连接 > odbcClose(channel)
作为 Windows下面用 ODBC 连接 Excel电子表格的一个简单例子,我们可以如下读取电子表格
> library(RODBC) > channel <- odbcConnectExcel("bdr.xls") ## 列出电子表格 > sqlTables(channel) TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS 1 C:\\bdr NA Sheet1$ SYSTEM TABLE NA 2 C:\\bdr NA Sheet2$ SYSTEM TABLE NA 3 C:\\bdr NA Sheet3$ SYSTEM TABLE NA 4 C:\\bdr NA Sheet1$Print_Area TABLE NA ## 获得表单1的内容,可以用下面任何一种方式 > sh1 <- sqlFetch(channel, "Sheet1") > sh1 <- sqlQuery(channel, "select * from [Sheet1$]")注意,数据库表的规范和
sqlTables
返回的名字是不一样的:sqlFetch
可以映射这种差异。
详见 :http://www.biosino.org/R/R-doc/onepage/R-data_cn.html