Search code examples
rtimehourminute

Calculate Avg Time in R


My Dataframe called copy1:

    copy1
Source: local data frame [4 x 4]
Groups: GM [2]

      GM Avg.Start.Time Avg.Close.Time Avg.Last.Task.Duration
  (fctr)         (fctr)         (fctr)                  (int)
1   ED          13:15          16:16                    181
2   ED          16:12          17:44                     92
3   LD          15:32          17:27                    115
4   LD          14:38          17:11                    153

I want to calculate Avg.Close.Time Per GM

I have tried:

copy1$Avg.Start.Time <-strptime(copy1$Avg.Start.Time, "%H:%M")
copy1%>%group_by(GM)%>%
        summarise(mean(copy1$Avg.Start.Time,na.rm=T))

But get this:

Error: column 'Avg.Start.Time' has unsupported type : POSIXlt, POSIXt

I have also tried using lubridate:

copy1$Avg.Start.Time <- hm(copy1$Avg.Start.Time)

mean(copy1$Avg.Start.Time,na.rm = T)

But get "0"

Any ideas how can I calculate Avg.Start.Time Per GM?


Solution

  • You can use as.POSIXct to do the conversion, the result of which can be used for mean:

    result <- copy1%>%group_by(GM)%>%
      summarise(mean(as.POSIXct(Avg.Start.Time, format="%M:%S"),na.rm=T))
    

    However, this will add the current date to the time:

    print(result)
    ## A tibble: 2 x 2
    ##      GM mean(as.POSIXct(copy1$Avg.Start.Time,...
    ##  <fctr>                                   <time>
    ##1     ED                      2016-08-24 00:14:54
    ##2     LD                      2016-08-24 00:15:05
    

    As pointed out by the OP, we can format the result to remove the date:

    result <- copy1%>%group_by(GM)%>%
      summarise(Avg.Start.Time=format(mean(as.POSIXct(Avg.Start.Time, format="%M:%S"),na.rm=T), format="%M:%S"))
    ## A tibble: 2 x 2
    ##      GM Avg.Start.Time
    ##  <fctr>          <chr>
    ##1     ED          14:43
    ##2     LD          15:05