R .EACHI在data.table中?

R .EACHI在data.table中?,r,performance,group-by,data.table,R,Performance,Group By,Data.table,我似乎找不到任何关于.EACHI在data.table中具体做什么的文档。我在文件中看到对它的简要提及: 对已知组子集的聚合特别有效 在i中传递这些组并设置by=.EACHI时。当i是 data.table,DT[i,j,by=.EACHI]对DT组的j进行评估 i中的每一行都连接到。我们称这种分组为每个i 但是在DT的上下文中,“组”是什么意思?组是否由设置在DT上的键确定?该组是否使用所有列作为键的每个不同行?我完全理解如何运行类似于DT[I,j,by=my\u grouping\u var

我似乎找不到任何关于
.EACHI
data.table
中具体做什么的文档。我在文件中看到对它的简要提及:

对已知组子集的聚合特别有效 在i中传递这些组并设置
by=.EACHI
时。当
i
是 data.table,
DT[i,j,by=.EACHI]
DT
组的
j
进行评估
i
中的每一行都连接到。我们称这种分组为每个i


但是在
DT
的上下文中,“组”是什么意思?组是否由设置在
DT
上的键确定?该组是否使用所有列作为键的每个不同行?我完全理解如何运行类似于
DT[I,j,by=my\u grouping\u variable]
的东西,但对
的工作方式感到困惑。有人能解释一下吗?

我已将此添加到列表中。希望我们能够按计划交付


原因很可能是
by=.EACHI
是最近推出的一项功能(自1.9.4以来),但它的功能并非如此。让我举例说明。假设我们有两个数据表
X
Y

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]
来加入。这类似于子集操作,但使用的是
data.tables
(而不是整数/行名或逻辑值)。对于
Y
中的每一行,取
Y
的键列,它在
X
的键列(+
Y
中的列)中查找并返回相应的匹配行

现在让我们假设,对于
Y
的键列(这里只有一个键列)中的每一行,我们希望获得
X
中的匹配计数。在
data.table
<1.9.4的版本中,我们只需在
j
中指定
.N
即可完成此操作,如下所示:

# < 1.9.4
X[Y, .N]
#    x N
# 1: 2 2
# 2: 6 1
它做它应该做的(避免混淆)。它返回联接产生的行数

以及

Y
中的每一行计算匹配行上的
j
-表达式(对应于
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

所以我们现在有了这两种功能。希望这能有所帮助。

谢谢您的指点。不幸的是,答案中的链接不起作用,答案中没有任何其他内容涉及
。EACHI
实际上,@eddi的答案可能提供了一些见解,我明白了:因此根据
。EACHI
根据
i
DT
之间的合并方式定义组。也就是说,如果
i
使用键进行合并,则该键定义
DT
的组。换句话说,
i
中的每一行代表一个组(以及返回的
DT
行)。如果包所有者能够确认,那就好了。在这种情况下,这是fasted然后通过=
条件指定
的吗?轰!多好的回答啊。谢谢你,这很有帮助。如果我能提出建议,请用粗体大写字母在文档中的某个地方写上。i、 例如,总是使用
X[Y][,j]
语法或
X[Y][,j,by=my_var]
,因此这标志着一个重要的变化,可能会让一些人困惑,比如梅坦克斯。在下一个版本(1.9.6)中链接到这个Q可能是个好主意,直到小插曲出来。可以。我不知道这是否是偶然的,但是这样:
X[Y,.N,by=X]
我得到了同样的结果
X[Y, .N, by=.EACHI]
X[.(2), which=TRUE] # [1] 4 5
X[.(6), which=TRUE] # [1] 7
X[Y, .N, by=.EACHI]
#    x N
# 1: 2 2
# 2: 6 1