如何按team_id排序DataFrame并计算球队连续胜负场次
用R实现球队连续胜负场次计算
这问题我熟,用dplyr就能轻松搞定,我给你一步步拆解实现过程,完全符合你的需求:
第一步:数据准备与排序
先把你的原始数据转换成DataFrame,然后按team_id排序,把同一球队的所有记录放在一起:
# 加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) # 你的原始数据 team_id <- c("Minnesota", "Dallas", "Minnesota", "Chicago", "Brooklyn", "Cleveland", "Washington","Minnesota", "Dallas") team_outcome <- c("win","loss","loss","win","win","loss","win","loss","win") # 转成DataFrame并按team_id排序 df <- data.frame(team_id, team_outcome) %>% arrange(team_id)
第二步:计算连续胜负场次
通过分组标记连续相同结果的批次,再生成递增序号并根据胜负赋予正负值:
df <- df %>% # 按球队分组 group_by(team_id) %>% # 标记连续相同比赛结果的分组(比如连续的win是一组,连续loss是另一组) mutate(streak_group = consecutive_id(team_outcome)) %>% # 按球队+连续分组,生成组内递增序号 group_by(team_id, streak_group) %>% mutate(streak = row_number()) %>% # 给胜负场次赋正负:win为正,loss为负 mutate(streak = ifelse(team_outcome == "win", streak, -streak)) %>% # 移除临时分组列 select(-streak_group) %>% # 取消分组 ungroup()
最终效果
运行完上面的代码后,你的DataFrame会新增一列streak,完全符合你的要求:
- 连续获胜时,值依次为1、2、3...
- 连续失利时,值依次为-1、-2、-3...
比如查看Minnesota球队的记录:
Minnesota | win | 1
Minnesota | loss | -1
Minnesota | loss | -2
兼容旧版本R的方案
如果你的R版本低于4.1.0(没有consecutive_id()函数),可以用data.table包的rleid()函数实现,代码如下:
# 先安装并加载data.table install.packages("data.table") library(data.table) df <- as.data.table(df) df <- df[order(team_id)] %>% .[, streak_group := rleid(team_outcome), by = team_id] %>% .[, streak := row_number(), by = .(team_id, streak_group)] %>% .[, streak := ifelse(team_outcome == "win", streak, -streak)] %>% .[, streak_group := NULL] %>% as.data.frame()
内容的提问来源于stack exchange,提问作者Ivana Bogicevic
相关产品推荐
相关产品推荐

