2016-08-24 137 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]