首页 > 解决方案 > 将数据帧与包含在单独数据帧中的字符串中的键值合并

问题描述

employee <- c('John','Peter', 'Gynn', 'Jolie', 'Hope', 'Sue', 'Jane', 'Sarah')
salary <- c('VT020', 'VT126', 'VT027', 'VT667', 'VC120', 'VT000', 'VA120', 'VA020')

emp <- data.frame(employee, salary)


benefit <- c('Health', 'Time', 'Bonus')
benefit_id <- c('VT020 VT126 VT667 VA020', 'VT667', 'VT126 VT667 VT000')

ben <- data.frame(benefit, benefit_id)

上面我们有数据框,一个包含名称和唯一 ID,另一个包含类别和唯一 ID 列表。

ben将数据框与数据框合并emp以便我们获得分配给每个员工的适当福利的最有效方法是什么?

标签: r

解决方案


tidyverse

library(dplyr)
library(tidyr) # tidyr
ben %>%
  mutate(benefit_id = strsplit(benefit_id, "\\s+")) %>%
  unnest(benefit_id) %>%
  left_join(emp, ., by = c(salary = "benefit_id"))
#    employee salary benefit
# 1      John  VT020  Health
# 2     Peter  VT126  Health
# 3     Peter  VT126   Bonus
# 4      Gynn  VT027    <NA>
# 5     Jolie  VT667  Health
# 6     Jolie  VT667    Time
# 7     Jolie  VT667   Bonus
# 8      Hope  VC120    <NA>
# 9       Sue  VT000   Bonus
# 10     Jane  VA120    <NA>
# 11    Sarah  VA020  Health

根据您的需要,您可能还喜欢不同的加入。例如,full_join如果您想要所有配对,请使用 a,其中NAinemployee表示没有员工的福利。

仅供参考:如果您在 4.0 之前运行 R,那么您factor的数据中可能包含 s。要解决这个问题,只需as.character先转换因子列。(这可以用 来确定sapply(ben, inherits, "factor")。)


推荐阅读