我有一箇中等大小的數據庫,有很多連接和查找表。何時使用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