R语言使用cumsum扩展数据框 补全F1领奖台车手赛事记录
F1赛事领奖台数据补全简便实现方案
核心处理逻辑不需要复杂的自定义函数,按赛事时序逐站补全记录即可,10行左右代码就能搞定,适配全量F1历史数据的处理效率。
实现思路
- 先将原始数据按
Race number(赛事编号)从小到大排序,保证时序正确 - 逐站提取当前赛事的原始前三名记录
- 对每一站,筛选出所有在本站之前拿到过领奖台、且未进入本站前三名的车手,将这类车手的记录补充到当前站:
Position字段统一赋值为NANumber 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
相关产品推荐
相关产品推荐

