【问题标题】:Identify gaps in time data识别时间数据中的空白
【发布时间】:2018-01-22 09:24:34
【问题描述】:

编辑:

我找到了解决以下问题的方法,但是,它适用于小型数据集,但仍会在大型数据集上产生错误输出。有人知道为什么吗?我找不到错误。代码如下:

df$continuous <-
  unlist(lapply(split(df, df$ID),
                function(x) {
                  sapply(1:nrow(x),
                         function(y) {
                           any(x$start[y] - x$end[-(y:NROW(x$end))] <= 1)
                         })
                }))

原始问题: 我正在开发一个函数来识别一系列开始/结束日期中的差距。如果开始日期晚于之前任何结束日期的 1 天开始,则输出应为 FALSE。

数据:

df <- data.frame('ID' = c('1','1','1','1','1','1'), 'start' = as.Date(c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10')),
                 'end' = as.Date(c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12')))

这是我尝试用x = starty = end 解决这个问题:

my_fun <- function(x,y){
  any(x[i] - y[1:NROW(i)-1] <= 1)
}

如果我指定 i 效果很好,但我无法将其包装成一个循环。最终,这个函数应该以dplyr 的方式应用于大型数据集中的组。

它应该是这样的:

  ID      start        end  continuous
1  1 2010-01-01 2010-01-03 FALSE #or TRUE
2  1 2010-01-03 2010-01-22 TRUE
3  1 2010-01-05 2010-01-07 TRUE
4  1 2010-01-09 2010-01-12 TRUE
5  1 2010-02-01 2010-02-10 FALSE
6  1 2010-02-10 2010-02-12 TRUE #according to my function or FALSE compared to start[1] would be even better

非常感谢您对此的帮助。

【问题讨论】:

    标签: r function time intervals


    【解决方案1】:

    编辑:我刚刚重新阅读了您的问题...并且您想将开始日期与所有结束日期进行比较。然后尝试使用函数expand.grid

    df <- data.frame('ID' = c('1','1','1','1','1','1'), 'start' = as.Date(c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10')),
                     'end' = as.Date(c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12')))
    
    df_expand <- as.data.table(expand.grid(df$start,df$end))
    

    这会创建开始/结束之间的所有组合

    names(df_expand) = c("start","end")
    df_expand[,ID:= 1]
    df_expand[,diff_days := difftime(end,start,unit = "days")]
    df_expand[,acceptable := any(diff_days<1), by = start]
    

    我们在这里定义什么是可接受的..

    df = merge(df,df_expand,by = c("start","end","ID"),all.x=TRUE)
    

    我想..我们可能想要保留原始数据,因此我们将其合并回来并缩小我们拥有的信息。

    等等..你能提供一个合适的例子来说明你期望什么和需要什么吗?我刚刚阅读了您的其他评论,现在它让我感到困惑......

    【讨论】:

      【解决方案2】:

      您可以使用dplyrlubridate 执行此操作。 dplyrlag() 一样非常有用,window functions 非常适合此类分析。

      library(tidyverse)
      library(lubridate)
      
      df %>% 
        mutate(start - lag(end, 1) == 0)
      
      # ID      start        end start - lag(end, 1) == 0
      # 1  1 2010-01-01 2010-01-03                       NA
      # 2  1 2010-01-03 2010-01-22                     TRUE
      # 3  1 2010-01-05 2010-01-07                    FALSE
      # 4  1 2010-01-09 2010-01-12                    FALSE
      # 5  1 2010-02-01 2010-02-10                    FALSE
      # 6  1 2010-02-10 2010-02-12                     TRUE
      

      您想如何处理数据的第一行?由于没有先前的值,它显示NA。这通常是您应该如何处理此类情况,但如果您希望它具有不同的值,我可以编辑我的答案。

      【讨论】:

      • 我之前也尝试过这种方法,但是,我需要一个解决方案,将开始日期 T 与此之前的所有结束日期进行比较。所以类似:'start[4] - end[1:3]' 不幸的是,滞后函数是不够的。
      • @ceefel 你能安排数据然后使用lag() 还是行有重叠的句点?
      • 对,句号是重叠的。 Start[1] 到 end[4] 实际上是一个句点。所以 start[5] 应该返回 FALSE
      • @AndrewBrēza 有没有办法实现这行代码来评估单列时间戳而不是开始列和结束列中的时间间隔?
      猜你喜欢
      • 2016-07-25
      • 2015-01-14
      • 2020-01-07
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多