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