Группируйте по идентификатору и сохраняйте разницу во времени(интервалы) в списке

#r #list #grouping #date-difference

Вопрос:

У меня есть данные, отсортированные по дате и времени(по возрастанию), состоящие из идентификатора и соответствующего времени, например:

 ID  |  Time
 1  |  2020-02-09 16:39:58
 2  |  2020-02-19 17:45:25
 1  |  2020-02-09 16:42:25
 1  |  2020-02-09 16:45:34
 2  |  2020-02-19 17:51:05
 1  |  2020-02-09 18:05:25
 

Я хотел бы сгруппироваться по идентификатору, а затем создать список, соответствующий каждому идентификатору, с разницей во времени между интервалами в минутах для этой группы, например:

  ID  |  Time_interval
  1  |  [3,3,80]
  2  |  [6]
 

Самое близкое, к чему я пришел, чтобы решить эту проблему, — это:

 df = d %>% group_by(ID) %>% mutate(Time_interval = Time - lag(Time))
 

но это не дает мне списка, это создает отдельный столбец с задержкой.

Ответ №1:

Используется summarise для хранения данных в списке.

 library(dplyr)

d %>% 
  group_by(ID) %>% 
  summarise(Time_interval = list(as.numeric(na.omit(round(difftime(Time, 
                                 lag(Time), units = 'mins')))))) -> result

result
# A tibble: 2 x 2
#     ID Time_interval
#  <int> <list>       
#1     1 <dbl [3]>    
#2     2 <dbl [1]>    

result$Time_interval

#[[1]]
#[1]  2  3 80

#[[2]]
#[1] 6
 

данные

 d <- structure(list(ID = c(1L, 2L, 1L, 1L, 2L, 1L), Time = structure(c(1581266398, 
1582134325, 1581266545, 1581266734, 1582134665, 1581271525), class = c("POSIXct", 
"POSIXt"), tzone = "UTC")), row.names = c(NA, -6L), class = "data.frame")