如何在R中基于条件为球员顺序累加比赛数据?
按球员维度累计比赛统计数据的实现方案
假设你已经通过WorldFootballR的fb_player_match_logs()或同类函数拿到了球员单场比赛数据(数据框包含球员唯一标识、比赛日期、进球/助攻等统计字段),可以用以下步骤实现按球员的逐场累计累加:
1. 准备依赖包
先安装并加载dplyr,它能高效处理分组和累计计算:
install.packages("dplyr") # 首次运行需安装 library(dplyr) library(WorldFootballR)
2. 先给数据排好序
累计的前提是比赛按时间顺序排列,否则结果完全错误。按球员ID+比赛日期升序排序:
# 假设你的原始数据框叫player_match_data player_match_data <- player_match_data %>% arrange(player_id, match_date)
3. 分组计算累计值
按球员分组后,用cumsum()对每个统计字段做逐行累计。两种常见需求的实现:
需求A:保留单场数据,新增累计字段
如果要同时查看单场数据和到当前场的累计数据,这么写:
player_cumulative <- player_match_data %>% group_by(player_id, player_name) %>% # 用player_id避免重名球员混淆 mutate( cum_goals = cumsum(goals), cum_assists = cumsum(assists), cum_total_passes = cumsum(total_passes), cum_matches_played = row_number() # 累计参赛场次 # 其他需要累计的字段照着格式添加即可 ) %>% ungroup() # 取消分组,方便后续数据操作
需求B:仅生成累计结果行
如果不需要保留单场数据,只需要到每场为止的累计值,上面的结果已经满足——每行就是对应球员到该场的累计统计数据。
4. 完整示例(单个球员测试)
比如获取梅西2023-2024赛季的比赛数据并计算累计:
# 从FBref获取梅西的比赛日志 messi_logs <- fb_player_match_logs( player_url = "https://fbref.com/en/players/d70ce98e/Lionel-Messi", season_end_year = 2024 ) # 排序+计算累计 messi_cumulative <- messi_logs %>% arrange(Date) %>% # 单个球员无需分组,多球员必须添加group_by(player_id) mutate( cum_goals = cumsum(Gls), cum_assists = cumsum(Ast), cum_minutes_played = cumsum(Min) )
踩坑提醒
- 字段类型要正确:如果某些统计字段是带"-"的字符型(表示0),需要先转换为数值型,例如:
mutate(goals = as.numeric(ifelse(goals == "-", 0, goals))) - 分组用唯一标识:别只用球员姓名,重名球员会导致数据混淆,用
player_id更稳妥 - 排序不能省略:一定要按比赛日期或轮次排序,否则累计逻辑完全错误
内容的提问来源于stack exchange,提问作者Takis
相关产品推荐
相关产品推荐

