让我首先提供示例数据集:
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)进行比较。