假设我有一个这样的数据框架。
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
...我的目标基本上是说,如果,如果一个特定的人(用其ID标识)与df1的某个人至少有2项共同技能,那么他也应该被分配到X社区。
在上面的例子中,ID编号3也应该分配给社区X (因为他在技术上有信息技术和企业资源规划,就像ID编号1一样),而不是ID 4,因为他只具备与ID编号2(与财务)相匹配的技能。
对于df2,我的预期输出应该如下所示
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处理。
你知道我该如何处理这个问题吗?
任何帮助都将不胜感激。
发布于 2018-11-07 14:46:51
请在您的真实世界数据集上测试这一点,以确定以下内容是否有效。
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>数据
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)发布于 2018-11-07 14:59:00
另一种选择
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>https://stackoverflow.com/questions/53191515
复制相似问题