【问题标题】:How to check for continuity minding possible gaps in dates如何检查连续性注意日期中可能的间隙
【发布时间】: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 对不起,这是我的错误,我现在编辑。

标签: r date group-by


【解决方案1】:

使用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

解决方案的作用基本上是:

  • 将日期更改为Date 格式(不需要lubridate);
  • ID 分组;
  • 选择满足您的条件的最高行,即最高行是一个空白 (TRUE),或者如果没有空白,则它是第一行(意味着在检查空白时它有一个缺失值,这就是为什么is.na(BEG &gt; ( lead(END) + 1 )))。

【讨论】:

  • 谢谢,我仍然不了解包中可用的组合(在本例中为 mutate_at(vars(END, BEG), funs(as.Date)slice(which.max
【解决方案2】:

我会使用 xts 包,首先为您拥有的每个 ID 创建 xts 对象,而不是对每个对象使用 first() 和 last() 函数。

https://www.datacamp.com/community/blog/r-xts-cheat-sheet

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多