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

基于Tidyverse的group_by、arrange与跨列lag操作:体育赛事预测模型中的对手赛事信息查询

获取对手的上一场比赛信息

你已经顺利搞定了获取球队下一个对手的需求,接下来只需要把对手的最近一场(当前比赛之前的)比赛信息关联到原数据里就行。下面是具体的实现步骤和代码:

思路说明

  1. 先确保原数据的排序和next_opp字段正确生成;
  2. 创建一个专门的对手比赛查找表,包含每个球队的所有比赛记录;
  3. 定义一个函数,根据对手名称、当前比赛日期和当前比赛ID,筛选出该对手在当前比赛之前的最近一场比赛;
  4. 将这个函数应用到原数据的每一行,得到对应的对手上一场比赛ID。

完整代码

library(dplyr)
library(purrr)

# 原始数据
game_id_ <- c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6)
game_date_ <- c(rep("2021-01-29", 6), rep("2021-01-30", 6))
team_ <- c("a", "b", "c", "d", "e", "f", "b", "c", "d", "f", "e", "a")
opp_ <- c("b", "a", "d", "c", "f", "e", "c", "b", "f", "d", "a", "e")
df <- data.frame(game_id_, game_date_, team_, opp_)

# 第一步:生成next_opp字段(你已经实现的部分,这里保留确保流程完整)
df <- df %>% 
  arrange(game_date_, game_id_, team_) %>% 
  group_by(team_) %>% 
  mutate(next_opp = lead(opp_, n = 1L)) %>%
  ungroup()  # 取消分组,方便后续操作

# 第二步:创建对手比赛查找表,包含每个球队的所有比赛记录
opponent_games <- df %>%
  select(game_id_, game_date_, team_ = opp_) %>%  # 将opp_转换为team_,统一视角
  arrange(team_, game_date_, game_id_)

# 第三步:定义函数,获取对手的上一场比赛ID
get_opp_last_game <- function(opponent, current_date, current_game_id) {
  opponent_games %>%
    filter(
      team_ == opponent, 
      game_date_ <= current_date, 
      game_id_ != current_game_id  # 排除当前比赛本身
    ) %>%
    arrange(desc(game_date_), desc(game_id_)) %>%  # 按日期和比赛ID倒序,取最近的一场
    slice(1) %>%
    pull(game_id_)
}

# 第四步:将函数应用到原数据的每一行
df <- df %>%
  mutate(opp_last_game_id = pmap_chr(list(next_opp, game_date_, game_id_), get_opp_last_game))

# 查看结果,验证球队a的next_opp(e)的上一场比赛是否为game_id_3
df %>% filter(team_ == "a" & !is.na(next_opp))

结果验证

运行代码后,筛选球队a且next_opp不为空的行,你会看到opp_last_game_id的值为3,完全符合你的预期。

如果需要扩展获取更多对手比赛信息(比如比赛日期、对手的对手等),只需要修改get_opp_last_game函数,返回对应的字段即可。

内容的提问来源于stack exchange,提问作者gav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:42:30