如何根据列值消除非连续日期?

时间:2019-01-15 14:38:30

标签: r date dplyr

我有一个带有日期的数据框,我需要消除非连续值,但是确定连续状态的方法分为两列:

ID | END        | BEG
1  | 9999-12-31 | 2017-07-01
1  | 2017-06-30 | 2016-01-01
1  | 2015-12-31 | 2015-11-12
1  | 2008-07-26 | 2003-02-24

对于这种特定情况,预期结果将是

ID | END        | BEG
1  | 9999-12-31 | 2017-07-01
1  | 2017-06-30 | 2016-01-01
1  | 2015-12-31 | 2015-11-12

还可能出现日期(订购的日期)显示此模式的情况:

ID | END        | BEG
2  | 9999-12-31 | 2018-04-01
2  | 9999-12-31 | 2017-01-01
2  | 2016-07-31 | 2014-07-15
2  | 2011-08-31 | 2009-01-01
2  | 2008-12-31 | 1991-11-04

在这种情况下,由于前两个条目的结尾均为9999-12-31,因此我们从第三行开始,并立即发现以下情况不是连续的,因此对于该特定情况,仅保留该日期,而保留为结果:

ID | END        | BEG
2  | 2016-07-31 | 2014-07-15

是否可以使用dplyr软件包来做到这一点? 预先感谢。

1 个答案:

答案 0 :(得分:1)

检查此解决方案:

library(tidyverse)
library(lubridate)

df %>%
  mutate_at(2:3, ymd) %>%
  mutate(
    BEG_lag = lag(BEG),
    cons = END == BEG_lag - days(1)
  ) %>%
  fill(cons, .direction = 'up') %>%
  filter(cons) %>%
  select(1:3)