何时使用R,何时使用SQL?

时间:2012-03-20 21:13:01

标签: sql r database data.table

我有一个中等大小的数据库,有许多连接和查找表。

我比使用SQL更熟悉R,而且我使用的是MySQL。

我的问题:

在什么时候停止增加SQL语句的复杂性以支持R中的数据子集功能(例如merge*applymaply,{{ R。

中的1}}等

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

另一方面,与R语法相比,具有复杂where子句的大连接变得不那么容易理解。

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

我对哪些步骤应该使用SQL merge子句以及使用R更容易实现哪些步骤的一般答案感兴趣。

插图:

数据库描述

有三个表:whereaab。表ba每个都有一个主键b。它们具有多个关系,由查找表id表示,其中包含加入abab.a_id的字段ab.b_ida.id,分别。两个表都有一个b.id字段,而且有一个time字段。

目标:

以下是我想要进行的连接和子集化的最小示例;

(MySQL命名元素,例如group等同于R中的a.id

  1. 使用a$id加入表格ab,并将与每个ab相关联的多个b.time值附加为新列;

    a.id
  2. 我不需要重复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; :对于b.max的重复值加入每个b.time,{{ 1}}是最接近但不大于a.id

    b.max的值
    b.time
  3. 将值a.time附加到表中,例如,在R,
  4. 对于b.max <- max(b.time[b.time < a.time)) 中的每个不同值,选择哪个(min(x.dt)))

    dt <- a.time - b.max

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:12)

为什么both SQL和R - 在R中使用sqldf包?这些examples显示了如何将sqldf函数与R数据帧或通过与现有数据库的连接一起使用。这样,你就可以灵活地按惯用法看待。