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

R语言如何筛选sub_off列后续未在sub_on列出现的最后5个值

无挡板篮球赛事最终留场替补筛选实现方案

核心判定规则

最终留在替补席的球员需要同时满足两个条件:

  • 有被换下的记录(即出现在sub_off列中)
  • 被换下之后,再也没有出现在任意后续记录的sub_on列中(即被换下后从未重新上场)

从所有符合上述规则的球员中,按照被换下的时间从晚到早排序,取前5名即为所求结果。

实现步骤

采用倒序遍历的方式处理数据集,避免逐行切片查询后续记录的性能损耗,逻辑如下:

  • 初始化两个存储对象:一个空集合用于记录遍历过程中遇到过的上场球员(即当前遍历行之后所有sub_on出现过的名字),一个空向量用于存储符合要求的最终替补
  • 从数据集最后一行(换人时间最晚的记录)开始,从后往前逐行遍历:
    1. 检查当前行sub_off对应的球员是否存在于上场球员集合中:如果不存在,说明该球员被换下后从未重新上场,将其加入最终替补向量
    2. 将当前行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:16:01