R-如果每个组的所有值都匹配,则合并两个数据集

时间:2018-12-02 10:57:45

标签: r merge group-by

说我有两个数据帧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,因为他在所要求的两种技能中只有一种技能

任何帮助将不胜感激。

2 个答案:

答案 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)

可能有更好的解决方案,但是使用-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