如何在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工具包
适合处理更灵活的项目组合需求,步骤清晰易扩展:
- 加载依赖包
library(dplyr) library(tidyr)
- 提取每个项目对应的成员列表
project_members <- df %>% group_by(project) %>% summarise(members = list(members)) %>% ungroup()
- 生成目标项目对(示例中仅保留P1作为第一个项目)
project_pairs <- expand.grid(project1 = unique(df$project), project2 = unique(df$project), stringsAsFactors = FALSE) %>% filter(project1 == "P1" & project1 != project2)
- 生成成员全配对并展开
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
相关产品推荐
相关产品推荐

