如何为足球比赛数据创建连续胜负次数及序列结束标识列
足球比赛连续胜负序列计算方案
原始数据
Team <- rep("A", 10) Match <- 1:10 Outcome <- c("W","W","W","L","L","W","L","W","L","L") mymatch <- data.frame(Team, Match, Outcome)
需求说明
需为数据集新增4列:
win_seq:累计连续获胜次数,球队输球时重置为0loss_seq:累计连续失利次数,球队赢球时重置为0win_end:标记当前记录是否为连胜序列的终点(1表示是,0表示否)loss_end:标记当前记录是否为连败序列的终点(1表示是,0表示否)
期望输出示例:
Team Match Outcome win_seq win_end loss_seq loss_end 1 A 1 W 1 0 0 0 2 A 2 W 2 0 0 0 3 A 3 W 3 1 0 0 4 A 4 L 0 0 1 0 5 A 5 L 0 0 2 1 6 A 6 W 1 1 0 0 7 A 7 L 0 0 1 1 8 A 8 W 1 1 0 0 9 A 9 L 0 0 1 0 10 A 10 L 0 0 2 1
实现代码(R语言)
使用dplyr包处理序列分组与计算,代码如下:
library(dplyr) mymatch_result <- mymatch %>% group_by(Team) %>% # 创建胜负标识列 mutate( is_win = ifelse(Outcome == "W", 1, 0), is_loss = ifelse(Outcome == "L", 1, 0) ) %>% # 按连续胜负分组(rleid函数生成连续相同结果的组ID) mutate(seq_id = data.table::rleid(Outcome)) %>% group_by(Team, seq_id) %>% # 计算连续胜负次数 mutate( win_seq = ifelse(is_win == 1, row_number(), 0), loss_seq = ifelse(is_loss == 1, row_number(), 0) ) %>% ungroup() %>% # 判断序列是否结束:当前结果与下一行结果不同,或为最后一行 mutate( next_outcome = lead(Outcome, default = ""), win_end = ifelse(is_win == 1 & Outcome != next_outcome, 1, 0), loss_end = ifelse(is_loss == 1 & Outcome != next_outcome, 1, 0) ) %>% # 移除中间辅助列 select(-is_win, -is_loss, -seq_id, -next_outcome) # 查看结果 print(mymatch_result)
代码说明
- 分组与标识:先按球队分组,用
is_win/is_loss标记胜负状态; - 连续序列分组:用
data.table::rleid生成连续相同结果的组ID,实现连续胜负的分组; - 连续次数计算:在每个连续序列组内,用
row_number()累计次数,非对应结果的序列置0; - 序列终点判断:通过
lead()获取下一行的结果,若当前结果与下一行不同,或为最后一行,则标记为序列终点; - 清理辅助列:移除中间生成的辅助列,保留目标列。
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

