Проверьте, соответствуют ли по крайней мере два значения для группы одного df в другом - PullRequest
0 голосов
/ 07 ноября 2018

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

df1:

ID      Skill        Community
1       IT              X
1       Analytics       X
1       ERP             X
2       Analytics       X
2       ERP             X
2       CRM             X
2       Finance         X

И еще один фрейм данных, похожий на этот:

df2:

ID        Skill
3         Public Speaking
3         IT
3         Management
3         ERP
4         HR
4         Finance
...

Моя цель состоит в том, чтобы в основном сказать, что , если конкретный человек (идентифицированный по его идентификатору) имеет как минимум 2 общих навыка с кем-то из df1 , то он также должен быть назначен сообществу X.

В приведенном выше примере идентификатор nº3 также должен быть присвоен сообществу X (поскольку он обладает навыками ИТ и ERP, точно так же как ID nº1 ), но не идентификатор nº4, поскольку он имеет только соответствующий навык с идентификатором nº2 (с финансами).

Мой ожидаемый результат должен выглядеть следующим образом для df2 :

ID      Skill                 Community
3       Public Speaking          X
3       IT                       X
3       Management               X
3       ERP                      X
4       HR                      NULL
4       Finance                 NULL
.....

На данный момент я использую только команду% in% с df2 [df2 & Skill% in% df1 $ Skill,] , но это только проверка для одного определенного навыка , и не обрабатывает это по ID.

Есть ли у вас какие-либо идеи о том, как мне подойти к этой проблеме?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Другой вариант

library(data.table)
setDT(df2)

df2[, Community := 
        'X'[any(tapply(df1$Skill, df1$ID, function(x) sum(Skill %in% x)) >= 2)]
    , by = ID]

df2

#    ID           Skill Community
# 1:  3 Public_Speaking         X
# 2:  3              IT         X
# 3:  3      Management         X
# 4:  3             ERP         X
# 5:  4              HR      <NA>
# 6:  4         Finance      <NA>
0 голосов
/ 07 ноября 2018

Пожалуйста, проверьте это на вашем реальном наборе данных, чтобы увидеть, работает ли следующее.

library(dplyr)
library(tidyr)

df3 <- df2 %>%
  left_join(df1, by = "Skill") %>%
  drop_na(ID.y) %>%
  count(ID.x, ID.y) %>%
  filter(n > 1) %>%
  distinct(ID.x) %>%
  mutate(Community = "X") %>%
  select(ID = ID.x, Community) %>%
  left_join(df2, ., by = "ID")
df3
#   ID           Skill Community
# 1  3 Public Speaking         X
# 2  3              IT         X
# 3  3      Management         X
# 4  3             ERP         X
# 5  4              HR      <NA>
# 6  4         Finance      <NA>

DATA

df1 <- read.table(text = "ID      Skill        Community
1       IT              X
                  1       Analytics       X
                  1       ERP             X
                  2       Analytics       X
                  2       ERP             X
                  2       CRM             X
                  2       Finance         X",
                  header = TRUE, stringsAsFactors = FALSE)

df2 <- read.table(text = "ID        Skill
3         'Public Speaking'
3         IT
3         Management
3         ERP
4         HR
4         Finance",
                  header = TRUE, stringsAsFactors = FALSE)
...