R语言DataFrame排序求助:按Freq排序且重复Var聚合显示
解决方案:按分组最高频次排序并聚合重复变量
没问题,这个需求其实很好实现——核心是先给每个Var标记它对应的最高Freq,再基于这个标记值和原始Freq做双层排序即可。我给你两种常用的R语言实现方式:
方法1:使用dplyr(tidyverse生态,代码更直观)
首先构造你的示例数据:
df <- data.frame( Var = c("A", "C", "B", "D", "E", "A", "B", "A"), Freq = c(10, 11, 8, 7, 6, 5, 1, 3) )
然后通过分组计算最高频次、排序来实现需求:
library(dplyr) df_sorted <- df %>% # 按Var分组,计算每个组的最高Freq group_by(Var) %>% mutate(max_group_freq = max(Freq)) %>% ungroup() %>% # 第一排序键:组最高Freq降序;第二排序键:当前行Freq降序 arrange(desc(max_group_freq), desc(Freq)) %>% # 移除临时生成的max_group_freq列 select(-max_group_freq) print(df_sorted)
运行后输出结果完全符合你的期望:
# A tibble: 8 × 2 Var Freq <chr> <dbl> 1 C 11 2 A 10 3 A 5 4 A 3 5 B 8 6 B 1 7 D 7 8 E 6
方法2:使用Base R(无需额外安装包)
如果不想加载第三方库,用Base R也能完成:
# 先计算每个Var对应的最高Freq var_max_freqs <- tapply(df$Freq, df$Var, max) # 给原数据框添加最高频次的标记列 df$max_group_freq <- var_max_freqs[df$Var] # 按标记列降序、原始Freq降序排序 df_sorted_base <- df[order(-df$max_group_freq, -df$Freq), ] # 删除临时标记列 df_sorted_base$max_group_freq <- NULL print(df_sorted_base)
核心思路说明
我们的目标是先按每个Var的最高Freq排序组,组内再按自身Freq降序排序:
- 先为每一行标记它所属Var的最高Freq值,作为组排序的依据
- 用双层排序:第一层按组最高Freq降序,确保高频次的Var组排在前面;第二层按当前行Freq降序,确保组内的行从高到低排列
- 最后移除临时标记列,得到干净的结果
内容的提问来源于stack exchange,提问作者Xiao-yan Pan
相关产品推荐
相关产品推荐

