求助:足球赛事数据集按自定义时段分组计算平均观众人数
足球赛事时段分组与平均观众数计算方案
现有某赛季约30行的足球赛事赛程数据集,包含变量:
- 比赛日期
- 比赛时间(格式如
7:40pm、3:35pm) - 观众人数
- 主队
- 客队
需要将比赛时间按周五晚、周六下午、周六晚、周日下午、周日晚间自定义分组,并计算每个时段的平均观众人数。以下是具体实现方法:
方法一:基础R实现
1. 转换时间格式,提取小时数
首先把字符串格式的比赛时间转换成可提取小时的格式,方便后续分组:
# 将比赛时间转为时间格式,提取24小时制的小时数 new_data$hour <- as.numeric(strftime(strptime(new_data$比赛时间, "%I:%M%p"), "%H"))
2. 创建自定义时段分组
根据星期几和小时数,给每行数据标记对应的时段:
# 生成时段列,可根据实际赛事时段调整小时阈值 new_data$时段 <- with(new_data, ifelse(Day == "Friday" & hour >= 18, "周五晚", ifelse(Day == "Saturday" & hour >= 12 & hour < 18, "周六下午", ifelse(Day == "Saturday" & hour >= 18, "周六晚", ifelse(Day == "Sunday" & hour >= 12 & hour < 18, "周日下午", ifelse(Day == "Sunday" & hour >= 18, "周日晚间", NA)))) )
注:这里默认下午为12:00-18:00,晚间为18:00及以后,可根据实际需求调整小时范围。
3. 计算各时段平均观众数
用aggregate函数完成分组统计:
# 按时段分组计算平均观众数,忽略NA值 时段平均观众 <- aggregate(Crowd ~ 时段, data = new_data, FUN = mean, na.rm = TRUE) print(时段平均观众)
方法二:tidyverse工具实现(更简洁)
如果习惯用dplyr和lubridate,代码可读性和简洁性更好:
library(dplyr) library(lubridate) # 一站式完成时间转换、分组、统计 时段平均观众 <- new_data %>% # 解析比赛时间,提取小时数 mutate( 时间 = parse_time(比赛时间, "%I:%M%p"), hour = hour(时间) ) %>% # 定义时段分组逻辑 mutate( 时段 = case_when( Day == "Friday" & hour >= 18 ~ "周五晚", Day == "Saturday" & between(hour, 12, 17) ~ "周六下午", Day == "Saturday" & hour >= 18 ~ "周六晚", Day == "Sunday" & between(hour, 12, 17) ~ "周日下午", Day == "Sunday" & hour >= 18 ~ "周日晚间", TRUE ~ NA_character_ ) ) %>% # 分组计算平均观众数 group_by(时段) %>% summarise(平均观众数 = mean(Crowd, na.rm = TRUE)) %>% ungroup() print(时段平均观众)
额外说明
- 如果需要更精确的时段划分(比如按17:30分界),可以把小时数转换成带小数的形式:
hour + minute(时间)/60,再调整阈值 - 不在上述时段的比赛会被标记为NA,可根据需求添加过滤或归为其他组的逻辑
内容的提问来源于stack exchange,提问作者Jimmy_Harrold
相关产品推荐
相关产品推荐

