我有一列开始和停止日期,我需要提取最新(最近(的停止日期来计算持续时间。(最早开始日期-最晚停止日期(不幸的是,最后一列中的日期不一定是最新的日期。所以,我必须逐行比较日期,找出最新的日期。另一个需要注意的是,并非所有列都有日期。
以下是日期列的示例:
pacman::p_load(tibble, lubridate)
start_1 <- as_tibble(sample(seq(ymd("1999/01/01"), ymd("2000/01/01"), by="day"), 5))
stop_1 <- as_tibble(sample(seq(ymd("2000/01/01"), ymd("2001/01/01"), by="day"), 5))
stop_2 <- as_tibble(c(ymd("2000/03/05"), ymd("2000/11/15"), ymd("2000/07/22"), ymd("2000/05/05"), NA))
stop_3 <- as_tibble(c(ymd("2000/12/12"), ymd("2000/02/09"), NA, NA, NA))
dat <- cbind(start_1, stop_1, stop_2, stop_3)
我真的不知道该怎么做,如果有任何帮助,我将不胜感激。
谢谢!
一个选项是使用apply((:
durs = as.Date(apply(dat[,c(2:ncol(dat))],1,max,na.rm=T))-dat[,1]
这假设第一列包含开始日期,之后所有列都包含可能的停止日期。
首先修复列名,然后将rowwise()
与c_across()
一起使用。
colnames(dat) = c("start_1", "stop_1", "stop_2", "stop_3")
dat %>%
rowwise() %>%
mutate(LastDate=max(c_across(starts_with("stop")), na.rm=T),
Duration = LastDate-start_1)
start_1 stop_1 stop_2 stop_3 LastDate Duration
<date> <date> <date> <date> <date> <drtn>
1 1999-10-20 2000-11-12 2000-03-05 2000-12-12 2000-12-12 419 days
2 1999-04-30 2000-05-05 2000-11-15 2000-02-09 2000-11-15 565 days
3 1999-05-01 2000-04-01 2000-07-22 NA 2000-07-22 448 days
4 1999-04-17 2000-08-23 2000-05-05 NA 2000-08-23 494 days
5 1999-04-10 2000-04-02 NA NA 2000-04-02 358 days