You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成仅含Top3高频类别且按总频次排序的Year与Category交叉表

解决交叉表按总频次排序的问题

我明白你的问题了——你已经筛选出了出现次数最多的3个类别,但生成的交叉表没有按照总频次从高到低排序,而是默认按类别字母顺序排列了对吧?这是因为table()函数是根据因子的水平顺序来生成表格行的,而你之前的arrange()只是调整了数据框的行顺序,并没有修改category的因子水平顺序,所以最后生成的表还是会回到默认顺序。

下面是修正后的代码,能完美得到你想要的排序结果:

library(dplyr)

# 原始数据集
df <- data.frame(
  category = c("A", "A", "B", "C", "C", "D", "E", "C", "E", "A", "B", "C", "B", "B", "B", "D", "D", "D", "D", "B"),
  year = c(1, 2, 1, 2, 3, 2, 3, 1, 3, 2, 1, 1, 2, 1, 2, 3, 1, 2, 3, 1)
)

# 步骤1:筛选出总频次最高的3个类别,并按频次降序保存
top_categories <- df %>%
  count(category, sort = TRUE) %>%  # 按类别计数并降序排序
  slice_head(n = 3) %>%             # 取前3个高频类别
  pull(category)                    # 提取为字符向量

# 步骤2:将原始数据的category转换为指定顺序的因子
df_adjusted <- df %>%
  filter(category %in% top_categories) %>%
  mutate(category = factor(category, levels = top_categories))  # 强制因子水平顺序为总频次降序

# 步骤3:生成符合要求的交叉表
table(df_adjusted$category, df_adjusted$year)

运行后会得到你期望的输出:

1 2 3
  B 4 2 0
  D 1 2 2
  C 2 1 1

关键逻辑解释:

  • count(category, sort = TRUE):直接按类别分组计数并降序排序,一步拿到频次从高到低的类别列表,比先排序再取尾部更直观。
  • mutate(category = factor(category, levels = top_categories)):这是解决排序问题的核心——把category转换为因子时,指定水平顺序为我们筛选出的高频类别顺序,这样table()函数就会严格按照这个顺序生成表格行。

如果你喜欢更简洁的链式写法,也可以把步骤合并:

df %>%
  count(category, sort = TRUE) %>%
  slice_head(n = 3) %>%
  pull(category) %>%
  {df %>% 
     filter(category %in% .) %>% 
     mutate(category = factor(category, levels = .))} %>%
  table(.$category, .$year)

内容的提问来源于stack exchange,提问作者Anton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:52:48