r - 将数据帧与包含在单独数据帧中的字符串中的键值合并
问题描述
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
以便我们获得分配给每个员工的适当福利的最有效方法是什么?
解决方案
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,其中NA
inemployee
表示没有员工的福利。
仅供参考:如果您在 4.0 之前运行 R,那么您factor
的数据中可能包含 s。要解决这个问题,只需as.character
先转换因子列。(这可以用 来确定sapply(ben, inherits, "factor")
。)
推荐阅读
- javascript - 使用 JavaScript 移动鼠标悬停?
- nlp - 我将每个单词转换为 96x1 数字向量而不是 300x1(我正在使用 nlp=spacy.load('en',vectors='en_glove_cc_300_1m_vectors')
- wordpress - Docker:致命错误:未捕获错误:调用未定义函数 mysql_connect()
- python-3.x - 使用 Boto3 的 AWS 账户报告
- wxpython - 如何在 wxpython 中侦听帧大小/移动更改事件
- javascript - 在 React Native 中循环遍历 json
- gitlab - 为什么在尝试推送到 GitLab 中的图表存储库时找不到图表
- angular - 在订阅 observable 时获取一个空数组
- jdbc - 过多的 JDBC 线程向 TDengine 插入数据时出现 Invalid table ID 错误
- javascript - 按另一个对象列表排列对象列表,按 id 排序