从 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 连接数据库以及如何保护凭据或解决连接问题等主题。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
                                
                                    
                                    
                                    
                                    
                                    
                                
                            
                                    
                                    
                                    
                                    
    
    
            
  
        
请先 登录后发表评论 ~