如何在data.table分组中获取当前组的长度?

10

我知道其他包也可以实现这个功能,但我想尝试使用 data.table(因为它似乎是最快的分组方法)。

library(data.table)
dt = data.table(a=c(1,2,2,3))
dt[,length(a),by=a]

导致

   a V1
1: 1  1
2: 2  1
3: 3  1

然而

df = data.frame(a=c(1,2,2,3))
ddply(df,.(a),summarise,V1=length(a))

产生

  a V1
1 1  1
2 2  2
3 3  1

这是一个更合理的结果。只是想知道为什么data.table没有给出相同的结果,以及如何实现相同的结果。

1个回答

21

用 data.table 的方式来实现这个操作是使用特殊变量 .N,它可以跟踪当前组中的行数。(其他特殊变量包括 .SD.BY(在版本 1.8.2 中)和 .I.GRP(从版本 1.8.3 开始提供)。所有这些变量都在 ?data.table 中有文档记录):

library(data.table)
dt = data.table(a=c(1,2,2,3))

dt[, .N, by = a]
#    a N
# 1: 1 1
# 2: 2 2
# 3: 3 1

要了解你尝试的方法为什么不起作用,请运行以下内容,并在每个浏览器提示处检查alength(a)的值:

dt[, browser(), by = a]

1
+1 @jamborta。此外请查看FAQ 2.10以了解一些基本知识。避免在可能很长的向量中重复相同的组值可以提高效率(时间和空间)。在较长向量的操作中,如果需要的话,R会循环使用长度为1的向量。因此,在这里使用.N是最好的选择。 - Matt Dowle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接