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
相关产品推荐
相关产品推荐

