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

fct_reorder按日期排序重复项异常:抗生素Gantt图因子排序问题

问题:fct_reorder排序抗生素因子层级不符合预期

问题场景

制作患者抗生素疗程甘特图时,存在剂量变更后恢复、更换抗生素后再换回的情况。尝试用fct_reorder按start日期降序排序antibiotic因子,期望"B 1g"因起始日期早于"B 2g"显示在其上方(与A类排序逻辑一致),但实际B类顺序颠倒,A类正常。

复现代码:

library(tidyverse)
library(lubridate)

df <- tribble(
  ~id,  ~start, ~end, ~antibiotic,
  1,    "02/02/23", "22/02/23", "A 1g",
  2,    "22/02/23", "10/03/23", "A 2g",
  3,    "10/03/23", "15/03/23", "A 1g",
  4,    "28/02/23", "11/03/23", "B 1g",
  5,    "11/03/23", "03/04/23", "B 2g",
  6,    "03/04/23", "10/04/23", "B 1g")

df <- df%>%
  mutate(across(c("start", "end"), dmy),
         antibiotic = fct_reorder(antibiotic, start, .desc = TRUE)) %>%
  pivot_longer(
    cols = c("start", "end"),
    names_to = "start_end",
    values_to = "date"
  )

# 检查因子层级
rev(levels(df$antibiotic))
#> [1] "A 1g" "A 2g" "B 2g" "B 1g"

原因分析

fct_reorder默认使用中位数作为每个因子对应数值的汇总函数,来确定排序顺序:

  • "A 1g"对应的start日期为2023-02-02和2023-03-10,其中位数早于"A 2g"的2023-02-22,因此排序符合预期。
  • "B 1g"对应的start日期为2023-02-28和2023-04-03,其中位数晚于"B 2g"的2023-03-11,降序排序后"B 2g"反而排在"B 1g"前面,导致顺序颠倒。

解决方案

修改fct_reorder的.fun参数,指定用**最早日期(min)**作为排序依据,确保每个抗生素类型按其首次出现的日期排序:

df <- df%>%
  mutate(across(c("start", "end"), dmy),
         # 用min(start)获取每个抗生素最早的起始日期作为排序依据
         antibiotic = fct_reorder(antibiotic, start, .fun = min, .desc = TRUE)) %>%
  pivot_longer(
    cols = c("start", "end"),
    names_to = "start_end",
    values_to = "date"
  )

# 验证因子层级
rev(levels(df$antibiotic))
#> [1] "A 1g" "B 1g" "A 2g" "B 2g"

此时"B 1g"会因最早起始日期更早,排在"B 2g"上方,符合预期的排序逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:55:29