【发布时间】:2012-04-05 09:46:08
【问题描述】:
我有一个中等大小的数据库,其中包含许多连接和查找表。
我对 R 比对 SQL 更熟悉,而且我使用的是 MySQL。
我的问题:
在什么情况下停止增加 SQL 语句的复杂性以支持 R 中的数据子集功能(例如,merge、*apply、maply、dlply 等)在R.
一方面,SQL 的连接比选择每个表的所有内容并使用 R merge 函数连接它们更容易。此外,在 SQL 中进行条件选择会减少必须导入 R 的数据量;但速度差异并不显着。
另一方面,带有复杂 where 子句的大连接变得比 R 语法更难理解。
下面我有一些未经测试的代码用于说明目的:我在有工作代码之前问这个问题,我的问题的答案不需要工作代码(尽管这总是值得赞赏的) - “最优雅的方法”、“最少的行”或“X 的惊人实现”总是受到赞赏,但我特别感兴趣的是“最明智/实用/规范/基于第一原则”的基本原理。
我对哪些步骤应该使用 SQL where 子句以及哪些步骤使用 R 更容易完成的一般答案感兴趣。
插图:
数据库说明
共有三个表:a、ab 和 b。表a 和b 都有一个主键id。它们具有由查找表ab 表示的多对多关系,其中包含分别连接到a.id 和b.id 的字段ab.a_id 和ab.b_id。两个表都有一个time 字段,a 有一个group 字段。
目标:
这是我想做的连接和子集的最小示例;
(MySQL对元素的命名,例如a.id等价于R中的a$id)
-
使用
ab连接表a和b,将与每个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.time的重复值,我只需要
b.max的值:对于b.time的重复值加入每个a.id,b.max是b.time的值最接近到但不大于a.timeb.max <- max(b.time[b.time < a.time)) - 将值
dt <- a.time - b.max附加到表中,例如,在R中, -
对于
a.group中的每个不同值,选择 which(min(x.dt)))x.dt <- a.time - b.max
【问题讨论】:
-
“最接近但不大于”听起来像
roll=TRUE加入包data.table。该操作在 SQL 中可能非常缓慢,但在 R 中使用短语法时非常快。zoo和xts和其他包中也有locf。
标签: sql r database data.table