.EACHI在data.table中
我似乎无法find任何有关.EACHI
在data.table
中data.table
任何文档。 我在文档中看到了一个简短的提及:
对于已知组的一个子集的聚合在通过i中的这些组并
by=.EACHI
设置时是特别有效的。 当i
是一个data.table时,DT[i,j,by=.EACHI]
对j
中的每一行join的DT
组进行求值。 我们把这个分组称为每个我。
但是,在DT
的背景下,“群体”是什么意思呢? 是由DT
上设置的密钥确定的组? 组中的每一个不同的行使用所有的列作为关键? 我完全理解如何运行类似DT[i,j,by=my_grouping_variable]
但对于.EACHI
如何工作会感到困惑。 有人可以解释吗?
我已经在这里添加了这个列表。 希望我们能够按计划交付。
原因是最有可能的是by=.EACHI
是最近的一个特性(从1.9.4开始), 但是它所做的不是 。 让我以一个例子来解释。 假设我们有两个data.tables 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]
来join。 这与子集操作类似,但使用data.tables
(而不是整数/行名或逻辑值)。 对于Y
每一行,取Y
的关键字列,find并返回X
的关键字列中的相应匹配行( Y
+列)。
X[Y] # xyz # 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-by或者implicit-by ,因为它好像有一个隐藏的。
问题是,这将始终执行一个操作。 所以,如果我们想知道连接之后的行数,那么我们必须这样做: X[Y][ .N]
(或者在这种情况下简单地是nrow(X[Y])
)。 也就是说,如果我们不想要一个by-without-by
话,我们不能在同一个调用中拥有j
expression式。 因此,当我们做了例如X[Y, list(z)]
,它使用by-without-by
评估list(z)
,因此稍微慢一些。
另外data.table
用户要求这是明确的 – 看到这个和更多的上下文。
因此by=.EACHI
。 现在,当我们这样做时:
X[Y, .N] # [1] 3
它做它意味着什么(避免混淆)。 它返回连接产生的行数。
和,
X[Y, .N, by=.EACHI]
对Y
每一行的匹配行计算j
expression式(对应这里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
所以我们现在有两个function。 希望这可以帮助。