Создайте последовательную переменную count, которая сбрасывается в 1 на основе даты POSIXct - PullRequest
0 голосов
/ 06 января 2020

Выполните следующие действия: Создайте последовательную переменную подсчета, которая сбрасывается в 1

, и решение работало отлично. Теперь у меня есть ниже, где дата POSixct:

df<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2), 
               date=c("2000-01-01 00:00:00", "2000-01-03 00:00:00", "2000-01-04 07:07:40", "2000-01-05 09:09:00", "2000-01-09 00:00:00", "2000-01-10 14:00:00", "2000-01-11 13:00:00"),
               want=c(1,1,2,3,1,2,1),
               want2=c(3,3,3,3,2,2,2))
library(anytime)
df<-df %>% mutate(date = anytime::anytime(str_c(date, sep= ' ')))
  group                date want want2
1     1 2000-01-01 00:00:00    1     3
2     1 2000-01-03 00:00:00    1     3
3     1 2000-01-04 07:07:40    2     3
4     1 2000-01-05 09:09:00    3     3
5     2 2000-01-09 00:00:00    1     2
6     2 2000-01-10 14:00:00    2     2
7     2 2000-01-11 13:00:00    1     2

Я хочу начать отсчет, когда «следующий день» после 24 часов, но до 48 часов.

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

df %>%
    group_by(group) %>%
    group_by(group2 = cumsum(c(TRUE, diff(date)<86400&diff(date)>172800))), add = TRUE) %>%
    mutate(wantn = row_number()) %>%
    group_by(group) %>%
    mutate(want2n = max(wantn)) %>%       
    select(-group2)

1 Ответ

1 голос
/ 07 января 2020

Здесь difftime() - лучший выбор, чем diff(), поскольку можно указать единицы измерения.

Если я правильно понимаю, последовательность POSIXct отметок времени считается последовательной, если разница во времени равна 24 часов или более, но менее 48 часов.

Приведенный ниже код воспроизводит ожидаемый результат для образца набора данных:

library(dplyr)
library(magrittr)
df %>% 
  group_by(group) %>% 
  mutate(want = difftime(date, lag(date, default = date[1L]), units = "days") %>% 
           floor() %>% 
           equals(1) %>% 
           not() %>% 
           cumsum() %>% 
           data.table::rowid(),
         want2 = max(want))
# A tibble: 7 x 4
# Groups:   group [2]
  group date                 want want2
  <dbl> <dttm>              <int> <int>
1     1 2000-01-01 00:00:00     1     3
2     1 2000-01-03 00:00:00     1     3
3     1 2000-01-04 07:07:40     2     3
4     1 2000-01-05 09:09:00     3     3
5     2 2000-01-09 00:00:00     1     2
6     2 2000-01-10 14:00:00     2     2
7     2 2000-01-11 13:00:00     1     2

Пояснение

df %>% 
  group_by(group) %>% 
  mutate(delta = difftime(date, lag(date, default = date[1L]), units = "days"))

возвращает

# A tibble: 7 x 5
# Groups:   group [2]
  group date                 want want2 delta         
  <dbl> <dttm>              <dbl> <dbl> <drtn>        
1     1 2000-01-01 00:00:00     1     3 0.0000000 days
2     1 2000-01-03 00:00:00     1     3 2.0000000 days
3     1 2000-01-04 07:07:40     2     3 1.2969907 days
4     1 2000-01-05 09:09:00     3     3 1.0842593 days
5     2 2000-01-09 00:00:00     1     2 0.0000000 days
6     2 2000-01-10 14:00:00     2     2 1.5833333 days
7     2 2000-01-11 13:00:00     1     2 0.9583333 days

Округляя до следующего нижнего целого (floor()), можно использовать лог c для случая Date.

Данные

library(magrittr)
df <- data.frame(
  group = c(1, 1, 1, 1, 2, 2, 2),
  date = c(
    "2000-01-01 00:00:00",
    "2000-01-03 00:00:00",
    "2000-01-04 07:07:40",
    "2000-01-05 09:09:00",
    "2000-01-09 00:00:00",
    "2000-01-10 14:00:00",
    "2000-01-11 13:00:00"
  ) %>% lubridate::as_datetime(),
  want = c(1, 1, 2, 3, 1, 2, 1),
  want2 = c(3, 3, 3, 3, 2, 2, 2)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...