如何基于现有排名变量生成马拉松选手的实际排名新变量
马拉松并列跳跃排名实现方案
你需要的是标准竞赛排名(跳跃式排名),核心计算逻辑为:当前排名段的实际起始排位 = 前面所有排名段的总人数 + 1,同排名段选手排位完全一致。和你举例的规则完全匹配:
原排名1共5人 → 实际排位统一为1
原排名2共4人 → 实际排位统一为5+1=6
原排名3共9人 → 实际排位统一为5+4+1=10
以下是不同常用工具的实现方案:
Excel实现
假设原排名存储在A列,A1为表头原排名,A2开始为选手数据:
- 第一步:选中A列所有数据,按升序排序
- 第二步:新增辅助列B列统计每个原排名的人数,B2输入公式
=COUNTIF(A:A,A2),下拉填充所有行 - 第三步:新增实际排位列C列,C2输入公式
=IF(A2=A1,C1,SUMPRODUCT($B$1:B1)+1),下拉填充所有行即可得到最终结果
Python(pandas)实现
import pandas as pd # 假设df为选手数据框,existing_rank为现有排名列,score为选手成绩列(数值越小排名越高) # 方案1:基于已有原排名列计算 df['rank_count'] = df.groupby('existing_rank')['existing_rank'].transform('count') df['actual_rank'] = df['rank_count'].shift(fill_value=0).cumsum() + 1 df['actual_rank'] = df.groupby('existing_rank')['actual_rank'].transform('min') # 方案2:如果有原始成绩列,直接生成更简单 df['actual_rank'] = df['score'].rank(method='min', ascending=True).astype(int)
SPSS实现
假设现有排名变量名为old_rank:
- 首先按原排名升序排序:
数据 > 排序个案 > 将old_rank移入排序依据列表 > 确定 - 执行以下语法生成实际排位变量:
* 初始化实际排位变量. COMPUTE actual_rank = 1. * 标记每个排名段的首行. SORT CASES BY old_rank. MATCH FILES /FILE=* /BREAK=old_rank /FIRST=is_first. * 计算各段位实际排位. IF is_first AND old_rank > LAG(old_rank) actual_rank = LAG(actual_rank) + LAG(rank_cnt). * 统计每个原排名的人数. AGGREGATE OUTFILE=* MODE=ADDVARIABLES /BREAK=old_rank /rank_cnt = N. * 补全同排名段所有选手的排位. AGGREGATE OUTFILE=* MODE=ADDVARIABLES /BREAK=old_rank /actual_rank = MIN(actual_rank). EXECUTE.
R实现
library(dplyr) # 假设df为选手数据框,existing_rank为现有排名列,score为选手成绩列 # 方案1:基于已有原排名列计算 df <- df %>% arrange(existing_rank) %>% group_by(existing_rank) %>% mutate(rank_cnt = n()) %>% ungroup() %>% mutate(actual_rank = cumsum(lag(rank_cnt, default = 0)) + 1) %>% group_by(existing_rank) %>% mutate(actual_rank = min(actual_rank)) # 方案2:如果有原始成绩列,直接生成更简单 df <- df %>% mutate(actual_rank = rank(score, ties.method = "min"))
内容的提问来源于stack exchange,提问作者Leonhard Euler
相关产品推荐
相关产品推荐

