基于R语言实现按区域、类型批量均等分配物品至人员
批量实现区域内物品均等分配的R方案
核心思路
复用你已有的单区域分配逻辑,通过分组处理或自定义函数+遍历实现批量自动化:
- 按「区域+物品类型」拆分数据
- 每组物品按
value降序排序 - 匹配对应区域的人员列表,循环分配给物品
- 合并所有区域的分配结果
方案一:dplyr分组处理(推荐,tidyverse风格)
library(dplyr) # 预整理:获取每个区域对应的唯一人员列表 area_people <- df2 %>% group_by(area) %>% summarise(people = list(unique(name))) %>% ungroup() # 批量执行分配逻辑 final_result <- df1 %>% # 按区域和物品类型分组 group_by(area, type) %>% # 对每组执行分配操作 group_modify(function(.x, .y) { # 获取当前区域的人员列表 current_people <- area_people %>% filter(area == .y$area) %>% pull(people) %>% unlist() # 按value降序排序,再分配人员 .x %>% arrange(desc(value)) %>% mutate(name = rep(current_people, length.out = nrow(.x))) }) %>% ungroup()
方案二:自定义函数+显式遍历
如果你更习惯手动循环逻辑,可使用此方案:
library(dplyr) # 定义单个区域的处理函数 process_single_area <- function(target_area) { # 获取当前区域的人员列表 area_people <- df2 %>% filter(area == target_area) %>% pull(name) %>% unique() # 处理当前区域所有类型的物品 df1 %>% filter(area == target_area) %>% group_by(type) %>% arrange(desc(value)) %>% mutate(name = rep(area_people, length.out = nrow(.))) %>% ungroup() } # 获取所有唯一区域 all_areas <- unique(df1$area) # 遍历所有区域并合并结果(两种方式二选一) # 方式1:用purrr包更简洁 final_result <- purrr::map_dfr(all_areas, process_single_area) # 方式2:base R循环 # final_result <- data.frame() # for (area in all_areas) { # area_result <- process_single_area(area) # final_result <- rbind(final_result, area_result) # }
分配均匀性验证
可通过以下代码检查每个区域内,各人员分配到的各类型物品数量:
final_result %>% group_by(area, name, type) %>% summarise(item_count = n()) %>% ungroup()
内容的提问来源于stack exchange,提问作者kikusanchez
相关产品推荐
相关产品推荐

