在R中实现排序后数据的连续统计(球员投篮场景)
用dplyr高效实现球员累计投篮统计
你不需要逐行遍历数据集,R的dplyr包提供了简洁的分组累计计算方案,完美匹配你的需求:
核心思路
因为你的数据已经按时间顺序排列,只需按球员分组,用窗口函数计算每个球员到当前记录的累计投篮尝试次数和命中次数即可。
具体实现步骤
- 加载
dplyr包(如果未安装先执行install.packages("dplyr")) - 对数据集按球员分组,用
mutate新增两个统计字段
示例代码
首先构造一个符合你描述的模拟数据集:
library(dplyr) # 模拟赛事历史数据 game_data <- tibble( GAME_ID = c(1,1,1,2,2,3,3,3), EVENT_ID = 1:8, EVENT_TYPE = c("MADE_SHOT", "MISSED_SHOT", "MADE_SHOT", "MISSED_SHOT", "MADE_SHOT", "MADE_SHOT", "MISSED_SHOT", "MADE_SHOT"), PLAYER_ID = c(22,25,22,22,25,25,22,25) )
然后计算累计统计字段:
result_data <- game_data %>% # 按球员分组,确保统计是针对单个球员的累计 group_by(PLAYER_ID) %>% mutate( # 累计投篮尝试次数:分组内的行号(因数据已按时间排序) SHOTS_ATTEMPTED = row_number(), # 累计命中次数:将命中事件转为1,未命中转为0后累计求和 SHOTS_MADE = cumsum(ifelse(EVENT_TYPE == "MADE_SHOT", 1, 0)) ) %>% # 取消分组,恢复普通数据框结构 ungroup() # 查看结果 print(result_data)
输出结果
# A tibble: 8 × 6 GAME_ID EVENT_ID EVENT_TYPE PLAYER_ID SHOTS_ATTEMPTED SHOTS_MADE <dbl> <int> <chr> <dbl> <int> <int> 1 1 1 MADE_SHOT 22 1 1 2 1 2 MISSED_SHOT 25 1 0 3 1 3 MADE_SHOT 22 2 2 4 2 4 MISSED_SHOT 22 3 2 5 2 5 MADE_SHOT 25 2 1 6 3 6 MADE_SHOT 25 3 2 7 3 7 MISSED_SHOT 22 4 2 8 3 8 MADE_SHOT 25 4 3
额外说明
如果你的原始数据排序存在不确定性,可在分组前先按赛事和事件ID排序,确保时间顺序正确:
result_data <- game_data %>% arrange(GAME_ID, EVENT_ID) %>% group_by(PLAYER_ID) %>% mutate(...) %>% ungroup()
内容的提问来源于stack exchange,提问作者LesGrossman
相关产品推荐
相关产品推荐

