Расчет интервала до последующих вхождений - PullRequest
0 голосов
/ 27 января 2020

У меня есть данные, содержащие события True и False, с датой. Я хочу вычислить интервал следующего появления False из True в месяцах, например, если «677937607 TRUE 25-09-2018» - это одна запись, а «677937607 FALSE 25-10-2018» - другая, тогда разница должна составлять 1M (или дробь).

Ожидаемый результат -

 "677937607 FALSE   03-10-2018  0.something(number of months in fraction)"
    "677937607  FALSE   11-10-2018  0.something(number of months in fraction)"
    "677937607  FALSE   25-10-2018  0.something(number of months in fraction)"
    "677937607  FALSE   07-11-2018  0.something(number of months in fraction)".
 and So on ....

ID          T/F     Date
677937607   FALSE   14-11-2018
677937607   FALSE   01-03-2019
677937607   FALSE   22-01-2019
677937607   FALSE   11-10-2018
677937607   FALSE   29-12-2018
677937607   FALSE   15-02-2019
677937607   FALSE   25-10-2018
677937607   FALSE   25-12-2018
677937607   FALSE   11-03-2019
677937607   FALSE   28-11-2018
677937607   FALSE   05-04-2019
677937607   FALSE   03-10-2018
677937607   FALSE   16-03-2019
677937607   TRUE    25-09-2018
677937607   FALSE   07-11-2018

1 Ответ

1 голос
/ 27 января 2020

Вот один из способов сделать это, однако не существует простого (одного) способа подсчета количества месяцев между двумя датами, поэтому я посчитал, что каждый месяц составляет 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...