我已将其添加到此处的列表中。希望我们能够按计划交付。
原因很可能by=.EACHI
是最近的功能(自1.9.4开始),但不是。让我举例说明。假设我们有两个data.tablesX
和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
)。
X[Y]
现在,我们想针对Y
的关键列(此处仅一个关键列)中的每一行,获取中的匹配计数X
。在data.table
<1.9.4版本中,我们可以通过简单地指定.N
in来做到这一点j
:
X[Y, .N]
这在存在的情况下隐式地执行j
,对的j-expression
每个匹配结果X
(对应于中的行Y
)进行评估。之所以称其为by-without-by或implicit-by,是因为好像有一个隐藏的by。
问题是这将始终执行by
操作。因此,如果我们想知道联接后的行数,则必须这样做:(X[Y][ .N]
或者nrow(X[Y])
在这种情况下只是这样)。也就是说,j
如果我们不想使用,就不能在同一调用中使用该表达式by-without-by
。结果,例如当我们这样做时X[Y, list(z)]
,它list(z)
使用进行评估by-without-by
,因此速度稍慢。
此外data.table
用户要求这是明确的-看到这个和这个更多的内容。
因此by=.EACHI
增加了。现在,当我们这样做时:
X[Y, .N]
它可以达到预期的目的(避免混乱)。它返回联接产生的行数。
和,
X[Y, .N, by=.EACHI]
j
在每个匹配行中对-expressionY
求值(对应于Y
此处的键列的值)。使用会更容易看到这一点which=TRUE
。
X[.(2), which=TRUE]
X[.(6), which=TRUE]
如果我们.N
为每个运行,那么我们应该得到2,1。
X[Y, .N, by=.EACHI]
因此,我们现在具有两种功能。希望这可以帮助。
.EACHI