我的Dataframe
名为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
我想计算Avg.Close.Time
每GM
我试过了:
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
我也尝试过使用lubridate
:
copy1$Avg.Start.Time <- hm(copy1$Avg.Start.Time)
mean(copy1$Avg.Start.Time,na.rm = T)
但是得到&#34; 0&#34;
任何想法如何计算Avg.Start.Time
每GM
?
答案 0 :(得分: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
答案 1 :(得分:2)
您需要先将列转换为时间格式,
copy1$Avg.Start.Time <- as.POSIXct(copy1$Avg.Start.Time, format = "%H:%M")
然后,您可以使用基础R中的aggregate
为每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
答案 2 :(得分:2)
我们可以使用data.table
library(data.table)
setDT(copy1)[,.(Avg.Start.Time = mean(as.POSIXct(Avg.Start.Time, format = "%M:%S"))) , GM]