使用data.table制作简单频率表

35

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

考虑鸢尾花数据,每个物种有50个观测结果。为了计算每个物种的观测结果数量,我必须在除"Species"以外的列上进行汇总,例如"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

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

2个回答

39

data.table中有几个符号可以在j表达式中使用。特别是,.N将为您提供每个组中的行数。

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

请参阅?data.table了解by的详细信息。

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

....

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

例如:

dt[, .N ,by = Species]

     Species  N
1:     setosa 50
2: versicolor 50
3:  virginica 50

2
有没有办法将这个代码组合起来,并按计数(.N)进行排序?--算了,我在帮助文档中找到了解决方法:DT[,sum(v),x][order(-V1)] - Gaffi
1
@mnel 有没有一个简单的一行代码可以给出频率/数量/计数所代表的数量和百分比(或比例)? - Farrel
8
@Farrel做dt[,.N,by=Species][,prop := N/sum(N)]足够吗? - mnel
3
如果你给它分配了一个对象,它就会在那里。data.table 有一个魔法技巧可以阻止 := 自动打印结果(从1.8.4版本开始) - 你已经发现了强制打印的惯用方法(把代码用括号包起来)。 - mnel
1
@mnel 我现在记得了。谢谢。 - Farrel
显示剩余2条评论

0
一种更具普适性的方法是
dt[, table(col2bCount)%>%as.data.frame, by= .(col1,col2,col3,...)]

关键优势在于列col2bCountcol1,2,3可以是不同的(或相同的),这意味着您可以按不同的列对一列中的频率进行计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接