Вот один из способов сделать это, однако не существует простого (одного) способа подсчета количества месяцев между двумя датами, поэтому я посчитал, что каждый месяц составляет 30 дней. Вы можете изменить его в соответствии с вашими требованиями. Мы создаем новую группу (gr
) на основе TRUE
значений в столбце T/F
, а затем вычитаем Date
из first
Date
в каждой группе.
library(dplyr)
df %>%
mutate(Date = as.Date(Date, "%d-%m-%Y")) %>%
arrange(ID, Date) %>%
group_by(ID) %>%
mutate(gr = cumsum(`T/F`)) %>%
group_by(gr, add = TRUE) %>%
mutate(diff = as.integer(Date - first(Date))/30) %>%
ungroup %>%
select(-gr)
# A tibble: 15 x 4
# ID `T/F` Date diff
# <int> <lgl> <date> <dbl>
# 1 677937607 TRUE 2018-09-25 0
# 2 677937607 FALSE 2018-10-03 0.267
# 3 677937607 FALSE 2018-10-11 0.533
# 4 677937607 FALSE 2018-10-25 1
# 5 677937607 FALSE 2018-11-07 1.43
# 6 677937607 FALSE 2018-11-14 1.67
# 7 677937607 FALSE 2018-11-28 2.13
# 8 677937607 FALSE 2018-12-25 3.03
# 9 677937607 FALSE 2018-12-29 3.17
#10 677937607 FALSE 2019-01-22 3.97
#11 677937607 FALSE 2019-02-15 4.77
#12 677937607 FALSE 2019-03-01 5.23
#13 677937607 FALSE 2019-03-11 5.57
#14 677937607 FALSE 2019-03-16 5.73
#15 677937607 FALSE 2019-04-05 6.4
данные
df <- structure(list(ID = c(677937607L, 677937607L, 677937607L, 677937607L,
677937607L, 677937607L, 677937607L, 677937607L, 677937607L, 677937607L,
677937607L, 677937607L, 677937607L, 677937607L, 677937607L),
`T/F` = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), Date = structure(c(7L,
1L, 10L, 6L, 15L, 8L, 12L, 13L, 5L, 14L, 3L, 2L, 9L, 11L,
4L), .Label = c("01-03-2019", "03-10-2018", "05-04-2019",
"07-11-2018", "11-03-2019", "11-10-2018", "14-11-2018", "15-02-2019",
"16-03-2019", "22-01-2019", "25-09-2018", "25-10-2018", "25-12-2018",
"28-11-2018", "29-12-2018"), class = "factor")), class = "data.frame",
row.names = c(NA, -15L))