.EACHI在data.table中

我似乎无法find任何有关.EACHIdata.tabledata.table任何文档。 我在文档中看到了一个简短的提及:

对于已知组的一个子集的聚合在通过i中的这些组并by=.EACHI设置时是特别有效的。 当i是一个data.table时, DT[i,j,by=.EACHI]j中的每一行join的DT组进行求值。 我们把这个分组称为每个我。

但是,在DT的背景下,“群体”是什么意思呢? 是由DT上设置的密钥确定的组? 组中的每一个不同的行使用所有的列作为关键? 我完全理解如何运行类似DT[i,j,by=my_grouping_variable]但对于.EACHI如何工作会感到困惑。 有人可以解释吗?

我已经在这里添加了这个列表。 希望我们能够按计划交付。


原因是最有可能的是by=.EACHI是最近的一个特性(从1.9.4开始), 但是它所做的不是 。 让我以一个例子来解释。 假设我们有两个data.tables XY

 X = data.table(x = c(1,1,1,2,2,5,6), y = 1:7, key = "x") Y = data.table(x = c(2,6), z = letters[2:1], key = "x") 

我们知道我们可以通过做X[Y]来join。 这与子集操作类似,但使用data.tables (而不是整数/行名或逻辑值)。 对于Y每一行,取Y的关键字列,find并返回X的关键字列中的相应匹配行( Y +列)。

 X[Y] # xyz # 1: 2 4 b # 2: 2 5 b # 3: 6 7 a 

现在让我们假设,对于Y的关键列(这里只有一个关键列)中的每一行,我们希望得到X的匹配 。 在data.table <1.9.4版本中,我们可以通过简单地在j指定.N来做到这一点,如下所示:

 # < 1.9.4 X[Y, .N] # x N # 1: 2 2 # 2: 6 1 

这个隐含的做法是,在j的存在下,评估每个匹配结果X (对应于Y的行)的j-expression 。 这被称为by-without-by或者implicit-by ,因为它好像有一个隐藏的。

问题是,这将始终执行一个操作。 所以,如果我们想知道连接之后的行数,那么我们必须这样做: X[Y][ .N] (或者在这种情况下简单地是nrow(X[Y]) )。 也就是说,如果我们不想要一个by-without-by话,我们不能在同一个调用中拥有jexpression式。 因此,当我们做了例如X[Y, list(z)] ,它使用by-without-by评估list(z) ,因此稍微慢一些。

另外data.table用户要求这是明确的 – 看到这个和更多的上下文。

因此by=.EACHI 。 现在,当我们这样做时:

 X[Y, .N] # [1] 3 

它做它意味着什么(避免混淆)。 它返回连接产生的行数。

和,

 X[Y, .N, by=.EACHI] 

Y每一行的匹配行计算jexpression式(对应这里Y的键列的值)。 使用which=TRUE可以更容易地看到这一点。

 X[.(2), which=TRUE] # [1] 4 5 X[.(6), which=TRUE] # [1] 7 

如果我们为每个运行.N ,那么我们应该得到2,1。

 X[Y, .N, by=.EACHI] # x N # 1: 2 2 # 2: 6 1 

所以我们现在有两个function。 希望这可以帮助。