Позвольте мне начать с предоставления моего образца набора данных:
ID Start Code End Days
1 2016-03-01 A 2016-03-14 14
1 2016-03-01 A 2016-03-14 14
1 2016-03-01 B 2016-04-01 30
2 2016-02-01 A 2016-03-01 28
Я бы хотел, чтобы для каждого идентификатора и в пределах этой группы для каждого кода проверялось, больше ли Конец, чем Начать вв следующей строке (если df $ End [i]> df $ Start [i + 1]) и, если это так, обновите начало следующей строки до End и повторно вычислите End (то есть Start + Days) для этой строки i + 1.Таким образом, результаты должны быть:
ID Start Code End Days
1 2016-03-01 A 2016-03-14 14
1 2016-03-14 A 2016-03-28 14
1 2016-03-01 B 2016-04-01 30
2 2016-02-01 A 2016-03-01 28
Впоследствии, если для идентификатора и кода разница между df $ End [i] - df $ Start [i + 1] <= 7, я бы хотелобъединить строки, используя наименьшее значение df $ Start и наибольшее значение df $ End для этого подмножества.Создание: </p>
ID Start Code End Days
1 2016-03-01 A 2016-03-28 14
1 2016-03-01 B 2016-04-01 30
2 2016-02-01 A 2016-03-01 28
Поскольку мой набор данных содержит более 100 миллионов строк, я бы хотел быстрое решение.К сожалению, я довольно новичок в dplyr, поэтому помощь высоко ценится!
обновление: увеличенный пример:
ID Start Code End Days
1 2012-04-01 A 2012-04-07 7
1 2016-03-01 B 2016-03-15 15
1 2016-03-01 B 2016-05-29 90
1 2016-06-01 B 2016-08-29 90
1 2016-09-01 B 2016-11-29 90
1 2016-12-01 B 2017-02-28 90
1 2017-03-01 B 2017-05-09 90
1 2017-08-01 B 2017-10-29 90
1 2017-12-01 B 2018-02-28 90
2 2016-04-01 B 2016-04-14 14
В результате:
ID Start Code End
1 2012-04-01 A 2012-04-07
1 2016-03-01 B 2017-02-28
1 2017-03-01 B 2017-05-29
1 2018-08-01 B 2017-12-05
2 2016-04-01 B 2016-04-14
Где бы яожидаем, что строка 2 будет объединена.
Для первого шага я попытался:
grouped_df <-
df %>%
group_by(ID, Code) %>%
mutate_at(vars(Start, End), funs(as.Date)) %>%
mutate(new_start = as.Date(ifelse(lag(End > Start), lag(End), Start), origin="1970-01-01")) %>%
mutate (new_stop = new_disp + Days)
Однако, если new_end имеетПосле вычисления мы должны сравнить new_end, а не End с new_start (а не Start).