Как я могу рассчитать продолжительность времени для заданных временных точек в R

Я пытаюсь найти посылку или R code это может помочь рассчитать продолжительность различных временных точек для нескольких субъектов.

Вот как выглядят данные

------------------------------------
SubjectID     | Task      |Duration
------------------------------------
A             |Cleaning   |0:10:01
A             |Cleaning   |2:33:54
A             |Carpeting  |0:16:16
A             |Carpeting  |0:19:23
A             |Painting   |0:20:16
B             |Cleaning   |1:45:60
B             |Carpeting  |0:15:01
B             |Painting   |1:15:10
B             |Painting   |0:15:60
C             |Carpeting  |1:16:16
C             |Cleaning   |0:20:16
C             |Painting   |0:30:10
-------------------------------------

Я хочу получить этот стол

-----------------------------------------------------------------------------------
SubjectID |Number      |Number       |Number        |Total number   |Duration  |
          |of Cleaning |of Carpeting |of Painting   | of Tasks      |in hours  |
-----------------------------------------------------------------------------------
A         |  2         |      2      |      1       |    5          | 3:33:11  |
B         |  1         |      1      |      2       |    4          | 3:52:18  |
C         |  1         |      1      |      1       |    3          | 2:10:07  |
-----------------------------------------------------------------------------------

Вы знаете пакет или подход, который может помочь мне получить таблицу 2?

2 ответа

Решение

Для работы со временем и датами lubridate пакет довольно популярен и хорошо работает с другими частями tidyverse нравиться dplyrот Гонсало выше. Существует ряд функций для преобразования строк в даты или время, а затем в длительности и периоды, которые можно суммировать.

Вот пример для вашего случая, используя hms(), periods_to_seconds(), а также as.duration().

library(tidyverse)

# Need to load lubridate explicitly, even though it's part of tidyverse
library(lubridate) 
duration_strings <- c("0:10:01", "2:33:54", "0:16:16")

# Convert strings to times, then from times to seconds.
secs <- period_to_seconds(hms(duration_strings))
secs

# Convert strings to times, and then to duration objects
durations <- as.duration(hms(duration_strings))
durations

Вывод в виде секунд или продолжительности будет напечатан по-разному, но в любом случае они будут суммировать и дать вам общую продолжительность времени.

> secs
[1]  601 9234  976

> durations
[1] "601s (~10.02 minutes)" "9234s (~2.56 hours)"   "976s (~16.27 minutes)"

Если вам нужна окончательная сумма, отформатированная в том же формате HH:MM:SS, вам, возможно, придется проделать несколько дополнительных приемов, как показано здесь: Можно ли напечатать продолжительность в формате HH:MM:SS?

Вот и все:

library(dplyr)
Data_pivot <- Data %>% group_by(SubjectID) %>% summarise(number = n()
                                                   ,cleaning = sum(case_when(Task == 'Cleaning' ~ 1 
                                                                         ,TRUE ~ 0))
                                                   ,Carpeting = sum(case_when(Task == 'Carpeting' ~ 1 
                                                                             ,TRUE ~ 0))
                                                   ,Painting = sum(case_when(Task == 'Painting' ~ 1 
                                                                            ,TRUE ~ 0))
                                                   ,duration = sum(Duration)) 
Другие вопросы по тегам