我有一个中等大小的数据库,其中包含许多连接和查找表。
我比较熟悉R语言而不是SQL,并且我正在使用MySQL。
我的问题:
在什么时候停止增加SQL语句的复杂性,转而使用R中数据子集功能(例如merge
、*apply
、maply
、dlply
等)会更加有利。
一方面,SQL的连接比选择每个表的所有内容并使用R中的merge
函数将它们连接起来要更容易。此外,在SQL中执行条件选择将减少导入到R中的数据量;但速度差异不明显。
另一方面,带有复杂where条件子句的大型连接变得不如R语法易于理解。
下面是一些用于说明目的的未经测试代码:我在编写工作代码之前就提出了这个问题,回答我的问题不需要工作代码(虽然这总是受欢迎的) - “最优雅的方法”、“最少的行数”或“对X的惊人实现”总是受欢迎的,但我特别感兴趣的是“最合理/实际/规范/基于第一原则”的基础。
我对哪些步骤应该使用SQL的where
子句以及哪些步骤可以更容易地使用R进行操作感兴趣。
示例:
数据库描述
有三个表:a
、ab
和b
。表格a
和b
都有一个主键id
。它们具有一个多对多关系,由查找表ab
表示,其中包含字段ab.a_id
和ab.b_id
,它们连接到a.id
和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
的值:对于每个 a.id
和重复的 b.time
值,b.max
是最接近但不大于 a.time
的 b.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
data.table
包中听起来像是使用roll=TRUE
连接的操作。在SQL中,这种操作可能会非常缓慢,但在R中,语法简短且运行速度非常快。zoo
、xts
和其他包中也有locf
函数可用。 - Matt Dowle