Сгруппируйте, затем создайте 'break', если datetime превышает определенное время, создавая новое значение в исходном сгруппированном столбце (R, dplyr) - PullRequest
2 голосов
/ 31 января 2020

У меня есть набор данных, df,

  Subject      Folder     Message    Date
  A            Out                   9/9/2019 5:46:38 PM
  A            Out                   9/9/2019 5:46:40 PM
  A            Out                   9/9/2019 5:46:42 PM
  A            Out                   9/9/2019 5:46:43 PM
  A            Out                   9/9/2019 9:30:00 PM
  A            Out                   9/9/2019 9:30:01 PM
  B            Out                   9/9/2019 9:35:00 PM
  B            Out                   9/9/2019 9:35:01 PM

Я пытаюсь сгруппировать это по теме, найти продолжительность и создать новый столбец Продолжительность. Я также sh создаю порог, если время Дата превышает определенное количество времени. Моя дилемма в том, что в группе А время идет с 5:46 в 4-м ряду до 9:30 в 5-м ряду. Это дает неточную продолжительность в Группе А. Я '1013 *' смогу "разбить" это время и найти новую продолжительность, создавая новое значение (А1) в Предмете, когда время превышает 10 минут. Я не уверен, должен ли я использовать al oop для этого?

 Subject   Duration   Group
 A         5 sec      outdata1
 A1        1 sec      outdata2
 B         1 sec      outdata3

Вот мой dput:

structure(list(Subject = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L), .Label = c("A", "B"), class = "factor"), Folder = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Out", class = "factor"), 
Message = c("", "", "", "", "", "", "", ""), Date = structure(1:8, .Label = c("9/9/2019 5:46:38 PM", 
"9/9/2019 5:46:40 PM", "9/9/2019 5:46:42 PM", "9/9/2019 5:46:43 PM", 
"9/9/2019 9:30:00 PM", "9/9/2019 9:30:01 PM", "9/9/2019 9:35:00 PM", 
"9/9/2019 9:35:01 PM"), class = "factor")), row.names = c(NA, 
-8L), class = "data.frame")

Это то, что я пробовал:

thresh <- duration(10, units = "minutes")

df %>%  
mutate(Date = mdy_hms(Date)) %>% 
transmute(Subject, Duration = diff = difftime(as.POSIXct(Date, format = 
"%m/%d/%Y %I:%M:%S %p"),as.POSIXct(Date, 
format = "%m/%d/%Y %I:%M:%S %p" ), units = "secs")) %>% 
ungroup %>% 
distinct %>% 
mutate(grp = str_c("Outdata", row_number()))

 mutate(delta = if_else(grp < thresh1, grp, NA_real_))

1 Ответ

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

Мы можем вычислить длительность между последовательными значениями Date, чтобы создать новую группу, а затем вычислить разницу во времени между min и max в каждой группе.

library(dplyr)
thresh <- 10

df %>%  
  mutate(Date = as.POSIXct(Date, format = "%m/%d/%Y %I:%M:%S %p")) %>%
  group_by(Subject, Group = cumsum(difftime(Date, 
            lag(Date, default = first(Date)), units = "mins") > thresh)) %>%
  summarise(Duration = difftime(max(Date), min(Date), units = "secs")) %>%
  ungroup %>%
  mutate(Group = paste0('outdata', row_number()))

# A tibble: 3 x 3
#  Subject Group    Duration
#  <fct>   <chr>    <drtn>  
#1 A       outdata1 5 secs  
#2 A       outdata2 1 secs  
#3 B       outdata3 1 secs  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...