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

4

1 回答 1

21

执行此操作的 data.table 方法是使用特殊变量 ,.N它跟踪当前组中的行数。(其他特殊变量包括.SD, .BY(在 1.8.2 版中)和.Iand .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

要查看为什么您尝试的方法不起作用,请运行以下命令,在每个浏览器提示符处检查a和的值:length(a)

dt[, browser(), by = a]
于 2012-11-02T13:48:03.280 回答