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))
在(vars(END,BEG),funs(as.Date)
或切片(which.max