2012-03-20 43 views
26

我有一箇中等大小的數據庫,有很多連接和查找表。何時使用R,何時使用SQL?

我比R更熟悉SQL,而我正在使用MySQL。

我的問題:

在什麼時候有什麼好處停止增加SQL語句的複雜性有利於在R(例如,merge*applymaplydlply等)中的數據子集的功能R.

一方面,SQL的加入比選擇每個表的所有內容並使用R merge函數加入它們要容易。此外,在SQL中執行條件選擇會減少必須導入到R的數據量;但速度差異並不顯着。

另一方面,與複雜where子句的大連接變得比R語法更容易理解。

下面我有一些未經測試代碼說明的目的:我在工作代碼之前問這個問題,並且我的問題的答案不需要工作代碼(雖然這總是讚賞) - 「最優雅的方法「,」最少的線條「或」令人驚歎的X的實現「總是值得讚賞的,但我特別感興趣的是」最明智/實用/規範/基於第一原則「的基本原理。

我感興趣的是一般的答案,其中的步驟應該使用SQL where條款和步驟會更容易使用R.

插圖來完成:

數據庫描述

有三個表格:a,abb。表ab各自具有主鍵id。它們具有由查找表ab表示的多對多關係,其包含分別與a.idb.id連接的字段ab.a_idab.b_id。兩個表都有一個time字段,並且a有一個group字段。

目標:

這裏是一個小例子,聯接和子集,我想做的事情;

(元素的MySQL的命名,例如a.id相當於R中a$id

  1. 加入ab使用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; 
    
  2. 我不需要b的重複值。時間,只需要的b.max的值:用於b.time重複的值加入到每個a.idb.maxb.time最接近但不大於a.time

    b.max <- max(b.time[b.time < a.time)) 
    
  3. dt <- a.time - b.max追加到該表中,例如值在R,
  4. a.group每個不同的值,選擇哪個(分鐘(x.dt)))

    x.dt <- a.time - b.max 
    
+3

「最接近於,但不大於」 聽起來像'輥= TRUE'加入在封裝['data.table'](http://datatable.r-forge.r-project.org/ )。該操作在SQL中可能會變得很慢,但在R中使用簡短語法的速度非常快。在'zoo'和'xts'以及其他包中也有'locf'。 – 2012-03-21 09:51:08

回答

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; 
+0

精確地說,SQL中的子集只能將你需要的分析引入到R中。 – Hansi 2012-03-21 11:29:40

+1

這是一個不錯的主意,但在MySQL中使用視圖比在R中使用data.table慢(即使MySQL服務器比我的桌面快得多) - 我問了一個有關dba.SE的相關問題:http:// dba.stackexchange.com/questions/16372/when-to-use-views-in-mysql,它看起來很慢。儘管如此,速度懲罰仍然在一分鐘左右,如果這樣做是可以忍受的。 – 2012-04-11 21:05:42

11

爲什麼不是both SQL和R - 在R中使用sqldf包?這些examples顯示瞭如何使用具有R數據幀的sqldf函數或通過與現有數據庫的連接。這樣,你就可以靈活地做這個習慣用語。

+0

我實際上使用兩者。我有一個函數''查詢'環繞dbSendQuery()'函數,所以我可以,例如'查詢(「select * from ...)'。但問題是,SQL查詢應該多複雜,我應該什麼時候將表導入到R中,並在R中進行連接,選擇和基本算術(最小,最大,+, - ,*,/等)。我的問題是「哪些習語最適合到R與MySQL。 – 2012-03-20 21:29:26

+0

看起來好像人們繼續投票。我想我會留下我的回答,以防其他人不知道這個已經被使用,也許會幫助他們。那,我喜歡坐過山車。 Whee! – 2012-03-21 12:07:38

+0

+1;雖然沒有在示例中提供,但是sqldf可以直接連接到數據庫;相當有用。謝謝。 – 2012-03-27 02:09:55