我有一个中等大小的数据库,有许多连接和查找表。
我比使用SQL更熟悉R,而且我使用的是MySQL。
在什么时候停止增加SQL语句的复杂性以支持R中的数据子集功能(例如merge
,*apply
,maply
,{{ R。
一方面,SQL的连接比选择每个表的所有内容并使用R dlply
函数加入它们更容易。此外,在SQL中执行条件选择将减少必须导入到R的数据量;但速度差异并不显着。
另一方面,与R语法相比,具有复杂where子句的大连接变得不那么容易理解。
下面我有一些未经测试的代码用于说明目的:我在使用代码之前问这个问题,我的问题的答案不需要工作代码(尽管总是赞赏) - “最优雅的方法”,“最少的线条”或“惊人的X实现”总是受到赞赏,但我特别感兴趣的是“最明智/实用/规范/基于第一原则”的理由。
我对哪些步骤应该使用SQL merge
子句以及使用R更容易实现哪些步骤的一般答案感兴趣。
有三个表:where
,a
和ab
。表b
和a
每个都有一个主键b
。它们具有多个关系,由查找表id
表示,其中包含加入ab
和ab.a_id
的字段ab.b_id
和a.id
,分别。两个表都有一个b.id
字段,而且有一个time
字段。
以下是我想要进行的连接和子集化的最小示例;
(MySQL命名元素,例如group
等同于R中的a.id
使用a$id
加入表格a
和b
,并将与每个ab
相关联的多个b.time
值附加为新列;
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;
:对于b.max
的重复值加入每个b.time
,{{ 1}}是最接近但不大于a.id
b.max
的值
b.time
a.time
附加到表中,例如,在R,对于b.max <- max(b.time[b.time < a.time))
中的每个不同值,选择哪个(min(x.dt)))
dt <- a.time - b.max
答案 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)