我似乎无法找到关于 .EACHI
在 data.table
中究竟是什么的任何文档 . 我在文档中看到它的简要提及:
在i中传递这些组并通过= .EACHI设置时,已知组子集的聚合特别有效 . 当i是data.table时,DT [i,j,by = .EACHI]评估i中每行连接的DT组的j . 我们称之为每个i的分组 .
但 DT
在 DT
的上下文中是什么意思?是否由 DT
上设置的键确定的组?该组是否每个使用所有列作为键的不同行?我完全理解如何运行像 DT[i,j,by=my_grouping_variable]
这样的东西但是对于 .EACHI
如何工作感到困惑 . 有人可以解释一下吗?
1 回答
我已将此添加到列表here . 希望我们能够按计划交付 .
原因很可能是
by=.EACHI
是最近的一个特征(从1.9.4开始),但它的作用并非如此 . 让我举个例子来解释一下 . 假设我们有两个data.tablesX
和Y
:我们知道我们可以通过
X[Y]
加入 . 这类似于子集操作,但使用data.tables
(而不是整数/行名或逻辑值) . 对于Y
中的每一行,取Y
的键列,它会在X
的键列(Y
中的列)中找到并返回相应的匹配行 .现在让's say we' d喜欢,对于
Y
's key columns (here only one key column), we'中的每一行,我想得到X
中的匹配计数 . 在data.table
< 1.9.4 的版本中,我们可以通过在j
中指定.N
来执行此操作,如下所示:这隐含地做的是,在
j
存在的情况下,在X
的每个匹配结果上评估j-expression
(对应于Y
中的行) . 这被称为by-without-by或implicit-by,因为它隐藏着_1562461 .问题是这将始终执行
by
操作 . 所以,如果我们想知道连接后的行数,那么我们必须这样做:X[Y][ .N]
(在这种情况下只是nrow(X[Y])
) . 也就是说,如果我们不想要by-without-by
,我们就不能在同一个调用中使用j
表达式 . 因此,当我们执行例如X[Y, list(z)]
时,它使用by-without-by
评估了list(z)
,因此稍慢 .此外
data.table
用户要求明确这一点 - 有关更多上下文,请参阅this和this .因此添加了
by=.EACHI
. 现在,当我们这样做时:它做了它的意图(避免混淆) . 它返回连接产生的行数 .
和,
在
Y
中对每一行的匹配行计算j
-expression(对应于来自Y
's key columns here). It'的值,通过使用which=TRUE
更容易看到这一点 .如果我们为每个运行
.N
,那么我们应该得到2,1 .所以我们现在有两个功能 . 希望这可以帮助 .