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

如何在R中生成不同项目成员间的所有组合?

在R中实现项目成员跨项目全配对

需求说明

将包含项目和成员的数据框,转换为不同项目间成员的全笛卡尔积配对,覆盖所有指定的项目组合(示例中为P1分别与P2、P3配对)。

原始数据

df <- data.frame (project  = c("P1", "P1", "P2", "P2", "P2", "P3", "P3"),
                  members = c("a", "b", "a", "c", "d", "e", "f")
)

方法一:使用tidyverse工具包

适合处理更灵活的项目组合需求,步骤清晰易扩展:

  1. 加载依赖包
library(dplyr)
library(tidyr)
  1. 提取每个项目对应的成员列表
project_members <- df %>% 
  group_by(project) %>% 
  summarise(members = list(members)) %>% 
  ungroup()
  1. 生成目标项目对(示例中仅保留P1作为第一个项目)
project_pairs <- expand.grid(project1 = unique(df$project), 
                             project2 = unique(df$project),
                             stringsAsFactors = FALSE) %>% 
  filter(project1 == "P1" & project1 != project2)
  1. 生成成员全配对并展开
result <- project_pairs %>% 
  left_join(project_members, by = c("project1" = "project")) %>% 
  rename(members1 = members) %>% 
  left_join(project_members, by = c("project2" = "project")) %>% 
  rename(members2 = members) %>% 
  unnest(c(members1, members2))

# 转换为data.frame格式,与示例输出一致
df2 <- as.data.frame(result)

方法二:Base R实现

无需额外包,适合简单场景:

# 按项目拆分成员列表
proj_list <- split(df$members, df$project)

# 定义需要配对的项目组合
proj_pairs <- list(c("P1", "P2"), c("P1", "P3"))

# 循环生成每个组合的笛卡尔积并合并
df2 <- do.call(rbind, lapply(proj_pairs, function(pair) {
  expand.grid(project1 = pair[1],
              project2 = pair[2],
              members1 = proj_list[[pair[1]]],
              members2 = proj_list[[pair[2]]],
              stringsAsFactors = FALSE)
}))

扩展说明

如果需要覆盖所有项目间的有序组合(比如P2与P1、P2与P3等),只需修改项目对的生成逻辑:

# 生成所有不同的有序项目对
project_pairs <- expand.grid(project1 = unique(df$project), 
                             project2 = unique(df$project),
                             stringsAsFactors = FALSE) %>% 
  filter(project1 != project2)

内容的提问来源于stack exchange,提问作者Dima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:58:09