【问题标题】:Simple frequency tables using data.table使用 data.table 的简单频率表
【发布时间】:2012-08-25 21:27:12
【问题描述】:

我正在寻找一种通过 data.table 进行简单聚合/计数的方法。

考虑 iris 数据,每个物种有 50 个观察值。要计算每个物种的观察结果,我必须对物种以外的列进行汇总,例如“Sepal.Length”。

library(data.table)
dt = as.data.table(iris)
dt[,length(Sepal.Length), Species]

我觉得这很令人困惑,因为乍一看我好像在对 Sepal.Length 做一些事情,而实际上只有物种才重要。

这是我想说的,但我没有得到有效的输出:

dt[,length(Species), Species]

正确的输入和输出,但代码笨拙:

> dt[,length(Sepal.Length), Species]
Species V1
1:     setosa 50
2: versicolor 50
3:  virginica 50

输入输出不正确,但代码更好:

> dt[,length(Species), Species]
Species V1
1:     setosa  1
2: versicolor  1
3:  virginica  1

有没有优雅的方法解决这个问题?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    data.table 有几个符号可以在j 表达式中使用。值得注意的是

    • .N 会给你每组的行数。

    by的详细信息下查看?data.table

    高级:当按by或按i分组时,j表达式中可以使用符号.SD、.BY和.N,定义如下。

    ....

    .N 是一个整数,长度为 1,包含组中的行数。

    例如:

    dt[, .N ,by = Species]
    
         Species  N
    1:     setosa 50
    2: versicolor 50
    3:  virginica 50
    

    【讨论】:

    • 有没有办法把它结合起来也按计数排序(.N)? - 没关系。在帮助中找到:DT[,sum(v),x][order(-V1)]
    • @mnel 是否有一个简单的衬线可以给出该频率/数字/计数所代表的计数和百分比(或比例)?
    • @Farrel dt[,.N,by=Species][,prop := N/sum(N)] 足够了吗?
    • @farrel - 如果你将它分配给某个东西,它就会在那里。有 data.table 魔法停止 := 自动打印结果(从 1.8.4 开始)-您偶然发现了强制打印的惯用方法(包装在 () 中)
    • @mnel 我现在记得了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 2011-12-10
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多