Подведение итогов - PullRequest
2 голосов
/ 20 марта 2019

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

workerID   worked_hours
02         08H30M00S
02         08H00M00S    
03         08H00M00S
03         05H40M00S

То, чего я хочу достичь, это как сумма часов, отработанных работником ID. И я также хочу, чтобы он был в формате ЧЧ: ММ: СС, даже если часы превышают 24, я не хочу, чтобы у него был день, а вместо этого часы накапливались до более чем 24. Я пытался работать с

df %>%
 group_by(workerID) %>% 
 summarise(sum(worked_hours))

но это возвращает 0.

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Вы можете использовать пакет lubridate, который немного облегчает работу со временем. В вашем случае нам нужно сначала преобразовать класс hms (часы-минуты), сгруппировать по идентификатору работника и взять sum. Однако, чтобы получить его в формате HH:MM:SS, нам необходимо преобразовать его в период, т.е.

library(tidyverse)
library(lubridate)

df %>% 
 mutate(new = as.duration(hms(worked_hours))) %>% 
 group_by(workerID) %>% 
 summarise(sum_times = sum(new)) %>% 
 mutate(sum_times = seconds_to_period(sum_times))

, что дает,

# A tibble: 2 x 2
   workerID sum_times   
     <int> <S4: Period>
1        2 16H 30M 0S  
2        3 13H 40M 0S
0 голосов
/ 20 марта 2019

Существует также базовое решение R. Я добавил строку, чтобы превысить минуты и часы.

  workerID worked_hours
1        2    08H30M00S
2        2    08H00M00S
3        3    08H00M00S
4        3    05H40M00S
5        2    09H45M00S

Мы можем разделить worked_hours по символам, а затем агрегировать по идентификатору работника После этого нам нужно вычесть полные часы из минут. Наконец мы свернем время с :.

p <- cbind(p[1], do.call(rbind, lapply(strsplit(p$worked_hours, "\\D"), as.numeric)))
p <- aggregate(. ~ workerID, p, sum)
p$`1` <- p$`1` + floor(p$`2` / 60)
p$`2` <- p$`2` %% 60
p[-1] <- lapply(p[-1], function(x) sprintf("%02d", x))  # to always have two digits
cbind(p[1], worked_hours=apply(p[-1], 1, function(x) paste(x, collapse=":")))
#   workerID worked_hours
# 1        2     26:15:00
# 2        3     13:40:00

Данные

p <- structure(list(workerID = c("2", "2", "3", "3", "2"), worked_hours = c("08H30M00S", 
    "08H00M00S", "08H00M00S", "05H40M00S", "09H45M00S")), row.names = c(NA, 
    -5L), class = "data.frame")
...