34

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

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

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

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

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

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

有没有一种优雅的方式来解决这个问题?

4

1 回答 1

39

data.table有几个可以在j表达式中使用的符号。尤其

  • .N将为您提供每组中的行数。

详情见?data.tableby

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

……

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

例如:

dt[, .N ,by = Species]

     Species  N
1:     setosa 50
2: versicolor 50
3:  virginica 50
于 2012-08-31T04:36:52.453 回答