【问题标题】:Counting sequential dates in R to determine the length of an event计算 R 中的连续日期以确定事件的长度
【发布时间】:2021-04-27 07:58:06
【问题描述】:

我有一个数据框,其中包含给定事件发生的日期。有些活动会持续几天,我想根据每个活动的开始日期和总长度(以天为单位)来总结每个活动。

我想从这里开始:

Date
2020-01-01
2020-01-02
2020-01-03
2020-01-15
2020-01-20
2020-01-21

到这里:

StartDate EventLength
2020-01-01 3
2020-01-15 1
2020-01-20 2

我用 aggregateaveseq_alonglag 尝试了各种方法,但我没有t 设法获得在日期不连续时重置的事件长度计数。

示例数据框的代码,以防有帮助:

Date <- c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-15", "2020-01-20", "2020-01-21")
df <- data.frame(Date)
df$Date <- as.Date(df$Date, origin = "1970-01-01") 

【问题讨论】:

    标签: r date sequence


    【解决方案1】:

    您可以通过cumsum(c(0, diff(df$Date) != 1) split 然后获取第一个日期并将其与length 组合,假设日期已排序

    do.call(rbind, lapply(split(df$Date, cumsum(c(0, diff(df$Date) != 1))),
      function(x) data.frame(StartDate=x[1], EventLength=length(x))))
    #   StartDate EventLength
    #0 2020-01-01           3
    #1 2020-01-15           1
    #2 2020-01-20           2
    

    或使用rle的其他选项:

    i <- cumsum(c(0, diff(df$Date) != 1))
    data.frame(StartDate = df$Date[c(1, diff(i)) == 1], EventLength=rle(i)$lengths)
    #   StartDate EventLength
    #1 2020-01-01           3
    #2 2020-01-15           1
    #3 2020-01-20           2
    

    【讨论】:

      【解决方案2】:

      我建议dplyr 方法,顺便提一下,与@Rui 的方法非常相似

      df %>% mutate(dummy = c(0, diff(Date))) %>%
        group_by(grp = cumsum(dummy != 1)) %>%
        summarise(Date = first(Date),
                  event_count = n(), .groups = 'drop')
      
      # A tibble: 3 x 3
          grp Date       event_count
        <int> <date>           <int>
      1     1 2020-01-01           3
      2     2 2020-01-15           1
      3     3 2020-01-20           2
      

      【讨论】:

        【解决方案3】:

        这是一个基本的 R 解决方案,带有 cumsum 技巧,后跟 ave/table

        d <- c(0, diff(df$Date) != 1)
        res <- ave(df$Date, cumsum(d), FUN = function(x) x[1])
        res <- as.data.frame(table(a))
        names(res) <- c("Date", "EventLength")
        
        res
        #        Date EventLength
        #1 2020-01-01           3
        #2 2020-01-15           1
        #3 2020-01-20           2
        

        【讨论】:

          猜你喜欢
          • 2021-12-29
          • 2021-05-08
          • 1970-01-01
          • 1970-01-01
          • 2019-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-07
          相关资源
          最近更新 更多