【问题标题】:How to get length of current group in data.table grouping?如何在 data.table 分组中获取当前组的长度?
【发布时间】:2012-10-23 04:11:57
【问题描述】:

我知道这可以通过其他软件包实现,但我正在尝试在 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 没有给出相同的结果,以及如何实现。

【问题讨论】:

    标签: r data.table grouping


    【解决方案1】:

    执行此操作的 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 @jamborta 另请参阅FAQ 2.10 了解一些背景信息。其原因是避免通过可能很长的向量(时间和空间)重复相同的组值的效率。在具有较长向量的操作中,如果需要,R 无论如何都会回收长度为 1 的向量。所以.N 是这里的路。
    • 谢谢大家,这很有用。
    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 2017-06-19
    • 1970-01-01
    • 2022-09-23
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多