使用Tidy原则填充R语言中按比例缩放的分数序列
R语言实现带缩放通用分数的Data Frame
实现步骤与代码
1. 准备初始数据与区间因子计算
先加载所需工具包,定义初始数据,再为每个等级计算对应分数区间的比例因子——比例因子公式为(上一级通用分数边界 - 当前通用分数边界)/(上一级分数边界 - 当前分数边界),其中Max等级的通用分数保持不变,因子设为0。
library(dplyr) library(tidyr) # 初始数据 df <- tibble(grade = c("X", "E", "D", "C", "B", "A", "Max"), score = c(0,17,25,33,41,48,60), universal = c(0,22,44,65,87,108,108)) # 计算每个等级区间的比例因子及边界 df_with_factor <- df %>% mutate( next_score = lead(score), next_universal = lead(universal), factor = ifelse(grade == "Max", 0, (next_universal - universal)/(next_score - score)) )
2. 扩展分数序列并计算缩放通用分
生成每个等级对应的整数分数序列,再分组计算每个分数对应的通用分数:
# 扩展分数并计算每个分数对应的通用分数 result_df <- df_with_factor %>% # 按等级生成对应分数序列 rowwise() %>% mutate(score_seq = list(score:ifelse(is.na(next_score), score, next_score - 1))) %>% unnest(score_seq) %>% # 分组计算缩放通用分 group_by(grade) %>% mutate( offset = score_seq - first(score_seq), universal_scaled = first(universal) + offset * first(factor) ) %>% # 整理字段 select(grade, score = score_seq, universal = universal_scaled) %>% # 补充Max等级的60分数据 bind_rows(df %>% filter(grade == "Max")) %>% arrange(score)
结果说明
- 每个整数分数的通用分数会按照对应等级区间的比例因子线性递增,例如X等级的分数从0到16时,通用分数从0开始每次增加约1.29,到17分时刚好达到22。
- Max等级的分数从48到60时,通用分数保持108不变。
内容的提问来源于stack exchange,提问作者Rich.a.rd
相关产品推荐
相关产品推荐

