R - объединить два набора данных, если ВСЕ значения в группе совпадают - PullRequest
0 голосов
/ 02 декабря 2018

Скажем, у меня есть два кадра данных 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 голосов
/ 02 декабря 2018

Вот один из способов использования 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
0 голосов
/ 02 декабря 2018

Возможно, есть лучшее решение, но с пакетом я пришел к следующему подходу:

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
...