R语言如何按Degree列将数据表按High到Low自定义顺序排序
问题原因
原有代码无法实现预期排序的核心问题有2个:
- 初始代码中使用
arrange(desc(pop))、arrange(desc(sam))逻辑,是按百分比数值降序排列行,因此占比最高的Medium类别会固定排在最前,和自定义类别顺序的需求冲突。 - 后续修改时误用了非tidyverse体系的
sort()函数做管道排序,还存在参数拼写错误(将decreasing错写为degreasing);同时默认字符串排序是按字母顺序排列,High、Low、Medium的首字母顺序也不符合High→Medium→Low的预期顺序。
实现方案
核心解决思路是将degree列转换为有序因子,提前指定你需要的固定类别顺序,后续按因子本身排序即可得到目标顺序,不需要再按占比数值排序。
修正后的完整可运行代码如下:
library(tidyverse) library(janitor) library(DT) # 定义Degree列需要的固定展示顺序 degree_levels <- c("High", "Medium", "Low") team_pop <- team_new %>% # 提前将degree转为指定顺序的有序因子 mutate(degree = factor(degree, levels = degree_levels, ordered = TRUE)) %>% group_by(degree) %>% count() %>% ungroup() %>% mutate(pop = n/sum(n)) %>% # 按因子顺序排列,删除原有按占比降序的逻辑 arrange(degree) %>% adorn_totals() team_sample <- sample_final %>% # 样本表的degree列设置相同的因子顺序 mutate(degree = factor(degree, levels = degree_levels, ordered = TRUE)) %>% group_by(degree) %>% count() %>% ungroup() %>% mutate(sam = n/sum(n)) %>% arrange(degree) %>% adorn_totals() datatable( team_pop %>% select(-n) %>% left_join(team_sample %>% select(degree, sam), by = "degree"), rownames = FALSE, colnames = c( "Degree"= "degree", "Population" = "pop", "Sample" = "sam"), options = list( info = FALSE, paging = FALSE, searching = FALSE ) ) %>% formatPercentage(2, digits = 0) %>% formatPercentage(3, digits = 0)
补充说明
- 如果不想在统计计算阶段修改列类型,也可以在两表合并完成、传入
datatable()之前,对最终用于展示的数据集统一做因子转换和排序,最终展示效果完全一致。 - 必须删除原有按占比列降序排列的
arrange(desc(pop))、arrange(desc(sam))代码,否则数值排序逻辑会覆盖因子的自定义顺序,导致排序失效。
内容的提问来源于stack exchange,提问作者On_demand
相关产品推荐
相关产品推荐

