R语言中参照Excel方法按V2秩次拆分V1并列整数秩生成小数调整值
R语言实现V1并列秩的V2秩次调整
核心计算规则
完全匹配参考的Excel计算逻辑,步骤拆解如下:
- 对V1做升序秩次计算,相同值取相同的整数秩次,规则和Excel
RANG(A, range, 1)升序逻辑完全对齐 - 对V2做全局升序秩次计算,将秩次值除以数据集总样本数,得到范围在0-1之间的比例值
- 识别V1秩次的并列组:如果某行的V1整数秩次在全数据集中仅出现1次,对应的
tiebreak值为0,无需调整 - 如果V1整数秩次为并列值(出现次数大于1),则取该行对应的V2全局秩次除以总样本数作为
tiebreak小数项 - 调整后的V1秩次 = V1原整数秩 +
tiebreak值 - 调整后的V1数值 = V1原数值 +
tiebreak值(无并列时和原V1值一致)
注意:秩次计算统一采用ties.method = "min"规则,保证V1并列值的秩次不会出现偏移,和原Excel输出完全对齐。
通用可复用函数
adjust_rank_with_tiebreak <- function(dat, col_v1 = "V1", col_v2 = "V2") { total_n <- nrow(dat) # 计算V1升序秩次,并列取最小整数秩 dat$rank_V1 <- rank(dat[[col_v1]], ties.method = "min") # 计算V2全局升序秩次 v2_global_rank <- rank(dat[[col_v2]], ties.method = "min") # 统计每个V1秩次的出现次数,识别并列组 v1_rank_freq <- table(dat$rank_V1) # 计算tiebreak值 dat$tiebreak <- ifelse( v1_rank_freq[as.character(dat$rank_V1)] > 1, v2_global_rank / total_n, 0 ) # 计算调整后的值 dat$rank_V1_adjusted <- dat$rank_V1 + dat$tiebreak dat$V1_adjusted <- dat[[col_v1]] + dat$tiebreak # 保留两位小数,对齐示例输出精度 dat$tiebreak <- round(dat$tiebreak, 2) dat$rank_V1_adjusted <- round(dat$rank_V1_adjusted, 2) dat$V1_adjusted <- round(dat$V1_adjusted, 2) return(dat) }
效果验证
使用示例数据集运行函数:
dat0 <- data.frame( V1 = c(18,20,21,22,22,23,23,23,23,24,24,24,25,25,25,25,25,26,26,27), V2 = c(13,54,3,7,23,10,13,24,25,5,9,16,6,8,11,13,18,9,10,9) ) result <- adjust_rank_with_tiebreak(dat0)
输出结果和目标值完全匹配:
> result V1 V2 rank_V1 tiebreak rank_V1_adjusted V1_adjusted 1 18 13 1 0.00 1.00 18.00 2 20 54 2 0.00 2.00 20.00 3 21 3 3 0.00 3.00 21.00 4 22 7 4 0.20 4.20 22.20 5 22 23 4 0.85 4.85 22.85 6 23 10 6 0.45 6.45 23.45 7 23 13 6 0.60 6.60 23.60 8 23 24 6 0.90 6.90 23.90 9 23 25 6 0.95 6.95 23.95 10 24 5 10 0.10 10.10 24.10 11 24 9 10 0.30 10.30 24.30 12 24 16 10 0.75 10.75 24.75 13 25 6 13 0.15 13.15 25.15 14 25 8 13 0.25 13.25 25.25 15 25 11 13 0.55 13.55 25.55 16 25 13 13 0.60 13.60 25.60 17 25 18 13 0.80 13.80 25.80 18 26 9 18 0.30 18.30 26.30 19 26 10 18 0.45 18.45 26.45 20 27 9 20 0.00 20.00 27.00
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

