说我有两个数据帧df1和df2,如下所示:
df1:
EmployeeID Skill
1 A
1 B
1 C
2 B
2 D
2 C
2 F
3 A
3 J
df2:
Opportunity.ID Skill
12345 A
12345 B
56788 C
56788 B
56788 F
09988 H
我要做的是创建一个新的数据框,其中包含所有EmployeeID,并且具有特定Opportunity.ID 所需的所有技能,而不仅仅是其中一项。这就是为什么简单的合并或左/右联接将不够用的原因。 对于我们来说,我想拥有的是:
Opportunity.ID Employee.ID
12345 1
56788 2
09988 NA
请注意,雇员3不应该分配给机会12345,因为他在所要求的两种技能中只有一种技能。
任何帮助将不胜感激。
答案 0 :(得分:1)
这是使用dplyr
的一种方法-
df2 %>%
left_join(df1, by = "Skill") %>%
group_by(Opportunity.ID) %>%
mutate(test = ave(Skill, EmployeeID, FUN = function(x) all(Skill %in% x))) %>%
ungroup() %>%
filter(test != "FALSE") %>%
distinct(Opportunity.ID, EmployeeID)
# A tibble: 3 x 2
Opportunity.ID EmployeeID
<int> <int>
1 12345 1
2 56788 2
3 9988 NA
答案 1 :(得分:0)
可能有更好的解决方案,但是使用data.table-package,我采用了以下方法:
library(data.table) # load the package
setDT(df1) # convert 'df1' to a 'data.table'
setDT(df2) # convert 'df2' to a 'data.table'
df2[, .(EmployeeID = df1[.SD[, .(Skill, n = .N)], on = .(Skill)
][, .(ne = .N), by = .(EmployeeID, n)
][n == ne, EmployeeID])
, by = Opportunity.ID]
给出:
Opportunity.ID EmployeeID 1: 12345 1 2: 56788 2 3: 9988 NA