使用data.table的简单频率表

gen*_*ama 32 r data.table

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

考虑虹膜数据,每个物种有50个观测值.为了计算每个物种的观察结果,我必须总结除物种以外的一列,例如"Sepal.Length".

library(data.table)
dt = as.data.table(iris)
dt[,length(Sepal.Length), Species]
Run Code Online (Sandbox Code Playgroud)

我发现这令人困惑,因为看起来我正在Sepal.Length上做一些事情,乍一看,真的只有物种才重要.

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

dt[,length(Species), Species]
Run Code Online (Sandbox Code Playgroud)

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

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

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

> dt[,length(Species), Species]
Species V1
1:     setosa  1
2: versicolor  1
3:  virginica  1
Run Code Online (Sandbox Code Playgroud)

这周围有优雅的方式吗?

mne*_*nel 38

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

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

?data.table详细信息by

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

....

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

例如:

dt[, .N ,by = Species]

     Species  N
1:     setosa 50
2: versicolor 50
3:  virginica 50
Run Code Online (Sandbox Code Playgroud)

  • @Farrel做`dt [,.N,by = Species] [,prop:= N/sum(N)]`就够了吗? (4认同)
  • @farrel - 如果你把它分配给它会在那里.有一个`data.table`魔术可以阻止`:=`自动打印结果(从1.8.4开始) - 你偶然发现了强行打印的惯用方法(换成`()`) (3认同)
  • 有没有办法将它结合起来也按计数排序(`.N`)? - 没关系.在帮助中找到:`DT [,sum(v),x] [order(-V1)]` (2认同)