R语言中如何将观测组与dyad公司对匹配并统计匹配次数
问题描述
假设我有一个存储人员姓名和其对应客户公司的R数据框,构造代码如下:
name <- c("Anne", "Anne", "Mary", "Mary", "Mary", "Joe", "Joe", "Joe", "David", "David", "David", "David", "David") company <- c("A", "B", "C", "D", "E", "A", "B", "C", "D", "E", "F", "G", "H") df1 <- data.frame(name, company)
另有第二个数据框,存储结对(dyad)共同参与项目的公司对,构造代码如下:
company1 <- c("A", "B", "C", "D", "E", "F", "G", "H") company2 <- c("B", "C", "E", "E", "G", "A", "B", "C") df2 <- data.frame(company1, company2)
期望的输出结果格式如下:
name A B C D E F G No of sets 1 Anne 1 1 0 0 0 0 0 1 2 David 0 0 0 1 1 1 1 1 3 Joe 1 1 1 0 0 0 0 2 4 Mary 0 0 1 1 1 0 0 1
该结果需要统计每个人员的客户公司集合与df2中公司对的匹配次数:例如Anne的客户为A和B,匹配df2的第一行,计数为1;Joe的客户为A、B、C,同时匹配df2中A&B、B&C两行,计数为2。
实现代码
以下是基于tidyverse的实现方案:
# 加载依赖包 library(tidyverse) # 步骤1:生成姓名-公司的哑变量宽表 df_wide <- df1 %>% mutate(val = 1) %>% pivot_wider(names_from = company, values_from = val, values_fill = 0) %>% select(-H) # 示例输出无H列,可根据实际需求保留或删除 # 步骤2:统计每个姓名匹配的公司对数量 df_match_count <- df1 %>% group_by(name) %>% summarise( comp_list = list(company), `No of sets` = sum(apply(df2, 1, function(pair) all(pair %in% comp_list))), .groups = "drop" ) %>% select(-comp_list) # 步骤3:合并两个表得到最终结果 final_res <- df_wide %>% left_join(df_match_count, by = "name") %>% arrange(name) # 按姓名字母排序和示例输出保持一致
打印final_res即可得到和需求完全匹配的输出结果。
内容的提问来源于stack exchange,提问作者hy9fesh
相关产品推荐
相关产品推荐

