сжатие нескольких строк по разнице во времени - PullRequest
0 голосов
/ 29 января 2019

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

 Id     Status    DateCreated          Group
 10     Read      2017-11-04 18:24:55  Red
 10     Write     2017-11-04 18:24:56  Red
 10     Review    2017-11-04 18:25:16  Red
 10     Read      2017-11-04 18:26:17  Red
 10     Write     2017-11-04 18:26:47  Red

Как свернуть строки, которые находятся в пределах 1 минуты друг от друга.Например, строки 1, 2, 3 свернуты в 1 строку, а строки 4 и 5 - во вторую строку.

Ожидаемый результат будет выглядеть следующим образом

 Id     Status              DateCreated            Date Ended             Group
 10     Read,Write,Review   2017-11-04 18:24:55    2017-11-04 18:25:16    Red, Red, Red
 10     Read,Write          2017-11-04 18:26:17    2017-11-04 18:26:47    Red, Red

Ниже приведенкод для воспроизведения набора тестовых данных в этом примере.

df <- structure(list(Id = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "10", class = "factor"), 
    Status = structure(c(1L, 3L, 2L, 1L, 3L), .Label = c("Read", 
    "Review", "Write"), class = "factor"), DateCreated = structure(1:5, .Label = c("2017-11-04 18:24:55", 
    "2017-11-04 18:24:56", "2017-11-04 18:25:16", "2017-11-04 18:26:17", 
    "2017-11-04 18:26:47"), class = "factor"), Group = structure(c(1L, 
    1L, 1L, 1L, 1L), .Label = "Red", class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))

Любая помощь очень ценится.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

library(lubridate)
library(dplyr)
library(purrr)

df <-
  structure(
    list(
      Id = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "10", class = "factor"),
      Status = structure(
        c(1L, 3L, 2L, 1L, 3L),
        .Label = c("Read",
                   "Review", "Write"),
        class = "factor"
      ),
      DateCreated = structure(
        1:5,
        .Label = c(
          "2017-11-04 18:24:55",
          "2017-11-04 18:24:56",
          "2017-11-04 18:25:16",
          "2017-11-04 18:26:17",
          "2017-11-04 18:26:47"
        ),
        class = "factor"
      ),
      Group = structure(c(1L,
                          1L, 1L, 1L, 1L), .Label = "Red", class = "factor")
    ),
    class = "data.frame",
    row.names = c(NA,-5L)
  )


df2 <-
  df %>%
  mutate(DateCreated = as_datetime(df$DateCreated)) %>%
  arrange(DateCreated) %>%
  mutate(diff = DateCreated - lag(DateCreated))

df2$diff[1] <- 0L

g <- 0
df3 <- mutate(df2, date_groups =
                accumulate(df2$diff, function(x, y)
                  if (y - x < 60)
                    g
                  else {
                    g <<- g + 1
                  })) %>%
  group_by(date_groups) %>%
  summarise(
    Status = paste(Status, collapse = ", "),
    DateCreated = DateCreated[1],
    Date_ended = last(DateCreated),
    Group = paste(Group, collapse = ", ")
  )

df3
#> # A tibble: 2 x 5
#>   date_groups Status       DateCreated         Date_ended          Group   
#>         <dbl> <chr>        <dttm>              <dttm>              <chr>   
#> 1           0 Read, Write… 2017-11-04 18:24:55 2017-11-04 18:24:55 Red, Re…
#> 2           1 Read, Write  2017-11-04 18:26:17 2017-11-04 18:26:17 Red, Red

Создано в 2019-01-28 пакетом представ (v0.2.1)

0 голосов
/ 29 января 2019

Я бы сделал что-то подобное:

df %>%
  mutate(DateCreated = ymd_hms(DateCreated))%>%
  group_by(minute(DateCreated))%>%
  arrange(DateCreated)%>%
  summarise(Status = paste(Status,collapse = ", "),DateCreated = DateCreated[1],Date_ended = last(DateCreated),Group = paste(Group,collapse = ", "))
...