从 R 中的关系数据库导入数据
介绍
R 非常适合统计。您需要数据(大量数据)才能获得更好的统计结果。关系数据库非常适合存储大量数据。
俗话说,用正确的工具做正确的事。
如果您的工作是分析大量数据,那么导入数据、获取数据、抓取数据、获取数据等都很有意义……无论您喜欢怎么称呼它,只需让您的 R 脚本使用该数据库中的好东西!
如何连接数据库?
要将数据导入 R 脚本,您必须连接到数据库。幸运的是,有专门的 R 包可用于连接到大多数流行的数据库。更棒的消息是:这些包的名称很简单。
- RSQLite用于连接 SQLite 数据库
- RPostgreSQL用于连接 PostgreSQL 数据库
我喜欢这种惯例:只需将 R 放在数据库软件名称前面,然后祈祷一切顺利,就可以了。
让我们从 R 解释器连接到 SQLite 数据库。我们需要哪个包?
> install.packages('RSQLite')
> library(RSQLite)
> con <- dbConnect(SQLite(), 'play-example.db')
> con
<SQLiteConnection>
Path: C:\Users\dan\Documents\play-example.db
Extensions: TRUE
>
第一行安装 RSQLite 包(我跳过了无聊的安装消息)。第二行按预期加载 RSQLite 包。连接魔法发生在第三行,通过调用带有两个参数的dbConnect()函数:
- 第一个参数是SQLite()函数,它在底层为 SQLite 创建一个驱动对象。
- 第二个参数是数据库的名称。对于 SQLite,它是实际的文件名,如果文件尚未存在,则会创建它。
将连接存储到变量中是有意义的。新创建的连接显示 SQLite 数据库的文件路径。当然,如果您在机器上尝试,则可能会得到不同的路径。顺便问一下,您能检查一下机器上的 SQLite 文件的大小吗?解释是什么?
给我看看表格
我们可以预期新创建的 SQLite 数据库是空的。让我们使用一些 R 代码来检查并确认这一点。
> dbListTables(con)
character(0)
>
好的,目前还没有表格,但至少dbListTables()函数有一个好听又直观的名字。让我们用经典的mtcars数据框创建一个新表。
> dbWriteTable(con, 'cars', mtcars)
> dbListTables(con)
[1] "cars"
>
太棒了!现在我们可以玩汽车桌了。
使用 SQL 显示数据
让我们使用一些 SQL 从cars表中获取 3 行:
> dbGetQuery(con, 'SELECT * FROM cars LIMIT 3')
mpg cyl disp hp drat wt qsec vs am gear carb
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
>
我们如何才能获得 mpg 高于 30 的汽车的 mpg 和气缸数,并按 mpg 升序排列?
>> dbGetQuery(con, 'SELECT mpg, cyl
FROM cars
WHERE mpg>30
ORDER BY mpg')
mpg cyl
1 30.4 4
2 30.4 4
3 32.4 4
4 33.9 4
>
当然,您可以使用更复杂的查询来优化结果。
使用 dplyr 显示数据
如果您不想编写 SQL 查询,那么可以使用dplyr自动为您生成 SQL 代码。dplyr包非常适合处理数据框。 与dbplyr一起使用,它使您能够像处理典型数据框一样处理表格。
让我们安装先决条件并连接到数据库:
> install.packages(c('dplyr', 'dbplyr'))
> library(dplyr)
> library(RSQLite)
> con <- dbConnect(SQLite(), 'play-example.db')
> cars <- tbl(con, 'cars')
>
看看第 4 行:我们再次使用dbConnect()。注意第一个参数:它是SQLite(),而不仅仅是SQLite。这很容易被忽略,我遇到过几次。在第 5 行,tbl()函数负责通过连接从cars表返回数据。
让我们看看dplyr如何帮助我们:
> cars %>% select(mpg)
# Source: lazy query [?? x 1]
# Database: sqlite 3.30.1 [C:\Users\dan\Documents\play-example.db]
mpg
<dbl>
1 21
2 21
3 22.8
4 21.4
5 18.7
6 18.1
7 14.3
8 24.4
9 22.8
10 19.2
# … with more rows
>
这是什么?
嗯,%>%是关于从左到右传输数据,从cars到返回mpg列的select()函数。为方便起见,可以这样理解:cars,然后选择mpg,等等。
我们再试一个吧。
再次,我们如何才能获得 mpg 高于 30 的汽车的 mpg 和气缸数,并按 mpg 升序排列?
> cars %>%
select(mpg, cyl) %>%
filter(mpg>30) %>%
arrange(mpg)
# Source: lazy query [?? x 2]
# Database: sqlite 3.30.1 [C:\Users\dan\Documents\play-example.db]
# Ordered by: mpg
mpg cyl
<dbl> <dbl>
1 30.4 4
2 30.4 4
3 32.4 4
4 33.9 4
>
看第一行:cars,然后选择mpg和cyl,然后按 mpg 大于 30 进行筛选,然后按 mpg 排列。听起来很自然,对吧?而且,结果与使用 SQL 查询相同。
顺便说一句,我有没有提到dplyr会自动生成 SQL?让我们使用show_query()函数来查看生成的 SQL。
> cars %>%
select(mpg, cyl) %>%
filter(mpg>30) %>%
arrange(mpg) %>%
show_query()
<SQL>
SELECT *
FROM (SELECT `mpg`, `cyl`
FROM `cars`)
WHERE (`mpg` > 30.0)
ORDER BY `mpg`
>
这和我们在上一节中精心编写的 SQL 查询非常相似。同时拥有手动 SQL 和dplyr这两个选项真是太好了!
结论
一旦连接到数据库,您可以使用 SQL 或dplyr导入数据,并在 R 代码中进一步使用该数据。
在本指南中,我们使用 SQLite 来说明从关系数据库导入数据的要点。这些要点也适用于使用其他关系数据库。
如果您想深入了解如何将数据从数据库导入 R 代码,请查看我的 Pluralsight 课程“使用R 从关系数据库导入数据”,其中涵盖了如何使用 ODBC 连接数据库以及如何保护凭据或解决连接问题等主题。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~