r - 跟踪患者何时可能没有药物
问题描述
我一直坚持这一点,我可以利用社区的一些见解。假设由于不寻常的情况,患者按不规律的时间表接受药物:
Patient_Receiving_Schedule <- tibble(Medicine_Received = c(ymd("2019-01-01"), ymd("2019-01-20"), ymd("2019-02-01"), ymd("2019-06-01"), ymd("2019-06-15")),
Days_of_Medicine_Received = c(30,30,30,30,30))
在某些时候,患者手头上的药物会从先前的货物中过剩,而在其他一些时候,患者会因为货物之间的时间太长而没有药物或过期。理想的输出是这样的:
Patient_Receiving_Schedule <- tibble(Medicine_Received = c(ymd("2019-01-01"), ymd("2019-01-20"), ymd("2019-02-01"), ymd("2019-06-01"), ymd("2019-05-15")),
Days_of_Medicine_Received = c(30,30,30,30,30),
Days_of_Medicine_Available = c(30,41,59,30,46),
Notes = c("","","","Patient was 31 days overdue for medication",""))
Days_of_Medicine_Available 有点像 Medicine_Received 日期与 Days_of_Medicine_Received 之间的累积总和,但有规则,因为对 Days_of_Medicine_Available 的负值求和没有任何意义。
有没有办法通过 lag() 调用和一些围绕可用药物天数的累计值的逻辑来做到这一点?
非常感谢任何提示。
解决方案
你能使用一个逻辑,如果x
在上次发货后的天数内没有收到药物,那么我们需要重新Days_of_Medicine_Available
计算吗?
如果是,那么您可以在此示例中使用以下内容,x = 30
但您实际上可以将其设置为任何值。
library(dplyr)
Patient_Receiving_Schedule %>%
group_by(grp = cumsum(Medicine_Received - lag(Medicine_Received, default = first(Medicine_Received)) > 30)) %>%
mutate(Days_of_Medicine_Available = cumsum(Days_of_Medicine_Received) - as.integer(Medicine_Received - first(Medicine_Received))) %>%
ungroup() %>%
select(-grp)
# Medicine_Received Days_of_Medicine_Received Days_of_Medicine_Available
# <date> <dbl> <dbl>
#1 2019-01-01 30 30
#2 2019-01-20 30 41
#3 2019-02-01 30 59
#4 2019-06-01 30 30
#5 2019-06-15 30 46