Мы можем использовать frank
из data.table
library(data.table)
setDT(df1)[, order := frank(start_date, ties.method = 'dense'), ID]
df1
# ID drug start_date order
#1: A X 2019-11-16 2
#2: A Y 2018-11-16 1
#3: A Z 2020-11-16 3
#4: B X 2019-11-16 1
#5: B Y 2019-11-16 1
#6: B X 2020-11-16 2
#7: C X 2019-11-16 1
#8: C X 2020-11-16 2
данные
df1 <- structure(list(ID = c("A", "A", "A", "B", "B", "B", "C", "C"),
drug = c("X", "Y", "Z", "X", "Y", "X", "X", "X"),
start_date = structure(c(18216,
17851, 18582, 18216, 18216, 18582, 18216, 18582), class = "Date")),
row.names = c(NA,
-8L), class = "data.frame")