在R中将因子类型的F1圈速转换为带小数的时间格式求助
解决F1圈速数据(mm:ss.000格式)转换为数值类型的方案
我完全懂你遇到的这个问题——这种mm:ss.000格式的圈速数据确实没法直接用常规的时间函数转换,因为它不是完整的日期时间格式,而是纯时长。下面给你两种简单可靠的解决方案,转成总秒数后就能正常用ggplot绘图了!
先构造示例数据(和你的样本一致)
先把你的数据还原出来,方便测试:
f1_data <- data.frame( DriverId = c(1, 20), Q1 = factor(c("1:05.585", "1:04.655")), Q2 = factor(c("1:04.772", "1:07.354")), Q3 = factor(c("1:04.293", "1:04.123")) )
方法一:Base R 自定义函数(无需额外包)
核心思路是把字符串拆成分钟和秒两部分,计算总秒数:
# 自定义转换函数 convert_laptime_to_seconds <- function(laptime) { # 拆分分钟和秒(把factor转成字符后拆分) time_parts <- strsplit(as.character(laptime), ":") # 分钟转秒 + 秒数部分,返回数值 sapply(time_parts, function(x) as.numeric(x[1])*60 + as.numeric(x[2])) } # 把Q1/Q2/Q3列批量转换 f1_data[, c("Q1", "Q2", "Q3")] <- lapply(f1_data[, c("Q1", "Q2", "Q3")], convert_laptime_to_seconds) # 检查转换结果,现在都是numeric类型了! str(f1_data)
方法二:用lubridate包(更简洁)
lubridate专门处理时间相关数据,它的ms()函数可以直接识别mm:ss.ms格式,再转成总秒数:
library(lubridate) # 转换函数 convert_laptime_lubridate <- function(laptime) { # ms()把字符串转成时长对象,period_to_seconds转成总秒数 period_to_seconds(ms(as.character(laptime))) } # 批量转换列 f1_data[, c("Q1", "Q2", "Q3")] <- lapply(f1_data[, c("Q1", "Q2", "Q3")], convert_laptime_lubridate)
验证转换结果
转换后的数据应该是这样的,都是可用于分析的数值:
print(f1_data) # DriverId Q1 Q2 Q3 # 1 1 65.585 64.772 64.293 # 2 20 64.655 67.354 64.123
用ggplot绘图示例
现在数据是数值类型了,随便怎么画都没问题,比如画车手在不同排位赛阶段的圈速对比:
library(ggplot2) library(tidyr) # 先转成长格式(ggplot偏好长数据) f1_long <- pivot_longer(f1_data, cols = Q1:Q3, names_to = "Session", values_to = "Laptime") # 绘制点图对比 ggplot(f1_long, aes(x = Session, y = Laptime, color = factor(DriverId))) + geom_point(size = 3) + labs(title = "F1 Qualifying Laptimes", x = "排位赛阶段", y = "圈速(秒)", color = "车手ID") + theme_minimal()
为什么之前的方法没用?
as.numeric()直接转factor:只会把factor的水平编号转成数值,完全不是你要的圈速值;- chron/POSIXlt:这两个包是处理带日期的完整时间(比如yyyy-mm-dd hh:mm:ss),而你的数据是纯时长,不在它们的处理范围内,所以转换失败很正常。
内容的提问来源于stack exchange,提问作者Raul Gonzales
相关产品推荐
相关产品推荐

