.EACHI在data.table中?


68

我似乎无法找到究竟任何文件.EACHI中做data.table。我在文档中看到了简短的提及:

当在i和setting中传递那些组时,对已知组的子集进行聚合特别有效by=.EACHI。当i为data.table时,DT[i,j,by=.EACHI]评估连接的每一行j的组。我们称每个i为分组。DTi

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


谢谢指出。不幸的是,答案中的链接不起作用,答案中没有其他内容涉及.EACHI
Alex

1
实际上,@ eddi在这里的答案stackoverflow.com/questions/25869543/…可能会提供一些见识
Rich Scriven

1
我看到:因此根据.EACHI定义了基于iDT发生合并的方式的组。也就是说,如果i使用键来合并,则该键定义的组DT。换句话说,中的每一行i代表一个群组(以及返回的DT)。如果包裹所有者可以确认,那将很好。在那种情况下,是否先禁食然后指定by=条件?
Alex

Answers:


118

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


原因很可能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的关键列(此处仅一个关键列)中的每一行,获取中的匹配计数X。在data.table <1.9.4版本中,我们可以通过简单地指定.Nin来做到这一点j

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

这在存在的情况下隐式地执行j,对的j-expression每个匹配结果X(对应于中的行Y)进行评估。之所以称其为by-without-byimplicit-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]
# [1] 3

它可以达到预期的目的(避免混乱)。它返回联接产生的行数。

和,

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

j在每个匹配行中对-expressionY求值(对应于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

因此,我们现在具有两种功能。希望这可以帮助。


1
繁荣!什么答案。感谢您的帮助,这非常有帮助。如果我可以提出建议,请将其以粗体的大写字母形式放在文档中。我,其中一个总是使用X[Y][,j]语法,X[Y][,j,by=my_var]所以这标志着一个重要的变化,可能会使像我这样的人感到困惑
Alex

3
谢谢。在小插曲消失之前,在下一个版本(1.9.6)中链接到此Q可能是一个好主意。会做。
阿伦2014年

我不知道是否有机会,但是这样: X[Y, .N, by = x]我得到了相同的结果
David Leal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.