基于dplyr修改R函数,实现多场景排序排名索引生成
问题解决:支持多场景的排名索引生成函数
需求回顾
需要实现一个R函数,根据初始值列表和总槽位数生成排序后的排名索引,要求:
- 初始值数量小于总槽位数时,空位插入连续整数(如示例1的Slot5填充3.0)
- 所有场景下Slot1的Value必须为1或1.1
- 代码完全迁移至dplyr并优化
原代码的核心问题
原代码填充空位时直接使用Slot的数值,会导致当Slot对应的整数已被初始值占用时,出现重复整数部分,进而打乱排序逻辑。比如初始值包含3.1、总槽位为4时,原代码会填充Slot3为3,导致3.0出现在3.1之后,不符合连续整数插入的需求。
修改后的dplyr实现代码
library(dplyr) generate_rank_index <- function(Value, totalSlots) { # 输入合法性校验 stopifnot(is.numeric(Value), is.integer(totalSlots), totalSlots > 0) # 对初始值去重并排序 sorted_init_values <- sort(unique(Value)) # 提取初始值的整数部分,确定已占用的整数 used_integers <- as.integer(sorted_init_values) # 计算需要补充的整数数量 need_fill <- totalSlots - length(sorted_init_values) # 生成从1开始的候选整数集合,排除已占用的,取前need_fill个作为补充值 fill_values <- setdiff(seq(1, max(used_integers, need_fill) + need_fill), used_integers) %>% head(need_fill) %>% as.numeric() # 合并初始值与补充值,再次排序后生成结果数据框 combined_values <- c(sorted_init_values, fill_values) %>% sort() tibble(Slot = 1:totalSlots, Value = combined_values) } # 测试示例1 Value1 <- c(2.1, 1.2, 1.1, 2.2) totalSlots1 <- 5 generate_rank_index(Value1, totalSlots1) # 测试示例2:仅1个初始值,总槽位3 Value2 <- c(1.1) totalSlots2 <- 3 generate_rank_index(Value2, totalSlots2) # 测试示例3:初始值无1开头,总槽位4 Value3 <- c(3.1, 2.2) totalSlots3 <- 4 generate_rank_index(Value3, totalSlots3)
代码逻辑说明
- 输入校验:确保输入为合法的数值向量和正整数槽位数,提升函数健壮性
- 初始值处理:去重并排序,避免重复值干扰排名逻辑
- 补充值生成:从1开始筛选未被初始值占用的连续整数,填补空位,保证整数序列的连续性
- 合并排序:将初始值与补充值合并后重新排序,确保整体顺序符合要求
- Slot1规则满足:由于补充值从1开始选取,排序后的第一个元素必然是1或1.x(若初始值包含1开头的数值),完全符合要求
测试输出
- 示例1输出:
# A tibble: 5 × 2 Slot Value <int> <dbl> 1 1 1.1 2 2 1.2 3 3 2.1 4 4 2.2 5 5 3.0
- 示例2输出:
# A tibble: 3 × 2 Slot Value <int> <dbl> 1 1 1.1 2 2 2.0 3 3 3.0
- 示例3输出:
# A tibble: 4 × 2 Slot Value <int> <dbl> 1 1 1.0 2 2 2.2 3 3 3.1 4 4 4.0
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

