在R中按赛季和月份分组DataFrame并计算进球统计指标
R 数据分组计算需求
原始数据
我有一个名为df的体育赛事数据框,包含Season、Date、Home、Away、Goals列,示例数据如下:
Season Date Home Away Goals 1 2013 06/04/2013 Arsenal Chelsea 3 2 2013 06/04/2013 Tottenham Newcastle 5 3 2013 10/04/2013 Milan Rangers 4 4 2013 07/05/2013 Real Bayern 1 5 2013 07/05/2013 Juventus Inter 2 6 2013 07/06/2013 Barcelona Chelsea 1 7 2014 03/04/2014 Braga Benfica 3 8 2014 13/04/2014 Rangers Chelsea 1 9 2014 08/05/2014 Bayern Tottenham 0 10 2014 10/05/2014 Newcastle Braga 2
需求说明
需要按赛季-月份分组,完成以下计算:
- 每月所有赛事的总进球数
- 每月场均进球数
- 每赛季场均进球数
- 显示每个赛季对应的月份
期望输出的数据框格式如下:
Season month TotalGoalsMonth AvGoalsMonth AvGoalsSeason 1 2013 4 12 4.0 2.67 2 2013 5 3 1.5 2.67 3 2013 6 1 1.0 2.67 4 2014 4 4 2.0 1.50 5 2014 5 2 2.0 1.50
实现方案
使用dplyr和lubridate包完成操作,步骤如下:
1. 加载所需包
library(dplyr) library(lubridate)
2. 处理日期列,提取月份
将Date列转换为标准日期格式,再提取月份:
df <- df %>% mutate(Date = dmy(Date), # 按日/月/年格式解析日期字符串 month = month(Date))
3. 分组计算指标
按赛季和月份分组计算月度指标,同时计算赛季场均进球并匹配到对应行:
result <- df %>% group_by(Season, month) %>% summarise( TotalGoalsMonth = sum(Goals), AvGoalsMonth = mean(Goals), .groups = "drop_last" # 保留赛季分组,用于后续计算赛季场均 ) %>% mutate(AvGoalsSeason = mean(df$Goals[df$Season == cur_group()$Season])) %>% ungroup() %>% mutate(AvGoalsSeason = round(AvGoalsSeason, 2)) # 保留两位小数
4. 调整格式(可选)
确保月份为整数类型,列顺序与示例一致:
result <- result %>% mutate(month = as.integer(month)) %>% select(Season, month, TotalGoalsMonth, AvGoalsMonth, AvGoalsSeason)
代码说明
dmy(Date):lubridate包的函数,自动识别日/月/年格式的字符串并转换为日期对象group_by(Season, month):按赛季+月份分组,计算月度总进球和场均进球cur_group()$Season:获取当前分组的赛季值,用于筛选对应赛季的所有进球数据计算场均round(...):将赛季场均进球保留两位小数,与示例格式统一
内容的提问来源于stack exchange,提问作者Astral
相关产品推荐
相关产品推荐

