我正在处理大型表,并且需要经常使用聚合。我使用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