data.table中的.EACHI是什么?

81
我似乎找不到任何关于.EACHIdata.table中的作用的文档。我在文档中看到了简要提及:

在传递这些分组信息到i并设置by=.EACHI时,已知分组的聚合操作尤其高效。 当i是一个数据表时,DT [i,j,by = .EACHI]评估j对每个 连接到的DT中的组。 我们称之为按每个 进行分组。

但在DT上下文中,“分组”是什么意思呢? 组是由在DT上设置的键(key)确定的吗? 组是否是使用所有列作为键(key)的每个不同行? 我完全了解如何运行像DT [i,j,by = my_grouping_variable]这样的内容,但对.EACHI如何工作感到困惑。 有人可以解释一下吗?


感谢指出。不幸的是,答案中的链接无效,而且答案中没有其他关于.EACHI的内容。 - Alex
1
实际上,@eddi在这里的回答https://dev59.com/IIPba4cB1Zd3GeqPsHB_#25872206可能会提供一些见解。 - Rich Scriven
1
我明白了:根据.EACHI的定义,它基于iDT之间的合并方式来定义分组。也就是说,如果i使用一个键进行合并,那么该键将为DT定义分组。换句话说,i中的每一行都代表一个分组(以及DT返回的行)。如果软件包所有者能够确认这一点,那就太好了。在这种情况下,是否比指定by=条件更快呢? - Alex
1个回答

137

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


原因很可能是by=.EACHI是最近的功能(自1.9.4以来),但它的作用并不是最近才有的。让我用一个示例解释一下。假设我们有两个数据表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]来进行连接。 这类似于一个子集操作,但是使用的是data.tables(而不是整数/行名称或逻辑值)。 对于Y中的每一行,它将取Y的键列,并在X的键列(+ Y中的列)中找到相应的匹配行并返回。

X[Y]
#    x y z
# 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-byimplicit-by,因为它就像有一个隐藏的by一样。

问题在于这将始终执行by操作。所以,如果我们想知道连接后的行数,那么我们必须执行:X[Y][.N](或在这种情况下简单地执行nrow(X[Y]))。也就是说,如果我们不想要一个by-without-by,则不能在同一个调用中使用j表达式。因此,当我们执行例如X[Y,list(z)]时,它使用by-without-by计算list(z),因此速度略慢。

另外,data.table用户要求将其变得明确 - 有关更多上下文,请参见此处此处

因此,添加了by=.EACHI。现在,当我们执行:

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

它做它应该做的事情(避免混淆)。它返回连接后结果行的数量。

还有,

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

对于Y中的每一行(对应于这里Y的键列的值),在匹配的行上评估j表达式。使用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

现在我们已经拥有了这两个功能。


1
翻译:哇!多么好的答案。谢谢你,这非常有帮助。如果我可以提个建议,就把这个放在文档的某个地方,用大块粗体字标出来。就我个人而言,我总是使用X[Y][,j]语法或X[Y][,j,by=my_var],所以这标志着一个重要的变化,可能会让像我这样的人感到困惑。 - Alex
3
好的,我会尽力进行翻译。下一个版本(1.9.6)中将此问题链接起来可能是个好主意,直到文献资料发布为止。我会这样做。 - Arun
我不知道是否是偶然的,但是这种方式:X[Y, .N, by = x]可以得到相同的结果。 - David Leal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接