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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:01:41