我似乎找不到任何关于.EACHI
在data.table
中到底做了什么的文档.我在文件中看到了对它的简短提及:
对已知组的子集进行聚合尤其有效
但在DT
人的背景下,"群体"意味着什么?组是否由设置为DT
的键确定?该组是否使用所有列作为键的每个不同行?我完全理解如何运行像DT[i,j,by=my_grouping_variable]
这样的东西,但对.EACHI
如何工作感到困惑.有人能解释一下吗?
我似乎找不到任何关于.EACHI
在data.table
中到底做了什么的文档.我在文件中看到了对它的简短提及:
对已知组的子集进行聚合尤其有效
但在DT
人的背景下,"群体"意味着什么?组是否由设置为DT
的键确定?该组是否使用所有列作为键的每个不同行?我完全理解如何运行像DT[i,j,by=my_grouping_variable]
这样的东西,但对.EACHI
如何工作感到困惑.有人能解释一下吗?
我已将此添加到列表here中.希望我们能按计划交货.
原因很可能是by=.EACHI
是最近的特性(自1.9.4以来),but what it does isn't.让我举个例子来解释.假设我们有两个数据.表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]
件事来加入.这类似于subset操作,但使用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
中的count个匹配项.在data.table
< 1.9.4的版本中,我们可以通过简单地在j
中指定.N
来实现这一点,如下所示:
# < 1.9.4
X[Y, .N]
# x N
# 1: 2 2
# 2: 6 1
这implicitly所做的是,在j
存在的情况下,对X
的每个匹配结果(对应于Y
中的行)判断j-expression
.这被称为by-without-by或implicit-by,因为它好像有一个隐藏的.
问题是,它将始终执行by
次操作.所以,如果我们想知道一个连接后的行数,那么我们必须做:X[Y][ .N]
(或者在本例中是nrow(X[Y])
).也就是说,如果我们不想要by-without-by
,就不能在同一个调用中使用j
表达式.因此,当我们使用例如X[Y, list(z)]
时,它使用by-without-by
判断list(z)
,因此稍微慢一些.
此外,data.table
名用户要求将其设置为explicit,更多内容请参见this和this.
因此增加了by=.EACHI
个.现在,当我们这样做:
X[Y, .N]
# [1] 3
它做了它应该做的(避免混淆).它返回联接产生的行数.
和
X[Y, .N, by=.EACHI]
对匹配的行Y
中对应的行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
所以我们现在有了这两种功能.希望这有帮助.