SQL and R

R平台及编程语言支持浩大的数据科学技术,他拥有几十年的的历史和超过7000个包,这挂在CRAN的包纷杂的让你无法决定从哪里入手。R-Basics和Visualizing Data with R提供了基础的指导,但是没有详细介绍如何用R操作数据集。

幸运的是,数据库专业人员可以通过他们的精湛的SQL技术,短时间内在这个领域变得更有效率。如你所愿,R支持使用SQL检索中心位置的关系数据库中的数据。然而,一些R包允许你超出这领域创建介于处理和分析数据之间的集席数据集的飞速查询,而不管数据的来源和最终目标。在这文章,我们将会看到一些使用不同R包,来通过SQL处理数据的方法。

微软收购Revolution Analytics太让人兴奋了,这随后会导致R被纳入SQLServer 2016.。SQLServer 2016有预览功能,但是它在发布之前仍然会有修改,Simple-talk充斥着大量聚焦SQLServer的优秀文章。一旦这发布细节被确定下来,你可以期待更多后续的声明R在SQLServer的应用的文章。但是由于现在最终版本尚不可用,Simple-Talky已经通过 SQL Server Access from R做了介绍,这文章将展示开源的R在Rstudio环境上使用SQL和其他的关系数据库。

SQL的部分吸引人的地方在于他能在许多不同产品上应用。大量的技术专业人员发现他们必须支持和交互化大范围的开源和商业化技术。除了非开源有特定性能和拓展,SQL实现跨越比较标准,所以它的使用将在这里作为典型将会被目前只使用SQLServer的人熟悉。这文章将会包含两个数据库介绍,SQLite(一个小的免费使用的数据库,其中有不少使用者甚至不了解它及Oracle),Oracle 一个巨大的数据库等供应商、SQLServer的竞争对手。RODBC的使用已经被Simple-Talk的文章–‘Making Data Analytics Simpler: SQL Server and R’所涵盖

RSQLite包

SQLite是世界上部署最广泛的数据库。它是包含在Android,iPhone和iOS设备,也在Firefox,Chrome和Safari网络浏览器。苹果和微软分别在他们的OSX和Windows10操作系统上使用了SQLite,并且有许多其他产品应用了SQLite。它非常容易使用,对这些需要一个数据库可用,但要避免经常安装和配置外部数据库相关的开销的开发商有很大的价值。在本演示中,我们将下载并安装RSQLite包–将SQLite的集成到RStudio上运行的R的工具。

这例子将展现怎么使用我们熟悉的SQL语句把数据集完美的写在SQLite数据库用于随后的分析,这些数据是关于汽车性能和燃油效率问题的。这数据集包含于初始安装R时。由于被包含的数据在R可用,这就没有必要去从分开的表格或者外部来源导入。这样的数据集的使用保存在R文件示例;所以他们是在R安装时或者在新包导入时伴随代码而添加上来的。

在“mtcars”数据集默认于R:它包括1974年的Motor Trend US杂志的数据(因此在数据集名“MT”)包括在内。数据集描述了32类机动车的燃料消耗和汽车设计、表现等各个方面和性能的关系。帮助功能将展示包含深入此数据集的结构和内容的描述文档。

help(mtcars)

为了访问该数据集,它必须先被加载。这将“黏贴”数据集到用户的当前R会话。

data(mtcars)

数据集是指代一种为由行和列组成的框。数据帧是足够小,可以使用视图命令以一个类似电子表格形式显示。

View(mtcars)

如果你想在不关闭R的前提下从对话中移除数据集来释放资源。你可以使用rm函数。当你运行这命令,你将注意到环境变量中的mtcar变量列表消失。

rm(mtcars)

在Rstudio中,SQLite包必须安装(除非它早先已经安装)。可以调用该库函数把包载入当前的工作环境。

install.packages("RSQLite")library(RSQLite)

接下来,我们会创建一个新的、空的SQLite数据库用于存储汽车数据。SQLite有一个相当简单的数据存储机制,所有数据库数据存储在单一的文件中。当数据库创建时这个文件名字必须特殊化,并且返回一个这个数据库连接用于后续的访问、操作数据和数据结构的命令。

conn <– dbConnect(SQLite(),'mycars.db')

这个命令在当前工作目录创建一个叫做“mycars.db”的文件。如果你不能确定在那个位置,你可以使用getwd()函数来获取工目录,或者setwd('目录路径’)来指定一个不同的工作目录。去真正创建一张表,我们将会从mtcar数据集读取数据并写入新的数据库。

用加载的数据,和一个活动数据库连接到SQLite数据库,我们就可以通过指定的连接、表的名称、以及包含要永久保存的数据的数据帧的名称来写入数据。

dbWriteTable(conn, "cars", mtcars)

这个简单的语句在数据库中创建了一张数据类型类似R数据框的列的表。表列的名称是基于在数据框中的列的名称。没有复杂的CREATE TABLE语句要求与列名的明确的定义及数据类型、精度、存储配置或其他选项。当聚焦执行临时探索性数据分析时这种细节是不必要的,而没必要像在被供长期使用的集中数据库一样定义模式。然而如果你想使用标准的SQL DDL,它是可以运行的CREATE TABLE语句的。

dbGetQuery(conn, 'CREATE TABLE test_table(id int, name text)')

SQLite的,像其它关系数据库存储描述它包含的对象的元数据。在数据库中的表可以通过调用一个函数列出。

dbListTables(conn)

同样地,通过一个给定的表名及连接可以列出字段名。

dbListFields(conn, "cars")

有了可用的连接、建好的数据库、并填充了数据的表,现在可以使用dbGetQuery功能执行查询。

dbGetQuery(conn, "SELECT * FROM cars WHERE mpg > 20")

标准的SQL语法是可用的,但如在SQL嵌在字符串其他情况下,你需要考虑你的引号的使用。往往最简单的是用双引号包围你的查询,以便在SQL语句字符串可以用单引号括起来。

dbGetQuery(conn, "SELECT * FROM cars WHERE row_names LIKE 'Merc%'")

如你所愿,也可在RSQLite使用SQL修改表。但是,如果你想要覆盖先前创建的表的话,就存在快捷方式。下面的例子中从car数据框行名中提取make列,其中行名中make,model是连接的。

mtcars$make <– gsub(' .*$', '', rownames(mtcars))

该语句在着本质上是,“在叫'mtcars'的数据框上创建新的列并且使用行名填充每行值,查找子字符串从第一个空白开始到原来的字符串结束的位置,并且移除该子字符串。”剩下的是字符串的首个单词。这作为结果的数据框可以被查看,以显示添加上去新增列是作为最后列。

新增列可以和其他列一样用于查询。

> dbGetQuery(conn, "SELECT make, count(*) FROM cars GROUP BY make HAVING count(*) > 1 ORDER BY 2 DESC, 1")

make count(*)1 Merc 72 Fiat 23 Hornet 24 Mazda 25 Toyota 2

这RSQLite包使取文件、表格及其他来源中数据变得简捷,并快速将其集成到SQL访问的数据库。它可以让你无需花费额外的时间、资源、精力去设置或者维护外部数据库就能够做数据处理大量

跟这一样方便的是,另一个叫sqldf的包进一步简化这种类型的处理。它允许你在没有丁点建立一个数据库的想法的条件下,在数据框上使用SQL。

sqldf 包

这在长期使用SQL(或类似SQL)的语言,探讨和处理数据有着巨大价值。数据科学专业人士常常面临着来自不同数据源的数据整合的挑战。其中许多是关系型数据库,所以需要SQL检索数据。此外,NoSQL的数据源往往支持高层次,描述性的,类似SQL的语言。例如,Hadoop的用户可以使用Hive和Pig。Cassandra提供了使用Cassandra的查询语言(CQL)访问存储在列族(类似于关系表)的数据的功能。在许多情况下,在任意的文本文件的数据,被结构化得足够容易地导入到数据库,以及各种实用程序通常用于使半结构化数据的SQL可访问化。从关系术语角度思考数据使数据整洁、格式化的意义甚至超越了相关领域。

该sqldf包允许您访问使用SQL数据帧。无论在哪里的原始数据,只要其包含在数据框中就可以查询。这意味着数据可以从各种数据源(分隔的文件,一个网页,网页的API,一个关系数据库,NoSQL的datasoures等)读入,并随后查询和处理,就像它是在一个单一的关系数据库中。它是多么简单:打开一个新的R会话,安装包,加载和mtcars数据。

install.packages("sqldf")library(sqldf)data(mtcars)

SQLDF允许查询数据框就好像它是一个表。并且它传递查询到sqldf函数就像传递一个字符串到sqldf函数一样简单。

sqldf("SELECT * FROM mtcars WHERE mpg > 20")

如果你照着做并且在Rstudio运行该语句,这行数是对的,但是包含各种车名的行名丢失了。

这原因是行名不是标准的列,被默认的sqldf忽略了。使输出包含这些行,调用时指定 row.names= T.

sqldf("SELECT * FROM mtcars WHERE mpg > 20", row.names=TRUE)

在R中有许多方式去创建新的数据框–基本的语言包含一些支持函数,而且R包像dplyr,reshape是普遍用的。通过sqldf你可以绕过这些。实际上,这sqldf调用它自己会返回一个数据框。记住这些,你可以调用一系列的sqldf函数来逐步处理或汇总的数据集。

df <– sqldf("SELECT * FROM mtcars WHERE mpg > 20", row.names=TRUE)

这df对象包含查询结果的数据框。如果你将通过这种方式处理数据框,你最好把一列普通值作为行名。

df$make_model<–row.names(df)

新的列是在数据框可以找到。并且任何查询结果,甚至它的原始数据非常广泛都是返回一个新的数据框。

mpgSummary <– sqldf("select avg(mpg) avg, min(mpg) min, max(mpg) max from df where make_model like 'Merc%'")

合理地给数据集的列使用别名会使后续处理更加方便。建议限制列名长度。

mpgSummary

avg min max1 23.6 22.8 24.4

sqldf上的SQL会在幕后映射成在RSQLite的SQL,数据将会写入SQLite进行查询。R内部的mtcars数据集很方便做例子。尽管用在展示或者学习功能上非常快,但是它对于必须从外部检索数据的实际应用还不够。

文件导入

在看制作直接链接到数据库之前,认识到读取分隔的文件到RStudio是多么简单和直接是非常重要的。这可能是有点冒犯那些习惯于创建使用ODBC或JDBC直接连接到数据库的应用程序的软件开发人员。但R用户经常需要将来自几个不同的数据源的数据集成。与其花费时间和精力配置特定的软件包并加载驱动程序,从查询到数据文件导出数据和文件读入RStudio是值得考虑的。这种做法也可以规避需要一个数据库运行资源密集型的SQL语句多次。数据导出为CSV是许多关系型数据库系统的良好支持的选项。 SQLServer的的Management Studio中有一个“结果到文本”对话框,“逗号分隔”可以指定为输出格式。 MySQL有一个非标准的SQL SELECT子句指定OUTFILE条款。许多SQL客户有以这种方式将数据导出选项。从数据库导出CSV的可使用任何电子表格程序进行快速验证。 R本身可以从各种文件格式导入数据。这种灵活性导致额外的复杂性并崔生大量的针对性的函数,其中许多具有大量的可设定参数,以改变它们的行为。 RStudio掩盖这种复杂性,并提供了导入文件的简单对话。如果你没有一个得心应手的CSV文件,您可以基于我们前面看到的mtcars数据集通过R创建一个。

write.csv(mtcars, 'mtcars.csv')

导入这个可以通过选择环境变量栏“Import Dataset”项操作并选择“From Text File”。

A dialog is opened that provides a preview of how the data will be imported based on the options selected. In most cases, uncheck stringsAsFactors and the

一个演示数据怎么手动导入的预览对话框被打开。在大多数情况下,取消stringsAsFactors并

选择默认就足够了。

对于导入的数据,时间R命令要求去读取并且在console上预览。这数据是先读进R,预览命令时之后调用,作用于新导入的数据并展示它的目录。

mtcars <– read.csv("~/Desktop/r_art/simple–talk–SQL–and–R/mtcars.csv", stringsAsFactors=FALSE)

View(mtcars)

如果你愿意,read.csv命令可以被搁置,并在脚本中使用,从而不必在将来的对话框中使用交互方式导入数据。由于数据通常可以方便地导出到简单的文本文件,他们经常是将数据放入RStudio最简单的方法,然而这并不是理所当然的。有时,当将要处理的关系数据库中的数据量大的令人不敢问津,或将要创建的数据帧的数量大得使手动导入导出的多个数据文件很繁琐笨重。在这些情况下,对数据库的直接连接是最好的选择。有大量的数据库专向的包支持直接连接,这些包中绝大部分都是基于RJDBC包,RJDBC包可以独立使用以访问大量类型的数据库。

本文分享自微信公众号 - PPV课数据科学社区(ppvke123)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端桃园

知识体系解决迷茫的你

最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

20940
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

28440
来自专栏怀英的自我修炼

考研英语-1-导学

英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

11710
来自专栏钱塘大数据

中国互联网协会发布:《2018中国互联网发展报告》

在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

13550
来自专栏微信公众号:小白课代表

不只是软件,在线也可以免费下载百度文库了。

不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

44330
来自专栏腾讯社交用户体验设计

ISUX Xcube智能一键生成H5

51220
来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

17830
来自专栏腾讯高校合作

【倒计时7天】2018教育部-腾讯公司产学合作协同育人项目申请即将截止!

15620
来自专栏钱塘大数据

理工男图解零维到十维空间,烧脑已过度,受不了啦!

让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

32130
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.1K20

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励