R语言如何根据项目关键词非随机匹配合规的第二评阅教师
R语言实现项目第二评阅人匹配
匹配规则
我们有一个存储教授负责项目信息的数据集,需要为每个项目匹配符合规则的第二评阅人,规则如下:
- 第二评阅人的研究方向需和项目匹配:即该教授负责的项目也包含项目对应的
concrete/bridges/water关键词 - 教授不能评阅自己负责的项目
- 同一教授可多次被选为第二评阅人
示例数据集
df <- data.frame( professor = c("Hellen", "Ben","Ethel", "Jim","Connor", "Juan","Lucy"), project = c("Bridges with stone", "Waterways","Concrete with steel","Structure of concrete bridges","Public health and water","Masonry of bridges","3D concrete") )
实现代码
需要提前安装加载dplyr、stringr、purrr三个依赖包:
# 加载依赖 library(dplyr) library(stringr) library(purrr) # 定义三类项目关键词 keywords <- c("concrete", "bridges", "water") # 步骤1:统计每个教授的研究方向标签(即负责过的项目包含的关键词) prof_tags <- df %>% mutate(project = str_to_lower(project)) %>% rowwise() %>% mutate(tags = list(keywords[str_detect(project, keywords)])) %>% ungroup() %>% select(professor, tags) %>% unnest(tags) %>% distinct() %>% group_by(professor) %>% summarise( second_candidate = professor, prof_tags = list(unique(tags)) ) %>% ungroup() %>% select(-professor) # 步骤2:为每个项目匹配符合条件的第二评阅人 result <- df %>% # 提取当前项目的所有匹配关键词 mutate(project_low = str_to_lower(project), project_tags = map(project_low, ~keywords[str_detect(.x, keywords)])) %>% # 关联所有教授的研究方向标签 crossing(prof_tags) %>% # 过滤符合条件的评阅人:方向匹配且不是项目负责人 rowwise() %>% filter( length(intersect(project_tags, prof_tags)) > 0, professor != second_candidate ) %>% ungroup() %>% # 每个项目随机选1名符合条件的评阅人 group_by(professor, project) %>% slice_sample(n = 1) %>% ungroup() %>% # 整理输出字段 select(professor, project, second_Marker = second_candidate)
小提示:如果需要固定匹配结果方便复现,可在运行代码前执行
set.seed(123),数字可自定义。
输出格式参考
data.frame( professor = c("Hellen", "Ben","Ethel", "Jim","Connor", "Juan","Lucy"), project = c("Bridges with stone", "Waterways","Concrete with steel","Structure of concrete bridges","Public health and water","Masonry of bridges","3D concrete"), second_Marker = c("Juan","Connor","Jim","Lucy","Ben","Hellen","Ethel") )
内容的提问来源于stack exchange,提问作者HCAI
相关产品推荐
相关产品推荐

