【问题标题】:.EACHI in data.table?.EACHI 在 data.table 中?
【发布时间】:2015-01-16 05:06:58
【问题描述】:

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

对已知组的子集进行聚合特别有效 在 i 中传递这些组并设置 by=.EACHI 时。当i 是 data.table, DT[i,j,by=.EACHI]DT 的组评估 j i 中的每一行都加入到。我们将这个分组称为每个 i。

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

【问题讨论】:

  • 感谢您的指出。不幸的是,答案中的链接不起作用,答案中没有其他内容涉及.EACHI
  • 实际上,@eddi 在这里的回答 stackoverflow.com/questions/25869543/… 可能会提供一些见解
  • 我明白了:因此,.EACHI 根据iDT 之间的合并方式定义了组。也就是说,如果i 使用一个键来合并,那么该键定义了DT 的组。换句话说,i 中的每一行代表一个组(连同返回的DT 行)。如果包所有者可以确认会很好。在那种情况下,是否禁食然后指定by= 条件?

标签: r performance group-by data.table


【解决方案1】:

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


原因很可能是 by=.EACHI 是最近的功能(自 1.9.4 起),但它的作用不是。让我用一个例子来解释。假设我们有两个data.tablesXY

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 的关键列(这里只有一个关键列)的每一行,我们想要获得 @ 中匹配的 count 987654336@。在data.table 的版本中,我们可以通过在j 中简单地指定.N 来做到这一点,如下所示:

# < 1.9.4
X[Y, .N]
#    x N
# 1: 2 2
# 2: 6 1

这个隐式所做的是,在存在j 的情况下,对X 的每个匹配结果评估j-expression(对应于Y 中的行)。这被称为 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 用户要求这是显式 - 请参阅thisthis 了解更多上下文。

因此添加了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

所以我们现在拥有这两种功能。希望这会有所帮助。

【讨论】:

  • 轰隆隆!多么好的答案。谢谢你,这很有帮助。如果我可以提出建议,请以粗体大写字母将其放在文档中的某个位置。我,首先,总是使用X[Y][,j] 语法或X[Y][,j,by=my_var],所以这标志着一个重要的变化,可能会让像我这样的人感到困惑
  • 谢谢。在下一个版本 (1.9.6) 中链接到此 Q 可能是一个好主意,直​​到出现小插曲。会的。
  • 我不知道是不是偶然,但是这样:X[Y, .N, by = x]我得到了同样的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2019-02-28
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多