如何基于game_scores取值从tempo DataFrame指定索引获取对应数据
问题解决:根据比赛场次匹配对应节奏值
现有DataFrame结构
game_scores
Team possessions game_num Duke 65 1 UNC 70 2
tempo
Team g0_tempo g1_tempo Duke 60 63 UNC 64 65
需求目标
根据game_scores里的球队和场次,匹配tempo中对应球队第N场比赛前的节奏值:比如Duke的game_num是1,对应取g0_tempo的60;UNC的game_num是2,对应取g1_tempo的65,逻辑等价于tempo[球队匹配行, 列位置=game_num](示例中对应tempo[1,1])。
原代码问题分析
你提供的代码存在几个问题:
- 变量名不统一:原DataFrame名为
game_scores,代码里写成了game_score;tempo中没有tempo列,只有g0_tempo、g1_tempo这类命名的列 - 索引逻辑错误:直接用向量匹配行索引会导致维度不匹配,且未处理场次与节奏列的对应关系(
game_num为1对应g0_tempo,需要做game_num-1的转换) - 无需使用
mean(),此处只需提取单个匹配值
修正后的实现方案
方法1:基础索引匹配(原生R)
通过遍历每行数据,匹配球队并构造目标列名取值:
# 为game_scores新增tempo_adj列 game_scores$tempo_adj <- mapply(function(team, gn) { # 定位对应球队的行 team_row <- tempo[tempo$Team == team, ] # 构造目标节奏列名:g(gn-1)_tempo target_col <- paste0("g", gn - 1, "_tempo") # 返回对应值 team_row[[target_col]] }, game_scores$Team, game_scores$game_num)
运行后game_scores的结果:
Team possessions game_num tempo_adj Duke 65 1 60 UNC 70 2 65
方法2:数据重塑+合并(tidyverse风格)
如果使用tidyverse工具包,可先将tempo转成长格式再合并,更适合批量处理:
library(tidyverse) # 将tempo从宽格式转成长格式,提取场次索引 tempo_long <- tempo %>% pivot_longer(cols = starts_with("g"), names_to = "game_index", values_to = "tempo_value") %>% mutate(game_index = as.integer(str_extract(game_index, "\\d+"))) # 合并数据,匹配球队且场次索引=game_num-1 game_scores <- game_scores %>% left_join(tempo_long, by = c("Team" = "Team", "game_num" = "game_index")) %>% rename(tempo_adj = tempo_value)
原代码逻辑修正版
如果要基于你最初的代码逻辑调整,修正后代码如下:
game_scores$tempo_adj <- mapply(function(team, gn) { # 找到对应球队的行索引 row_idx <- which(tempo$Team == team) # 计算目标列索引:gn-1 + 2(第1列是Team,g0_tempo为第2列) col_idx <- (gn - 1) + 2 # 返回对应位置的值 tempo[row_idx, col_idx] }, game_scores$Team, game_scores$game_num)
内容的提问来源于stack exchange,提问作者user20576430
相关产品推荐
相关产品推荐

