[英]Mutate time variables with conditions
我一直在尝试使用两个日期和条件形成一个新变量,但没有成功。 具体来说,我有一个这样的 dataframe:
ID MedicationDate NumberOfPackages
X001 2011-01-12 3
X001 2011-01-12 3
X001 2011-01-12 3
X001 2013-02-23 1
X001 2013-03-02 1
其中 MedicationDate 是购买药品的日期,NumberOfPackages 是该日期购买的包裹数量。 我需要的是一个新变量,说明药物能持续多久,假设一个 package 能持续一个月。 当在最后一个包结束后购买包时,情况很简单,并且新的变量值符合预期。 我用我的代码得到了这个结果,但在最后一行中,结果并不像预期的那样:
ID MedicationDate NumberOfPackages LastDate
X001 2011-01-12 3 2011-04-12
X001 2011-01-12 3 2011-04-12
X001 2011-01-12 3 2011-04-12
X001 2013-02-23 1 2013-03-23
X001 2013-03-02 1 2013-04-02
由于最后一种药物是在前一种药物用完之前购买的,因此最后日期应该是 2013-04-23。 我可以通过运行这段代码得到正确的答案:
as.Date("2013-03-02") %m+% months(1) %m+% days(as.numeric(difftime(as.Date("2013-03-23"),as.Date("2013-03-02"), units = "days")))
但是尝试在整个 dataframe 的条件下使用它似乎不起作用。
library(lubridate)
test <- test %>%
group_by(ID) %>%
arrange(MedicationDate) %>%
mutate(LastDate =
case_when(
lag(MedicationDate) == MedicationDate | is.na(lag(LastDate)) | lag(LastDate) <= MedicationDate ~ as.Date(MedicationDate) %m+% months(NumberOfPackages),
TRUE ~ as.Date(MedicationDate) %m+% months(NumberOfPackages) %m+% days(as.numeric(difftime(as.Date(lag(LastDate)),as.Date(MedicationDate), units = "days")))
)
)
似乎 LastDate 值总是由第一个公式计算得出。 我感谢有关如何找到所需值的任何帮助。
您可以像这样使用months
:
library(lubridate)
library(dplyr)
df %>%
mutate(LastDate = MedicationDate + months(NumberOfPackages))
# ID MedicationDate NumberOfPackages LastDate
# 1 X001 2011-01-12 3 2011-04-12
# 2 X001 2011-01-12 3 2011-04-12
# 3 X001 2011-01-12 3 2011-04-12
# 4 X001 2013-02-23 1 2013-03-23
# 5 X001 2013-03-02 1 2013-04-02
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.