R - считать максимальное количество последовательных дат - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь подсчитать максимальную длину последовательных дат по группам, но я изо всех сил пытаюсь ее получить.Я включил в свой код аналогичный план.

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), чтобы указать, когда между датами был разрыв, изатем подсчитайте максимальную длину 0 в столбце, используя rle, но это не работает для всех возможных конфигураций последовательных дат и пропусков в пределах keys.

Есть ли способ вернутьмаксимальное количество последовательных дат по группе?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Мое решение: сначала разделите набор данных по ключу

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)
            }
     )
0 голосов
/ 10 декабря 2018

Давайте сначала создадим функцию, которая будет находить максимальное количество последовательных дней, учитывая вектор:

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
...