【发布时间】:2019-01-21 10:55:24
【问题描述】:
我有一个带有日期的大数据框,我需要以连续的方式检查第一个日期,如下所示:
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)
如图所示,并非所有日期都有重叠,我需要通过 ID(不是 ID_2)返回第一个间隙(时间倒退)出现的日期。我试过使用 for 但它非常慢(数据框有 150k 行)。我一直在搞乱 dplyr 和 mutate 如下:
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)
但是这组指令在第一次重叠时停止,过滤了错误的日期。我已经尝试了我能想到的任何东西,按降序或升序排序,并使用 min 和 max 但无法找到解决方案。
想要的实际结果是:
ID ID_2 END BEG
1 55 2015-12-31 2015-11-12
2 19 2008-07-26 1980-10-20
有没有办法使用 dplyr、tidyr 和 lubridate 做到这一点?
【问题讨论】:
-
我无法理解您所说的“差距”是什么意思......似乎到处都有差距?另外,“时间倒退”是否意味着您的df中从上到下?
-
@FonsMA“时间倒退”的意思是从最大的日期到最低的日期(df 是这样排序的)所以是从上到下。您看到的差距要么是天差(不被视为差距),要么是重叠。一个的每个开头都是前一个的结尾加上一个(或日期的重叠)
-
好的,我想我现在明白了,只是标记为“没有实际差距”的那个似乎是所有差距中最大的?
-
@FonsMA 对不起,这是我的错误,我现在编辑。