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