Совпадающие пары для R фреймов данных

#r #dataframe

#r #фрейм данных

Вопрос:

У меня есть фрейм данных, который содержит записи о карьере сотрудников в разных офисах крупных корпораций. Я хочу идентифицировать каждую пару сотрудников, которые имеют общий опыт работы в одном офисе. Моя структура фрейма данных выглядит следующим образом

     Year   Office     Employee_Name
    2011   Logistics  Henry
    2012   Logistics  Henry
    2013   HR         Henry
    
    2012   Marketing  Peter
    2013   HR         Peter
    2014   HR         Peter
    2015   HR         Peter

    2010   Logistics  Bob
    2011   Logistics  Bob
    2012   Logistics  Bob
 

В приведенном выше примере Генри и Питер вместе работали в отделе кадров в 2013 году. Генри также работал с Бобом в области логистики в 2011 и 2012 годах. Я хочу, чтобы конечные результаты могли быть чем-то вроде:

 Year_of_shared_experience Person_A Person_B
1                         Henry    Peter
2                         Henry    Bob
 

Порядок Person_A и Person_B не имеет значения (т. Е. Это может быть Генри в Person_A или Питер в столбце Person_A). Спасибо!

Ответ №1:

Вы можете объединить таблицу с самой собой (т.Е. С «самосоединением»), а затем отфильтровать повторяющиеся записи:

 # read data
dat = "
Year   Office     Employee_Name
2011   Logistics  Henry
2012   Logistics  Henry
2013   HR         Henry
2012   Marketing  Peter
2013   HR         Peter
2014   HR         Peter
2015   HR         Peter
2010   Logistics  Bob
2011   Logistics  Bob
2012   Logistics  Bob"
dat = read.table(text=dat, header=TRUE)

# self-join
dat = merge(dat, dat, all=TRUE, by=c("Year", "Office"))

# filter out duplicates
dat = dat[dat$Employee_Name.x < dat$Employee_Name.y,]

dat 
#>    Year    Office Employee_Name.x Employee_Name.y
#> 4  2011 Logistics             Bob           Henry
#> 8  2012 Logistics             Bob           Henry
#> 12 2013        HR           Henry           Peter
 

Ответ №2:

Опция в tidyverse

 library(dplyr)
full_join(dat, dat, by = c("Year", "Office")) %>%
         filter(Employee_Name.x < Employee_Name.y)
 

Комментарии:

1. Спасибо за помощь @akrun!