2012-03-20 100 views
26

我有一个中等大小的数据库,有很多连接和查找表。何时使用R,何时使用SQL?

我比R更熟悉SQL,而我正在使用MySQL。

我的问题:

在什么时候有什么好处停止增加SQL语句的复杂性有利于在R(例如,merge*applymaplydlply等)中的数据子集的功能R.

一方面,SQL的加入比选择每个表的所有内容并使用R merge函数加入它们要容易。此外,在SQL中执行条件选择会减少必须导入到R的数据量;但速度差异并不显着。

另一方面,与复杂where子句的大连接变得比R语法更容易理解。

下面我有一些未经测试代码说明的目的:我在工作代码之前问这个问题,并且我的问题的答案不需要工作代码(虽然这总是赞赏) - “最优雅的方法“,”最少的线条“或”令人惊叹的X的实现“总是值得赞赏的,但我特别感兴趣的是”最明智/实用/规范/基于第一原则“的基本原理。

我感兴趣的是一般的答案,其中的步骤应该使用SQL where条款和步骤会更容易使用R.

插图来完成:

数据库描述

有三个表格:a,abb。表ab各自具有主键id。它们具有由查找表ab表示的多对多关系,其包含分别与a.idb.id连接的字段ab.a_idab.b_id。两个表都有一个time字段,并且a有一个group字段。

目标:

这里是一个小例子,联接和子集,我想做的事情;

(元素的MySQL的命名,例如a.id相当于R中a$id

  1. 加入ab使用ab,追加与每个a.id作为新的列相关联b.time多个值表;

    select a_time, b.time, a.id, b.id from 
         a join ab on a.id = ab.a_id 
         join b on b.id = ab.b_id and then append b.time for distinct values of b.id; 
    
  2. 我不需要b的重复值。时间,只需要的b.max的值:用于b.time重复的值加入到每个a.idb.maxb.time最接近但不大于a.time

    b.max <- max(b.time[b.time < a.time)) 
    
  3. dt <- a.time - b.max追加到该表中,例如值在R,
  4. a.group每个不同的值,选择哪个(分钟(x.dt)))

    x.dt <- a.time - b.max 
    
+3

“最接近于,但不大于” 听起来像'辊= TRUE'加入在封装['data.table'](http://datatable.r-forge.r-project.org/ )。该操作在SQL中可能会变得很慢,但在R中使用简短语法的速度非常快。在'zoo'和'xts'以及其他包中也有'locf'。 – 2012-03-21 09:51:08

回答

15

我平时在SQL 的数据操作,直到我想要的数据是在一个单一的表, 然后,我做R. 剩下的只有当存在性能问题 做我开始移动一些的计算到数据库。 这已经是你在做什么了。

计算中涉及的时间戳经常 成为SQL 不可读(以下简称“analytic functions”,类似ddply, 应该简化这个, 但我认为他们不可在MySQL)。

但是,您的示例可能完全用SQL编写,如下所示(未测试)。

-- Join the tables and compute the maximum 
CREATE VIEW t1 AS 
SELECT a.id AS a_id, 
     a.group AS a_group, 
     b.id AS b_id, 
     a.time AS a_time, 
     a.time - MAX(b.time) AS dt 
FROM a, b, ab 
WHERE a.id = ab.a_id AND b.id = ab.b_id 
AND b.time < a.time 
GROUP BY a.id, a.group, b.id; 

-- Extract the desired rows 
CREATE VIEW t2 AS 
SELECT t1.* 
FROM t1, (SELECT group, MIN(dt) AS min_dt FROM t1) X 
WHERE t1.a_id = X.a_id 
AND t1.b_id = X.b_id 
AND t1.a_group = X.a.group; 
+0

精确地说,SQL中的子集只能将你需要的分析引入到R中。 – Hansi 2012-03-21 11:29:40

+1

这是一个不错的主意,但在MySQL中使用视图比在R中使用data.table慢(即使MySQL服务器比我的桌面快得多) - 我问了一个有关dba.SE的相关问题:http:// dba.stackexchange.com/questions/16372/when-to-use-views-in-mysql,它看起来很慢。尽管如此,速度惩罚仍然在一分钟左右,如果这样做是可以忍受的。 – 2012-04-11 21:05:42

11

为什么不是both SQL和R - 在R中使用sqldf包?这些examples显示了如何使用具有R数据帧的sqldf函数或通过与现有数据库的连接。这样,你就可以灵活地做这个习惯用语。

+0

我实际上使用两者。我有一个函数''查询'环绕dbSendQuery()'函数,所以我可以,例如'查询(“select * from ...)'。但问题是,SQL查询应该多复杂,我应该什么时候将表导入到R中,并在R中进行连接,选择和基本算术(最小,最大,+, - ,*,/等)。我的问题是“哪些习语最适合到R与MySQL。 – 2012-03-20 21:29:26

+0

看起来好像人们继续投票。我想我会留下我的回答,以防其他人不知道这个已经被使用,也许会帮助他们。那,我喜欢坐过山车。 Whee! – 2012-03-21 12:07:38

+0

+1;虽然没有在示例中提供,但是sqldf可以直接连接到数据库;相当有用。谢谢。 – 2012-03-27 02:09:55