R语言如何筛选sub_off列后续未在sub_on列出现的最后5个值
无挡板篮球赛事最终留场替补筛选实现方案
核心判定规则
最终留在替补席的球员需要同时满足两个条件:
- 有被换下的记录(即出现在
sub_off列中) - 被换下之后,再也没有出现在任意后续记录的
sub_on列中(即被换下后从未重新上场)
从所有符合上述规则的球员中,按照被换下的时间从晚到早排序,取前5名即为所求结果。
实现步骤
采用倒序遍历的方式处理数据集,避免逐行切片查询后续记录的性能损耗,逻辑如下:
- 初始化两个存储对象:一个空集合用于记录遍历过程中遇到过的上场球员(即当前遍历行之后所有
sub_on出现过的名字),一个空向量用于存储符合要求的最终替补 - 从数据集最后一行(换人时间最晚的记录)开始,从后往前逐行遍历:
- 检查当前行
sub_off对应的球员是否存在于上场球员集合中:如果不存在,说明该球员被换下后从未重新上场,将其加入最终替补向量 - 将当前行
sub_on对应的球员加入上场球员集合(重复值不影响集合判断逻辑)
- 检查当前行
- 遍历完成后,最终替补向量本身就是按被换下时间从晚到早排列的,直接取前5个值即可得到结果。
R语言实现代码
# 加载示例数据 df <- data.frame( sub_off = c('Alexia', 'Amy', 'Jorja', 'Lucy', 'Claire', 'Cassie', 'Khloe', 'Georgia'), sub_on = c('Jorja', 'Sophie', 'Cassandra', 'Jane', 'Khloe', 'Alexia', 'Claire', 'Khloe'), time = c(750, 770, 800, 820, 820, 850, 890, 895) ) # 初始化存储对象 on_court_later <- c() final_bench <- c() # 倒序遍历 for (i in nrow(df):1) { current_off <- df$sub_off[i] current_on <- df$sub_on[i] # 判断当前被换下球员是否后续没再上场 if (!current_off %in% on_court_later) { final_bench <- c(final_bench, current_off) } # 把当前换上的球员加入后续上场集合 on_court_later <- unique(c(on_court_later, current_on)) } # 取最后留场的5名替补 result <- head(final_bench, 5) print(result)
运行上述代码对示例数据处理,输出结果为[1] "Georgia" "Cassie" "Lucy" "Jorja" "Amy",和预期结果完全一致。
注:如果存在同一时间点的多笔换人记录,只需要提前保证同时间点的记录顺序和赛事实际换人顺序一致即可,逻辑不需要调整。
内容的提问来源于stack exchange,提问作者J_sdata
相关产品推荐
相关产品推荐

