gpt4 book ai didi

r - 数据表中的.EACHI?

转载 作者:行者123 更新时间:2023-12-01 16:29:45 26 4
gpt4 key购买 nike

我似乎找不到任何关于 .EACHIdata.table 中具体执行什么操作的文档。我在文档中看到了它的简短提及:

Aggregation for a subset of known groups is particularly efficient when passing those groups in i and setting by=.EACHI. When i is a data.table, DT[i,j,by=.EACHI] evaluates j for the groups of DT that each row in i joins to. We call this grouping by each i.

但是 DT 上下文中的“组”是什么意思?组是由 DT 上设置的键确定的吗?该组是否是使用所有列作为键的每个不同行?我完全理解如何运行 DT[i,j,by=my_grouping_variable] 之类的东西,但对 .EACHI 如何工作感到困惑。有人可以解释一下吗?

最佳答案

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

<小时/>

原因很可能是 by=.EACHI 是一项最新功能(自 1.9.4 起),但它的作用却不是。让我用一个例子来解释一下。假设我们有两个 data.table 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的每个匹配结果上计算j表达式 (对应于Y中的行)。这被称为by-without-by隐式by,因为就好像有一个隐藏的by。

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

此外,data.table 用户要求这是显式的 - 请参阅 thisthis了解更多背景信息。

因此添加了by=.EACHI。现在,当我们这样做时:

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

它做了它应该做的事情(避免混淆)。它返回连接产生的行数。

并且,

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

评估 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

所以我们现在拥有这两种功能。

关于r - 数据表中的.EACHI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27004002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com