You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言使用cumsum扩展数据框 补全F1领奖台车手赛事记录

F1赛事领奖台数据补全简便实现方案

核心处理逻辑不需要复杂的自定义函数,按赛事时序逐站补全记录即可,10行左右代码就能搞定,适配全量F1历史数据的处理效率。

实现思路

  • 先将原始数据按Race number(赛事编号)从小到大排序,保证时序正确
  • 逐站提取当前赛事的原始前三名记录
  • 对每一站,筛选出所有在本站之前拿到过领奖台、且未进入本站前三名的车手,将这类车手的记录补充到当前站:
    • Position字段统一赋值为NA
    • Number of Career Podiums字段取该车手截至前一站的最新累计值,避免计数错误
  • 合并每站的原始记录和补充记录,得到最终数据集,可直接用于竞速条形图制作

R语言(tidyverse)实现代码

假设你的原始数据框命名为f1_raw,运行以下代码即可得到目标结果:

library(tidyverse)

# 按赛事时序排序原始数据
f1_sorted <- f1_raw %>% arrange(`Race number`)

# 逐站补全记录
f1_final <- map_dfr(unique(f1_sorted$`Race number`), function(race_id){
  # 提取本站原始前三名记录
  current_records <- f1_sorted %>% filter(`Race number` == race_id)
  # 提取此前所有领奖台车手的最新累计数据,排除本站已在榜的车手
  supplement_records <- f1_sorted %>%
    filter(`Race number` < race_id) %>%
    group_by(Driver) %>%
    slice_max(`Race number`, n = 1) %>% # 取每个车手最近一次的累计领奖台数
    ungroup() %>%
    filter(!Driver %in% current_records$Driver) %>%
    mutate(Position = NA_integer_, `Race number` = race_id)
  # 合并返回本站全量记录
  bind_rows(current_records, supplement_records)
})

适配调整说明

  • 如果原始数据中Number of Career Podiums字段未预先计算,可在排序步骤后加一行累计计算代码即可:
    f1_sorted <- f1_sorted %>%
      group_by(Driver) %>%
      mutate(`Number of Career Podiums` = row_number()) %>%
      ungroup()
    
  • 若使用Python pandas实现,逻辑完全一致:按赛事编号排序后遍历每个赛事ID,分别筛选当前站记录、历史补录记录后拼接即可,处理逻辑无差异。
  • 输出结果默认按赛事编号排序,无需额外清洗即可直接传入gganimate等工具制作racing bar chart。

内容的提问来源于stack exchange,提问作者LegatusDivintus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:06:24