2017-04-26 68 views
-3

我正在處理大型表,並且需要經常使用聚合。我使用dplyr來處理大部分數據,因爲語法對我來說更有意義。我認爲Hadley關於dplyr語法的可讀性有一個非常有效的觀點。但是,有部分腳本需要更高的效率,我正在嘗試學習data.table使用data.table過濾,聚合並再次過濾

下面給出的代碼,這使我基於的ratioexpression列(第一2個過濾器)的值排除行的表的一部分然後給出具有觀察在至少2 replicates聚集上四倍的行,導致尺寸101K X 13

mult.obs <- tidy.dt %>% 
    filter(ratio != "H.L") %>% 
    filter(!is.na(expression)) %>% 
    group_by(Seq, Gene.names, condition, ratio) %>% 
    filter(n_distinct(replicate) > 1) 

我有翻譯語句data.table語法的困難,我的第一個嘗試是:

> dt <- tidy.dt[ratio != "H.L" & !is.na(expression), 
+   by = .(Seq, Gene.names, condition, ratio)][ 
+   uniqueN(replicate > 1) 
+   ] 

Error in `[.data.table`(tidy.dt, ratio != "H.L" & !is.na(expression), : 
    'by' or 'keyby' is supplied but not j 

導致錯誤如你看到的。

我已經嘗試過以下內容,但會導致較長和較窄的表格(141K x 5)。除了我得到更多的行(?!)之外,我也沒有得到所有我想獲得的列。

> dt <- tidy.dt[ratio != "H.L" & !is.na(expression), 
+    uniqueN(replicate > 1), 
+    by = .(Seq, Gene.names, condition, ratio)] 

檢查第n次的data.table文檔後,我知道[i,j,by]語法大致相當於SQL方面where, select|update, groupby,我知道給什麼。但很快實例爲你的創業新領域獲得i,j,by權變得相當複雜。

我不在這裏?

+1

它有時也會出現問題使用列名狀「表達」。這是一個重要的R函數名稱。至少這樣的做法我容易導致錯誤的錯誤信息。您的DT呼叫都沒有分配任務。賦值功能是':='。多步驟流程可能需要鏈接'[.data.table' –

+0

@ 42-這是因爲我不想更改表'tidy.dt',而是要過濾副本。我不需要一個新的列,只是基於一個聚合條件進行過濾。 – posdef

+1

你可能知道這一點,但downvotes來自缺乏[mcve]。你的代碼非常接近,只需在'j'參數中使用'if(uniqueN(replicate)> 1L).SD'。希望最終會有更多的自然語法。 https://github.com/Rdatatable/data.table/issues/788 – Frank

回答

3

您需要使用data.table中的.SD成語。當使用by(並且也可以在沒有by的情況下使用,但我發現它主要用於by)時,這用於j參數中。 「SD」是指「數據子集」(或類似的東西)。結合by它包含每個組的data.table。

例如,使用虹膜數據集:

as.data.table(iris)[, .SD[length(unique(Sepal.Length)) == 21], by = Species] 

在這裏,我們通過種分組,然後找出其中存在Sepal.Length的正好21個唯一值的基團。

因此,對於你的問題,你可以這樣做:

tidy.dt[ratio != "H.L" & !is.na(expression), 
    .SD[uniqueN(replicate) > 1], 
    by = .(Seq, Gene.names, condition, ratio)] 
+0

謝謝! 2個快速問題:1.不需要在某處定義「SD」? 2.是否.SD [uniqueN(replicate)> 1]'在內部評估爲'j = if(uniqueN(replicate)> 1L).SD'還是? – posdef

+0

@posdef x [cond]其中cond爲TRUE或FALSE與if(cond)x相同。但是,如果cond缺失值,「if」版本將會出錯,如果長度大於1,則會發出警告。我認爲這些是調試的理想結果,所以我總是按照「如果」的方式進行。 – Frank