使用data.table再次过滤,聚合和过滤

时间:2017-04-26 13:41:50

标签: r data.table dplyr

我正在处理大型表,需要经常使用聚合。我使用dplyr进行大部分数据修改,因为语法对我来说更有意义。我认为Hadley对dplyr语法的可读性有一个非常有效的观点。但是,脚本的某些部分需要更高的效率,我正在尝试在此过程中学习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 个答案:

答案 0 :(得分:3)

您需要使用data.table中的.SD惯用法。这在j参数中用于by时使用{并且也可以在没有by的情况下使用,但我发现它主要用于by)。 &#34; SD&#34;意味着&#34;数据的子集&#34; (或类似的东西)。与by结合使用时,它包含每个组的data.table。

例如,使用虹膜数据集:

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

这里我们按照物种进行分组,然后找到具有正确21个Sepal.Length唯一值的组。

因此,您可能会遇到以下问题:

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