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

R 如何在data.table分组中获取当前组的长度?,r,data.table,grouping,R,Data.table,Grouping,我知道这可以通过其他包实现,但我正在尝试在data.table中实现(因为它似乎是分组最快的) 导致 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没有给出相同的结果,以及如何实现这一点。data.table实现这

我知道这可以通过其他包实现,但我正在尝试在
data.table
中实现(因为它似乎是分组最快的)

导致

   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
没有给出相同的结果,以及如何实现这一点。

data.table实现这一点的方法是使用特殊变量
.N
,它跟踪当前组中的行数。(其他特殊变量包括
.SD
.BY
(在1.8.2版中)和
.I
.GRP
(在1.8.3版中提供)。所有变量都记录在
数据表中。
):

要查看您尝试的操作失败的原因,请运行以下命令,在每个浏览器提示下检查
a
length(a)
的值:

dt[, browser(), by = a]

+1@jamborta也可以查看一些背景信息。这样做的原因是为了避免通过潜在的长向量(时间和空间)重复相同的组值。在具有较长矢量的ops中,如果需要,R仍将循环长度为1的矢量。所以,
.N
是一种方法。谢谢大家,这非常有用。
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
dt[, browser(), by = a]