Найти продолжительность, группируя по идентификатору и другим конкретным c условиям - PullRequest
1 голос
/ 31 марта 2020

Цель:

У меня есть набор данных, df, который я хотел бы сгруппировать по идентификатору и найти продолжительность на основе определенных условий: Focus == True, Read == True, и ID! = ""

ID            Date                   Focus        Read


A             1/2/2020 5:00:00 AM    True         True
A             1/2/2020 5:00:05 AM    True         True
              1/3/2020 6:00:00 AM    True
              1/3/2020 6:00:05 AM    True         
B             1/4/2020 7:00:00 AM    True         True
B             1/4/2020 7:00:02 AM    True         True
B             1/4/2020 7:00:10 AM    True         True

Мне бы хотелось получить такой вывод:

ID                          Duration

A                           5 sec
B                           10 sec

dput:

structure(list(ID = structure(c(2L, 2L, 1L, 1L, 3L, 3L, 3L), .Label = c("", 
"A", "B"), class = "factor"), Date = structure(1:7, .Label = c("1/2/2020 5:00:00 AM", 
"1/2/2020 5:00:05 AM", "1/3/2020 6:00:00 AM", "1/3/2020 6:00:05 AM", 
"1/4/2020 7:00:00 AM", "1/4/2020 7:00:02 AM", "1/4/2020 7:00:10 AM"
), class = "factor"), Focus = structure(c(1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "True ", class = "factor"), Read = structure(c(2L, 
2L, 1L, 1L, 2L, 2L, 2L), .Label = c("", "True "), class = "factor")), class = "data.frame", row.names     = c(NA, 
-7L))

Что я пробовал:

  df %>% group_by(ID)
  mutate(Date = lubridate::mdy_hms(Date), 
     cond = Focus == "TRUE" & Read=="TRUE" & ID != "" , 
     grp = cumsum(!cond)) %>%
 filter(cond) %>%
 group_by(grp) %>%
 summarise(starttime = first(Date), 
        endtime = last(Date), 
        duration = difftime(endtime, starttime, units = "secs")) %>%
 select(-grp)

Однако это не группировка по идентификатору, так как я не вижу этого в своих выходных данных.

Любое предложение приветствуется.

1 Ответ

1 голос
/ 31 марта 2020

Сначала мы можем сделать filter на основе значений «True» в «Read», преобразовать «Date» в класс «Datetime», сгруппированный по «ID», получить «Duration» в виде разницы в секундах. между first и last значением 'Дата'

library(dplyr)
library(lubridate)
df %>% 
   filter(as.logical(trimws(Read)), as.logical(trimws(Focus))) %>%
   mutate(Date = mdy_hms(Date)) %>%
   group_by(ID) %>% 
   summarise(Duration = difftime(last(Date), first(Date), units = "secs"))
# A tibble: 2 x 2
#  ID    Duration
#  <fct> <drtn>  
#1 A      5 secs 
#2 B     10 secs 
...