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

如何基于拳手配对模式在R语言中生成round列?

问题解决:生成拳手配对的Round列

问题描述

现有一组交替出现的拳手名称向量:

Database <- c("Fighter A", "Fighter B", "Fighter A", "Fighter  B",
              "Fighter A", "Fighter B", "Fighter A", "Fighter B",
              "Fighter  C", "Fighter  D", "Fighter  C", "Fighter  D", 
              "Fighter  A", "Fighter C")

需要添加一个round列,规则如下:

  • 同一拳手配对(如Fighter A与Fighter B)重复出现时,round按0,0,1,1,2,2...的模式递增
  • 配对更换时(如切换为Fighter C与Fighter D),round重置为0

预期的round列结果:

round = c(0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 0, 0)

用户尝试的代码未达到预期:

fighters_name <- c("Combattant A", "Combattant B", "Combattant A", "Combattant B",
                   "Combattant A", "Combattant B", "Combattant A", "Combattant B",
                   "Combattant C", "Combattant D", "Combattant C", "Combattant D", 
                   "Combattant A", "Combattant C")

df <- tibble(fighters_name)

df <- df %>%
  mutate(pair_id = cumsum(fighters_name != lag(fighters_name, default = fighters_name[1]))) %>%
  group_by(pair_id) %>%
  mutate(round = (row_number() - 1) %% 2) %>%
  ungroup() %>%
  select(-pair_id)

解决方案

核心思路是先识别连续的配对组,再在每个组内按每2行递增一次round值。以下是修正后的代码:

library(tidyverse)

# 原始数据
fighters_name <- c("Fighter A", "Fighter B", "Fighter A", "Fighter  B",
                   "Fighter A", "Fighter B", "Fighter A", "Fighter B",
                   "Fighter  C", "Fighter  D", "Fighter  C", "Fighter  D", 
                   "Fighter  A", "Fighter C")

df <- tibble(fighters_name)

df <- df %>%
  # 生成配对标签:每两个连续拳手为一组,标记当前行所属配对
  mutate(
    pair = ifelse(row_number() %% 2 == 1, 
                  paste(fighters_name, lead(fighters_name), sep = "-"),
                  paste(lag(fighters_name), fighters_name, sep = "-"))
  ) %>%
  # 识别配对切换,生成组ID
  mutate(
    pair_change = pair != lag(pair, default = pair[1]),
    group_id = cumsum(pair_change)
  ) %>%
  # 按组计算round值,每2行递增1次
  group_by(group_id) %>%
  mutate(round = (row_number() - 1) %/% 2) %>%
  ungroup() %>%
  # 移除中间辅助列(可选)
  select(-pair, -pair_change, -group_id)

# 查看结果
print(df$round)

代码解释

  1. 生成配对标签:通过判断行号奇偶性,将当前行与相邻行拼接成配对字符串,确保每个位置都能标记所属的拳手配对。
  2. 识别配对切换:对比当前行与上一行的配对标签,标记是否发生配对更换,再用cumsum()生成连续的组ID,同一配对的所有行归为同一组。
  3. 计算round值:在每个组内,用整数除法(row_number() - 1) %/% 2实现每2行递增1次的效果,自然形成0,0,1,1...的模式。

运行代码后得到的round列与预期完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:17:26