确定时间数据中的差距

时间:2017-08-14 13:55:44

标签: r function time intervals

编辑:

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

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

我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用dplyrlubridate执行此操作。 dplyr非常有用window functions,如lag(),对于此类分析非常有用。

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。这通常是你应该如何处理这样的情况但我可以编辑我的答案,如果你想要它有不同的价值。

答案 1 :(得分:0)

编辑:我刚刚重新阅读了您的问题......您想将开头与所有结束日期进行比较。然后尝试使用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)

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

等等..你能提供一个正确的例子,说明你的期望和需要什么吗?我刚看了你的其他评论,现在让我困惑......