R - Выберите идентификаторы, только если для группы выполнены некоторые условия - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь создать рекомендацию, которая будет рекомендовать подходящих людей для конкретной деятельности, основываясь на навыках, которыми они обладают. Для этого я сначала создал механизм рекомендаций, который дает рекомендации по навыкам для каждого вида деятельности на основе исторических данных (навыков, которыми владеют люди, работавшие над этими действиями). Теперь уловка заключается в том, чтобы связать их с некоторыми конкретными людьми.

Я не совсем уверен в том, что самый умный способ сделать это, но самый простой способ - это найти рекомендуемые навыки для конкретного вида деятельности и сопоставить его с сотрудниками, которые, например, имеют не менее 50% из них. навыки.

Мой набор данных выглядит так:

Region    ActivityID   Recommended_Skills     PersonID     Skills_Person
France    123          Python                 ABC          R
France    123          PowerPoint             ABC          Mikado
France    123          R                      ABC          Python
France    123          Word                   ABC          Photoshop    
France    123          Python                 XYZ          Finance
France    123          PowerPoint             XYZ          Powerpoint    
France    123          R                      XYZ          Law
France    123          Word                   XYZ          Analytics    
Spain     789          JavaScript             DEF          PowerPoint
Spain     789          PowerPoint             DEF          Word    
Spain     789          UI                     DEF          R
Spain     789          Office                 DEF          Finance    
Spain     789          Python                 CVB          JavaScript
Spain     789          PowerPoint             CVB          Office

В этом случае мой ожидаемый фрейм данных должен выглядеть следующим образом:

Region    ActivityID     PersonID
France    123            ABC
Spain     789            CVB

Фактически, DEF не рекомендуется для действия 123 в этом случае, так как должен быть group_by "Регион". Кроме того, в этом случае для ActivityID рекомендуется только один человек, но это должно быть более нормально.

Надеюсь, это было достаточно ясно; любая помощь будет принята с благодарностью.

Спасибо, Allan

1 Ответ

0 голосов
/ 10 мая 2019

A tidyverse путь будет

library(tidyverse)

df %>%
  group_by(Region, ActivityID) %>%
  summarise(PersonID = names(which.max(map_dbl(split(Skills_Person, PersonID), 
                        ~sum(Recommended_Skills %in% .)))))


#  Region ActivityID PersonID
#  <chr>  <chr>      <chr>   
#1  France 123        ABC     
#2  Spain  789        CVB    

Мы группируем для каждых Region и Activity и находим PersonID, который имеет максимальное совпадение с Recommended_Skills для этого ActivityID.

...