【问题标题】:R - count maximum number of consecutive datesR - 计算最大连续日期数
【发布时间】:2019-05-11 18:48:34
【问题描述】:

我正在尝试按组计算连续日期的最大长度,但我很难得到它。我已经为我的类似布局的 tibble 添加了代码。

library(dplyr)

# construct sample tibble:
df <- tibble(
  key = rep(1:2, c(6,4)),
  Date = c(seq(as.Date('2016-12-17'), as.Date('2016-12-19'), '1 day'),
           seq(as.Date('2016-12-21'), as.Date('2016-12-23'), '1 day'),
           seq(as.Date('2017-05-18'), as.Date('2017-05-21'), '1 day'))          
)

我尝试使用lag()添加标签(1)来指示日期之间何时存在间隔,然后使用rle计算列中0的最大长度,但这并没有'不适用于keys 内所有可能的连续日期和间隔配置。

有没有办法按组返回最大连续日期数?

【问题讨论】:

    标签: r dataframe dplyr tibble


    【解决方案1】:

    让我们首先创建一个函数,在给定向量的情况下找到最大连续天数:

    gl <- function(x) {
      y <- c(unclass(diff(x)))  # c and unclass -- preparing it for rle
      r <- rle(y)
      with(r, max(lengths[values==1]))
    }
    

    现在我们可以按照通常的 dplyrry 方式使用它了:

    df %>% group_by(key) %>% summarise(max.consecutive = gl(Date))
    
    #  A tibble: 2 x 2
    #     key max.consecutive
    #   <int>           <int>
    # 1     1               2
    # 2     2               3
    

    【讨论】:

    • 嗨@lebatsnok 感谢您写这篇文章,虽然我只是有一个简单的问题。当我计算示例表中的最大连续天数时,我将键 1 计数为 3,键 2 计数为 4。函数中是否需要 + 1,如果是,是因为目前该函数没有'不计算开始日期或结束日期?
    • 对,可以在函数的最后一行加1。此外,如果rle 返回的值都不是 1(即,如果没有连续的日期),则应该有合理的返回值。像if(any(r$values %in% 1)) with(r, max(lengths[values==1])) else 1 作为最后一行
    【解决方案2】:

    我的解决方案:先按键拆分数据集

    df_split <- split(df, df$key)
    

    然后循环遍历列表并找到连续天之间差异的最大长度。

    df_split <- split(df, df$key)
    
    x <- lapply(df_split, 
                function(x){
                   max(rle(diff(x$Date) == 1)$lengths[rle(diff(x$Date) == 1)$value != FALSE]+1)
                }
         )
    

    【讨论】:

    • 如果连续有很多不连续的日期,这将给出错误的结果。比如说,d &lt;- as.Date(c("2017-06-11", "2017-05-12", "2052-04-13", "2017-07-07")) -- diff(d)==1 将是 FALSE 3 次,所以 rle(diff(d)==1)$lengths 将是 3。哪个会错误地作为答案弹出。
    猜你喜欢
    • 2021-12-29
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多