有条件地更新行,然后分组

时间:2019-02-06 22:41:11

标签: r dplyr

让我首先提供示例数据集:

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

我想针对每个ID,并针对该组中的每个代码,检查End是否较大,并在下一行开始(如果df $ End [i]> df $ Start [i + 1] ]),如果是这样,请将下一行的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

然后,如果是ID和代码,则df $ End [i]-df $ Start [i + 1] <= 7之间的区别是,我想使用最小的df $ Start和此子集的最大df $ End。制作:

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

由于我的数据集超过1亿行,因此我想提供一种快速的解决方案。不幸的是,我对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 +天数)

但是,如果已计算new_end,我们现在应该将new_end而不是End与new_start(而不是Start)进行比较。

0 个答案:

没有答案