如何基于拳手配对模式在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)
代码解释
- 生成配对标签:通过判断行号奇偶性,将当前行与相邻行拼接成配对字符串,确保每个位置都能标记所属的拳手配对。
- 识别配对切换:对比当前行与上一行的配对标签,标记是否发生配对更换,再用
cumsum()生成连续的组ID,同一配对的所有行归为同一组。 - 计算round值:在每个组内,用整数除法
(row_number() - 1) %/% 2实现每2行递增1次的效果,自然形成0,0,1,1...的模式。
运行代码后得到的round列与预期完全一致。
内容的提问来源于stack exchange,提问作者user22799748
相关产品推荐
相关产品推荐

