试图为我们有时不得不给予病人的复杂抗生素治疗方案制作甘特。
有时抗生素剂量改变,然后放回原始剂量,或抗生素完全改变,然后在以后再次改变。
尝试在下面的reprex中捕获问题。
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")
# trying to reorder the antibiotic factor level based on start date then pivot longer into tidy data form
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"
)
# create gantt style plot
df %>%
ggplot(aes(x = date)) +
geom_line(aes(y = antibiotic, colour = antibiotic, group = id), linewidth = 5)
我希望抗生素B1 g显示在B2 g上面,因为它的开始日期在B2 g之前,就像抗生素A一样。
当我检查因子水平时,抗生素A的顺序似乎是正确的,但抗生素B的顺序却颠倒了:
# levels should be "A 1g" "A 2g" "B 1g" "B 2g"
rev(levels(df$antibiotic))
#> [1] "A 1g" "A 2g" "B 2g" "B 1g"
我不明白为什么fct_reorder
对A正确地做了这件事,而对B却不正确。
如果有人能解释一下,我会很感激的。
创建于2023-04-03带有reprex v2.0.2
1条答案
按热度按时间e5njpo681#
这是因为因子的每个水平都有多个起始日期。
fct_reorder()
不知道要选择哪一个。一个选项是使用slice_min()
并根据显示的第一个日期构造因子水平:其给出: