Postępuj zgodnie z tym: Utwórz zmienną liczbę, która resetuje 1.

I rozwiązanie działało świetnie. Teraz mam poniżej, gdzie data jest 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

Chcę zacząć liczyć, gdy "następny dzień" jest po 24 godzinach, ale przed 48 godzinami.

Próbując tego bez powodzenia, ponieważ myślę, że funkcja diff daje mi wynik w sekundach:

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)
r
0
biostatguy12 6 styczeń 2020, 21:39

1 odpowiedź

Najlepsza odpowiedź

Tutaj difftime() jest lepszym wyborem niż diff(), ponieważ można określić jednostki.

Jeśli rozumiem poprawnie, sekwencja POSIXct znaczników czasu jest uważana za kolejne, jeśli różnica czasu wynosi 24 godziny lub więcej, ale mniej niż 48 godzin.

Poniższy kod odtwarza oczekiwanego wyniku dla przykładowego zestawu danych:

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

Wyjaśnienie

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

Zwroty

# 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

Zaokrąglając do następnej dolnej liczby całkowitej ({x0}}), można użyć logiki dla obudowy Date.

Dane

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)
)
1
Community 20 czerwiec 2020, 09:12