2016-08-24 136 views
2

Dataframe稱爲copy1計算平均時間中的R

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 

我想計算Avg.Close.TimeGM

我曾嘗試:

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

但得到這樣的:

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

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

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

,但得到 「0」

任何想法如何,我可以計算Avg.Start.TimeGM

我也使用lubridate試過嗎?

回答

2

您可以使用as.POSIXct做轉換,其中可用於mean結果:

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

然而,這將當前日期添加到時間:

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 

正如OP所指出的,我們可以通過format去除日期的結果:

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 
+0

感謝它不是一個有效的答案。兩次都返回相同的 – Shery

+0

@Shery:對不起,只是在'summarise'中使用'copy1 $ Avg.Start.Time'而不是'Avg.Start.Time'的錯字。無論如何,其他答案會更好,因爲它會刪除日期。 – aichao

+0

你可以使用'format(format =「%H:%M」)'格式化最後的結尾以及 – Shery

2

你需要先列轉換爲按時間格式,

copy1$Avg.Start.Time <- as.POSIXct(copy1$Avg.Start.Time, format = "%H:%M") 

然後可以使用aggregate從基礎R獲得mean每一個GM

aggregate(Avg.Start.Time~GM, copy1, mean) 

# GM  Avg.Start.Time 
#1 ED 2016-08-24 14:43:30 
#2 LD 2016-08-24 15:05:00 

如果你想在HH:MM格式你可以把它包起來format

aggregate(Avg.Start.Time~GM, copy1, function(x) format(mean(x),format = "%H:%M")) 

# GM Avg.Start.Time 
#1 ED   14:43 
#2 LD   15:05 
+1

謝謝。解決了這個問題 – Shery

2

我們可以使用data.table

library(data.table) 
setDT(copy1)[,.(Avg.Start.Time = mean(as.POSIXct(Avg.Start.Time, format = "%M:%S"))) , GM]