You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:01:54