R 如何检查连续性注意日期中可能存在的间隔

R 如何检查连续性注意日期中可能存在的间隔,r,date,group-by,R,Date,Group By,我有一个带有日期的大数据框架,我需要连续检查第一个日期,如下所示: ID ID_2 END BEG 1 55 2017-06-30 2016-01-01 1 55 2015-12-31 2015-11-12 --> Gap (required date) 1 88 2008-07-26 2003-02-24 2 19 2014-09-30 2013-05-01 2 33 2013-04-30 20

我有一个带有日期的大数据框架,我需要连续检查第一个日期,如下所示:

ID   ID_2  END         BEG
1    55    2017-06-30  2016-01-01
1    55    2015-12-31  2015-11-12  --> Gap (required date)
1    88    2008-07-26  2003-02-24
2    19    2014-09-30  2013-05-01
2    33    2013-04-30  2011-01-01  --> Not Gap (overlapping)
2    19    2012-12-31  2011-01-01
2    33    2010-12-31  2008-01-01
2    19    2007-12-31  2006-01-01
2    19    2005-12-31  1980-10-20  --> No actual Gap(required date)
df <- df%>%
  group_by(ID)%>%
  mutate(END_lead = lead(END))

df$FLAG <- df$BEG - days(1) == df$END_lead

df <- df%>%
 group_by(ID)%>%
 filter(cumsum(cumsum(FLAG == FALSE))<=1)
如图所示,并非所有日期都有重叠,我需要通过ID(而不是ID_2)返回第一个间隔(时间向后)出现的日期。我试过使用,但速度非常慢(dataframe有150k行)。我一直在摆弄dplyr,并按如下方式进行变异:

ID   ID_2  END         BEG
1    55    2017-06-30  2016-01-01
1    55    2015-12-31  2015-11-12  --> Gap (required date)
1    88    2008-07-26  2003-02-24
2    19    2014-09-30  2013-05-01
2    33    2013-04-30  2011-01-01  --> Not Gap (overlapping)
2    19    2012-12-31  2011-01-01
2    33    2010-12-31  2008-01-01
2    19    2007-12-31  2006-01-01
2    19    2005-12-31  1980-10-20  --> No actual Gap(required date)
df <- df%>%
  group_by(ID)%>%
  mutate(END_lead = lead(END))

df$FLAG <- df$BEG - days(1) == df$END_lead

df <- df%>%
 group_by(ID)%>%
 filter(cumsum(cumsum(FLAG == FALSE))<=1)

有没有办法使用dplyr、tidyr和lubridate来实现这一点?

我会使用xts包,首先为每个ID创建xts对象,然后对每个对象使用first()和last()函数


使用dplyr的可能解决方案:

library(dplyr)

df %>%
  mutate_at(vars(END, BEG), funs(as.Date)) %>%
  group_by(ID) %>%
  slice(which.max(BEG > ( lead(END) + 1 ) | is.na(BEG > ( lead(END) + 1 ))))
根据您最后的数据,它提供:

# A tibble: 2 x 4
# Groups:   ID [2]
     ID  ID_2 END        BEG       
  <int> <int> <date>     <date>    
1     1    55 2015-12-31 2015-11-12
2     2    19 2005-12-31 1980-10-20
#一个tible:2 x 4
#组别:ID[2]
ID_2结束
1     1    55 2015-12-31 2015-11-12
2     2    19 2005-12-31 1980-10-20
解决方案的基本功能是:

  • 将日期更改为
    Date
    格式(无需
    lubridate
  • ID
    分组
  • 选择满足条件的最高行,即,最高行是间隙(
    TRUE
    ),或者如果没有间隙,则它是第一行(这意味着在检查间隙时它缺少一个值,这就是为什么
    是.na(BEG>(lead(END)+1))

我很难理解你所说的“差距”是什么意思。。。似乎到处都有缺口?此外,在df中“时间倒流”是指从上到下吗?@FonsMA“时间倒流”是指从最大日期到最低日期(df是这样排序的),所以是从上到下。您看到的差距要么是日差(不被视为差距),要么是重叠。一的每一个开头都是前一个加一的结尾(或日期的重叠)好的,我想我现在明白了,除了标记为“无实际差距”的那一个似乎有最大的差距?@FonsMA抱歉,这是我的错误,我现在就编辑。谢谢,我仍然不了解软件包中可用的组合(在这种情况下,
在(vars(END,BEG),funs(as.Date)
切片(which.max