2017-04-26 67 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