如何生成仅含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
相关产品推荐
相关产品推荐

