首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查一个df组中是否至少有两个值与另一个df匹配。

检查一个df组中是否至少有两个值与另一个df匹配。
EN

Stack Overflow用户
提问于 2018-11-07 14:31:53
回答 2查看 67关注 0票数 2

假设我有一个这样的数据框架。

df1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
ID        Skill
3         Public Speaking
3         IT
3         Management
3         ERP
4         HR
4         Finance
...

我的目标基本上是说,如果,如果一个特定的人(用其ID标识)与df1的某个人至少有2项共同技能,那么他也应该被分配到X社区。

在上面的例子中,ID编号3也应该分配给社区X (因为他在技术上有信息技术和企业资源规划,就像ID编号1一样),而不是ID 4,因为他只具备与ID编号2(与财务)相匹配的技能。

对于df2,我的预期输出应该如下所示

代码语言:javascript
复制
ID      Skill                 Community
3       Public Speaking          X
3       IT                       X
3       Management               X
3       ERP                      X
4       HR                      NULL
4       Finance                 NULL
.....

目前,我只在df2df2中使用命令%in%,在df1$ 中使用技能%,但这只检查一个特定技能,而不按ID处理。

你知道我该如何处理这个问题吗?

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-07 14:46:51

请在您的真实世界数据集上测试这一点,以确定以下内容是否有效。

代码语言:javascript
复制
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>

数据

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-11-07 14:59:00

另一种选择

代码语言:javascript
复制
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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53191515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档