如何基于distance列计算赛车圈数?优先用tidyverse实现
问题:基于行驶距离计算赛车圈数(tidyverse实现)
我有一个记录赛事信息的DataFrame,其中distance列记录了赛车在各时间点的累计行驶距离,数据示例如下:
df <- data.frame(id = rep(c("A"), each = 15), distance = seq(from = 1, to = 20, length.out = 15))
输出结果:
id distance 1 A 1.000000 2 A 2.357143 3 A 3.714286 4 A 5.071429 5 A 6.428571 6 A 7.785714 7 A 9.142857 8 A 10.500000 9 A 11.857143 10 A 13.214286 11 A 14.571429 12 A 15.928571 13 A 17.285714 14 A 18.642857 15 A 20.000000
已知每圈长度为5单位,需要新增lap列标注每个数据点对应的行驶圈数,预期结果如下:
expected_df <- data.frame(id = rep("A", each = 15), distance = seq(from = 1, to = 20, length.out = 15), lap = c(1,1,1,2,2,2,2,3,3,3,3,4,4,4,4))
输出结果:
id distance lap 1 A 1.000000 1 2 A 2.357143 1 3 A 3.714286 1 4 A 5.071429 2 5 A 6.428571 2 6 A 7.785714 2 7 A 9.142857 2 8 A 10.500000 3 9 A 11.857143 3 10 A 13.214286 3 11 A 14.571429 3 12 A 15.928571 4 13 A 17.285714 4 14 A 18.642857 4 15 A 20.000000 4
解决方案(tidyverse实现)
使用dplyr包的mutate()函数结合ceiling()向上取整函数即可实现,核心逻辑是将累计距离除以单圈长度后向上取整,得到当前圈数:
library(tidyverse) # 加载数据 df <- data.frame(id = rep(c("A"), each = 15), distance = seq(from = 1, to = 20, length.out = 15)) # 新增lap列 df <- df %>% mutate(lap = ceiling(distance / 5)) # 查看结果 print(df)
逻辑说明
distance / 5:计算累计距离对应的圈数(含小数)ceiling():对结果向上取整,确保只要距离超过n倍单圈长度(比如超过5),就进入第n+1圈,完全匹配预期的圈数划分规则
多赛车场景适配
如果数据包含多个赛车(多个id),只需添加group_by(id)确保每个赛车单独计算圈数:
df <- df %>% group_by(id) %>% mutate(lap = ceiling(distance / 5)) %>% ungroup()
内容的提问来源于stack exchange,提问作者Cecilia López
相关产品推荐
相关产品推荐

