首页 > 解决方案 > Rstudio 时间总和计算

问题描述

如何在 R 中求和每个驱动程序的总时间?有人能帮我吗?

在此处输入图像描述

总时间 首选最终结果

标签: r

解决方案


提出一项建议:请不要使用图像来共享数据。相反,使用dput()您的数据框。请参阅这篇关于在 SO 上制作可重现示例的帖子。

一种方法涉及tidyverselubridate包(我相信还有其他解决方案)。

首先,将您的数据放入长格式而不是宽格式。然后将时间从%H:%M:%OS(以毫秒为单位)转换为自午夜以来的持续时间。

然后,对于每个驱动程序,汇总这些时间,并以不同的格式提供结果:

  1. total_time1- 总秒数(带小数位)
  2. total_time2- 分钟数 (M) 和小数秒数 (S)
  3. total_time3- 格式的总时间%M:%OS(分钟和小数秒)

编辑:此外,我根据 OP 请求添加了两列:

  1. total_time_minutes- 总分钟数(带小数位)
  2. avg_speed- 以公里/小时为单位的平均速度,假设为 27.004,65 米

我希望这是有帮助的。请告诉我。

library(tidyverse)
library(lubridate)

df %>%
  pivot_longer(cols = -lap) %>%
  mutate(lap_time = as.numeric(as.POSIXct(value, format = "%H:%M:%OS", tz = "UTC")) -
           as.numeric(as.POSIXct(Sys.Date(), tz = "UTC"))) %>%
  group_by(name) %>%
  summarise(total_time1 = sum(lap_time)) %>%
  mutate(total_time2 = seconds_to_period(total_time1),
         total_time3 = sprintf("%d:%.4f", minute(total_time2), second(total_time2)),
         total_time_minutes = total_time1/60,
         avg_speed = 3.6 * 27004.65/total_time1) %>%
  as.data.frame()

输出

        name total_time1          total_time2 total_time3 total_time_minutes avg_speed
1     Bottas     319.782 5M 19.7815999984741S   5:19.7816            5.32969   304.010
2   Hamilton     320.320 5M 20.3204002380371S   5:20.3204            5.33867   303.498
3    Leclerc     319.981   5M 19.98140001297S   5:19.9814            5.33302   303.820
4 Verstappen     318.220  5M 18.219899892807S   5:18.2199            5.30366   305.502
5     Vettel     318.625 5M 18.6247997283936S   5:18.6248            5.31041   305.114

数据

df <- structure(list(lap = 1:5, Bottas = c("00:01:04.9388", "00:01:03.7164", 
"00:01:04.0028", "00:01:03.3424", "00:01:03.7812"), Hamilton = c("00:01:04.5280", 
"00:01:03.7524", "00:01:03.9632", "00:01:04.3712", "00:01:03.7056"
), Leclerc = c("00:01:04.9812", "00:01:03.7740", "00:01:04.6026", 
"00:01:03.3920", "00:01:03.2316"), Verstappen = c("00:01:04.1704", 
"00:01:03.7383", "00:01:03.7128", "00:01:02.8460", "00:01:03.7524"
), Vettel = c("00:01:04.3632", "00:01:02.8244", "00:01:03.7164", 
"00:01:03.8532", "00:01:03.8676")), class = "data.frame", row.names = c(NA, 
-5L))

推荐阅读