如何在R语言中结合偏好排名与绩效进行项目分配
R语言实现基于偏好排名与绩效的项目分配逻辑
核心分配规则
- 按偏好排名从高到低(1为最高优先级)逐层处理项目分配
- 对每个偏好层级中的项目,仅考虑未被分配的人员和未被占用的项目
- 同一项目的竞争人员中,绩效分数最高的获得该项目
- 已分配的人员和项目不再参与后续分配流程
示例数据构造
先构造符合需求的人员偏好和绩效数据:
library(dplyr) # 人员-项目偏好表:每行代表一个人员的某一项偏好,preference_rank为优先级(1最高) preferences <- tibble( employee = c("Anna", "Anna", "Anna", "Billy", "Billy", "Billy", "James", "James", "James"), project = c("A", "B", "C", "A", "B", "D", "A", "B", "E"), preference_rank = c(1, 2, 3, 1, 2, 3, 1, 2, 3) ) # 人员绩效分数表 performance <- tibble( employee = c("Anna", "Billy", "James"), score = c(95, 88, 82) )
分配逻辑实现代码
# 合并偏好与绩效数据,方便后续处理 all_data <- preferences %>% left_join(performance, by = "employee") # 初始化空的分配结果表 assigned <- tibble(employee = character(), project = character()) # 获取所有偏好层级(按优先级从高到低排序) rank_levels <- sort(unique(all_data$preference_rank)) # 逐层处理偏好分配 for (rank in rank_levels) { # 筛选当前层级的有效候选:未分配人员 + 未被占用的项目 current_candidates <- all_data %>% filter(preference_rank == rank, !employee %in% assigned$employee, !project %in% assigned$project) # 若无有效候选,跳过当前层级 if (nrow(current_candidates) == 0) next # 按项目分组,每组取绩效最高的人员分配该项目 current_assignments <- current_candidates %>% group_by(project) %>% arrange(desc(score)) %>% slice(1) %>% # 取绩效最高的第一个 ungroup() %>% select(employee, project) # 将本次分配结果加入总列表 assigned <- bind_rows(assigned, current_assignments) # 若所有人员已分配,提前终止循环 if (nrow(assigned) == length(unique(all_data$employee))) break } # 查看最终分配结果 print(assigned)
代码运行结果
# A tibble: 3 × 2 employee project <chr> <chr> 1 Anna A 2 Billy B 3 James E
适配扩展说明
- 该代码支持任意数量的人员和项目:只需更新
preferences和performance数据集即可 - 若项目数量少于人员数量,未分配到项目的人员会留在候选池外,可根据需求补充后续逻辑(如分配备选项目)
- 若同一项目有多名绩效分数相同的人员,代码会取排序后的第一个,可通过调整
arrange的额外字段(如入职时间)来细化规则
内容的提问来源于stack exchange,提问作者adkane
相关产品推荐
相关产品推荐

