计算 R 中的平均时间
Calculate Avg Time in R
我的 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)
但得到“0”
关于如何计算 Avg.Start.Time
每 GM
的任何想法?
可以使用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
您需要先将列转换为时间格式,
copy1$Avg.Start.Time <- as.POSIXct(copy1$Avg.Start.Time, format = "%H:%M")
然后您可以使用基数 R 的 aggregate
为每个 GM
得到 mean
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
我们可以使用data.table
library(data.table)
setDT(copy1)[,.(Avg.Start.Time = mean(as.POSIXct(Avg.Start.Time, format = "%M:%S"))) , GM]
我的 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)
但得到“0”
关于如何计算 Avg.Start.Time
每 GM
的任何想法?
可以使用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
您需要先将列转换为时间格式,
copy1$Avg.Start.Time <- as.POSIXct(copy1$Avg.Start.Time, format = "%H:%M")
然后您可以使用基数 R 的 aggregate
为每个 GM
mean
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
我们可以使用data.table
library(data.table)
setDT(copy1)[,.(Avg.Start.Time = mean(as.POSIXct(Avg.Start.Time, format = "%M:%S"))) , GM]