Условно обновить строки и затем сгруппировать - PullRequest
0 голосов
/ 07 февраля 2019

Позвольте мне начать с предоставления моего образца набора данных:

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...