我有一个中等大小的数据库,有很多连接和查找表。何时使用R,何时使用SQL?
我比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
)
加入
a
和b
使用ab
,追加与每个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的重复值。时间,只需要的
b.max
的值:用于b.time
重复的值加入到每个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
每个不同的值,选择哪个(分钟(x.dt)))x.dt <- a.time - b.max
“最接近于,但不大于” 听起来像'辊= TRUE'加入在封装['data.table'](http://datatable.r-forge.r-project.org/ )。该操作在SQL中可能会变得很慢,但在R中使用简短语法的速度非常快。在'zoo'和'xts'以及其他包中也有'locf'。 – 2012-03-21 09:51:08