You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:15:02