是否有一个简单的单行命令来获取 R 中分类变量的排序频率 table?

Is there a simple one-line command to get a sorted frequency table of a categorical variable in R?

问题

已经有人问过几次如何在 R 中生成分类变量的排序频率 table(例如,参见 this question which is marked a duplicate of a generic data frame sorting question)。答案建议三个连续的操作:1. 生成频率 table,2. 转换为数据框,3. 排序(参见下面的示例)。

这么简单的操作,还是比较复杂的。更重要的是,数据框的 summary() 将为您提供(对于相关列)我正在寻找的完全排序频率 table 的前 5 行(前提是不同值的数量在此列大于 5)。

例子

考虑以下形式的数据框

example_df <- data.frame("Avg" = c(2558,2532,2503,2498,2491,2491,2477,2467,2460,2458,2445,2422), "Name" = c("Jun","Wang","Xi","Wang","Wang","Ma","Li","Ma","Xi","Lin","Yang","Zhao"))

但更长,"Name" 有几千行和几千个不同的值。

提取名字频率 table 且最常见的名字排在最前面的最简单方法是什么?这将很有用,因为一个大的 table 大部分名称只出现一次不会提供太多信息。

你可以做到

example_ft<-as.data.frame(table(example_df$Name))
example_ft<-example_ft[order(-example_ft$Freq),]

library(plyr)
example_ft<-as.data.frame(table(example_df$Name))
example_ft<-arrange(example_ft,desc(Freq),Var1)

这些是上面链接的先前问题中建议的解决方案。两者都按预期产生以下 example_ft(尽管行号不同)

  Var1 Freq
5 Wang    3
4   Ma    2
6   Xi    2
1  Jun    1
2   Li    1
3  Lin    1
7 Yang    1
8 Zhao    1

但这两个选项看起来都比较复杂。我的猜测是可能有一种更简单直接的方法。确实有一个非常简单的命令可以提供所需的输出(但仅前 5 行,并且仅在其他不相关的输出中),summary():

summary(example_df)

输出:

      Avg            Name  
 Min.   :2422   Wang   :3  
 1st Qu.:2460   Ma     :2  
 Median :2484   Xi     :2  
 Mean   :2484   Jun    :1  
 3rd Qu.:2499   Li     :1  
 Max.   :2558   Lin    :1  
                (Other):2 

这个怎么样? :

sort(table(example_df$Name),decreasing = TRUE)