求助:用R语言实现篮球换人数据的阵容迭代更新
解决篮球比赛换人阵容迭代更新问题
你的核心需求是逐行迭代更新场上阵容:用前一行的lineupAfter填充当前行的lineupBefore空值,再替换指定球员得到当前行的lineupAfter。mutate无法实现是因为它按列批量计算,无法传递行间的状态,这里可以用purrr::accumulate来实现逐行状态传递。
解决方案代码
library(tidyverse) # 修正原始数据中的笔误(第一行player_in应为player_6,否则和预期输出不符) df <- tibble(sub_num = c(1,2,3), player_out = c('player_5', 'player_4', 'player_3'), player_in = c('player_6', 'player_7', 'player_8'), lineupBefore = c('player_1, player_2, player_3, player_4, player_5',NA,NA) ) # 定义球员替换函数 replace_player <- function(current_lineup, out_in_pair) { str_replace(current_lineup, out_in_pair$player_out, out_in_pair$player_in) } df_after <- df %>% # 将每行的player_out和player_in打包成列表,供accumulate迭代使用 mutate(out_in_pair = pmap(list(player_out, player_in), ~list(player_out = .x, player_in = .y))) %>% # 生成lineupAfter:以第一行的lineupBefore为初始值,逐行执行替换 mutate(lineupAfter = accumulate(out_in_pair, replace_player, .init = first(lineupBefore))[-1]) %>% # 填充lineupBefore的空值:后续行取上一行的lineupAfter mutate(lineupBefore = if_else(is.na(lineupBefore), lag(lineupAfter), lineupBefore)) %>% # 移除临时辅助列 select(-out_in_pair) # 查看结果 df_after
代码解释
accumulate的作用:它会遍历out_in_pair列表,每次将上一次替换后的阵容作为输入,执行当前行的球员替换,完美实现行间状态传递。.init = first(lineupBefore):指定初始阵容为第一行的lineupBefore,[-1]是去掉初始值对应的多余元素,保证lineupAfter的行数和原数据一致。- 填充
lineupBefore空值:用lag(lineupAfter)获取上一行的最终阵容,补全当前行的lineupBefore。
运行结果
输出与你预期的df_after完全一致:
# A tibble: 3 × 5 sub_num player_out player_in lineupBefore lineupAfter <dbl> <chr> <chr> <chr> <chr> 1 1 player_5 player_6 player_1, player_2, player_3, player_4, player_5 player_1, player_2, player_3, player_4, player_6 2 2 player_4 player_7 player_1, player_2, player_3, player_4, player_6 player_1, player_2, player_3, player_7, player_6 3 3 player_3 player_8 player_1, player_2, player_3, player_7, player_6 player_1, player_2, player_8, player_7, player_6
内容的提问来源于stack exchange,提问作者bonstance13
相关产品推荐
相关产品推荐

