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

Dav*_*uer 28 sql database r data.table

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

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

我的问题:

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

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

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

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

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

插图:

数据库描述

有三个表:a,ab,和b.表ab每个都有一个主键id.它们有一个由查找表表示的多对多关系ab,它包含字段ab.a_id并分别ab.b_id连接到a.idb.id.两个表都有一个time字段,一个group字段有一个字段.

目标:

这是我想要做的连接和子集的最小示例;

(MySQL命名元素,例如a.id等同a$id于R)

  1. 连接表ab使用ab,将b.time每个关联的多个值a.id作为新列附加;

    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;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我不需要重复b.time的值,我只需要一个值b.max:对于b.time连接到每个的重复值a.id,b.maxb.time最接近但不大于的值a.time

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

    x.dt <- a.time - b.max
    
    Run Code Online (Sandbox Code Playgroud)

Vin*_*ynd 15

我通常在SQL中进行数据操作,直到我想要的数据在一个表中,然后,我在R中完成剩下的工作.只有当存在性能问题时,我才开始将一些计算移动到数据库中.这已经是你正在做的事情.

涉及时间戳的计算通常在SQL中变得不可读(" 分析函数 ",类似于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;
Run Code Online (Sandbox Code Playgroud)


Ale*_*lds 12

为什么不 SQL和R - R内使用sqldf包?这些 示例显示了如何将该sqldf函数与R数据帧一起使用或通过与现有数据库的连接.这样,你就可以灵活地按照习语认为合适.