Расчет времени, прошедшего в сгруппированных наборах строк - PullRequest
0 голосов
/ 04 января 2019

Я знаю, что есть много страниц со стековым потоком, спрашивающих о расчете разницы между датами и строками, но я не нашел ни одной, которая отвечала бы на мой конкретный вопрос. Большинство интересуются данными между последовательными строками, но мне нужно рассчитать для ряда людей, сколько времени прошло для каждого человека. Например

id      time (of the day)
1       12:00:40
1       12:06:35
1       12:12:00
2       14:59:22
2       15:10:40

Я бы хотел рассчитать что-то похожее на это:

   id      total time (seconds)
    1       760
    2       678

Заранее спасибо за помощь, и я прошу прощения, если на этот вопрос ответили где-то еще, я не смог найти его.

Ответы [ 2 ]

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

Полный базовый подход R

aggregate(time~id, transform(df, time = as.POSIXct(time, format = "%H:%M:%S")), 
                   function(x) sum(as.numeric(diff(x), "secs")))

#  id time
#1  1  680
#2  2  678

Используя dplyr и lubridate, мы сначала конвертируем time в Period класс и конвертируем его в секунды и получаем sum его разности.

library(dplyr)
library(lubridate)

df %>%
  group_by(id) %>%
  summarise(total_time = sum(diff(seconds(hms(time)))))


#    id   total_time
#   <int>      <dbl>
#1     1        680
#2     2        678
0 голосов
/ 04 января 2019

data.table подход

Сначала установите временную строку в формат POSIXct, чтобы вы могли использовать такие функции, как difftime. Это очень удобно, если у идентификатора был промежуток времени более 1 дня (например, с 22 до 02 ч) Второй шаг - рассчитать разницу времени (в секундах) между минимальным значением времени и максимальным значением времени (по id-группе)

library( data.table )

dt <- fread("id      time
1       12:00:40
1       12:06:35
1       12:12:00
2       14:59:22
2       15:10:40", header = TRUE)

#set time to POSIXct
dt[, time := as.POSIXct( paste0( "2019-01-01 ", time ), format = "%Y-%m-%d %H:%M:%S" ) ]
dt[, .( total_time = difftime( max( time ), min( time ), units = "secs" )), by = .( id ) ]

#    id total_time
# 1:  1   680 secs
# 2:  2   678 secs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...