我正在處理大型表,並且需要經常使用聚合。我使用dplyr
來處理大部分數據,因爲語法對我來說更有意義。我認爲Hadley關於dplyr
語法的可讀性有一個非常有效的觀點。但是,有部分腳本需要更高的效率,我正在嘗試學習data.table
。使用data.table過濾,聚合並再次過濾
下面給出的代碼,這使我基於的ratio
和expression
列(第一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
權變得相當複雜。
我不在這裏?
它有時也會出現問題使用列名狀「表達」。這是一個重要的R函數名稱。至少這樣的做法我容易導致錯誤的錯誤信息。您的DT呼叫都沒有分配任務。賦值功能是':='。多步驟流程可能需要鏈接'[.data.table' –
@ 42-這是因爲我不想更改表'tidy.dt',而是要過濾副本。我不需要一個新的列,只是基於一個聚合條件進行過濾。 – posdef
你可能知道這一點,但downvotes來自缺乏[mcve]。你的代碼非常接近,只需在'j'參數中使用'if(uniqueN(replicate)> 1L).SD'。希望最終會有更多的自然語法。 https://github.com/Rdatatable/data.table/issues/788 – Frank