R语言如何高效合并键值包含在另一数据框字符串内的dataframe
员工福利匹配最优实现方案
核心思路
- 先对
ben表的benefit_id字段做拆分,将空格分隔的多ID展开为一行对应单个福利ID的长表 - 用展开后的ben长表和
emp表的salary ID字段做关联匹配,直接得到每位员工对应的所有适用福利 - 该方案时间复杂度为O(n),大小数据集都能高效运行,代码可读性和可维护性都最优
推荐实现(tidyverse 方案,最简洁通用)
library(tidyverse) # 拆分ben表的空格分隔福利ID为长格式 ben_long <- ben %>% separate_rows(benefit_id, sep = "\\s+") # 匹配合并,保留所有员工信息,无对应福利的员工benefit列显示NA emp_benefit <- emp %>% left_join(ben_long, by = c("salary" = "benefit_id")) # 若仅需要保留有对应福利的员工,将left_join替换为inner_join即可
基础R实现(无需加载第三方包)
# 拆分benefit_id并生成长结构ben表 ben_long <- data.frame( benefit = rep(ben$benefit, lengths(strsplit(ben$benefit_id, "\\s+"))), benefit_id = unlist(strsplit(ben$benefit_id, "\\s+")) ) # 合并匹配,all.x=TRUE对应保留所有员工记录 emp_benefit <- merge(emp, ben_long, by.x = "salary", by.y = "benefit_id", all.x = TRUE)
两种方案输出的结果完全一致,tidyverse方案写法更简洁、后续调整逻辑的成本更低,是绝大多数场景下的最优选择。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

