如何用R在数据框中生成无重复的随机名字配对
实现名字的无重复随机配对(R语言)
需求说明
需要从数据框的名字列生成随机配对,满足以下要求:
- 每个名字仅参与一次配对
- 配对结果随机排序
- 禁止名字与自身配对
原代码使用combn生成了所有可能的两两组合,无法满足「仅配对一次」的要求,以下是解决方案:
解决代码
# 创建数据框(保留原数据) df = data.frame( "Name" = c("Amiya", "Raj", "Asish", "John", "ruban", "mary", "barath", "leema", "joshi", "indhu", "praveen", "joshua", "alex", "martin", "stella", "veronica", "henry", "rajesh", "yusuf", "jenita", "johana", "jerald", "jegan", "lincy", "jona", "rani", "julie", "ross", "chandler", "monica", "penny", "sheldon"), "Sex" = c("Female", "Male", "Male", "male", "male", "Female", "male", "Female", "Female", "Female", "male", "male", "male", "male", "Female", "Female", "male", "male", "male", "Female", "Female", "male", "male", "Female", "Female", "Female", "Female", "male", "male", "Female", "Female", "male"), "Number" = c(8937998889, 2598279874, 4589987483, 2876876877, 2876876876, 2487698798, 2879879877, 2887987897, 2878798733, 4309808098, 8748098990, 9883798798, 8734787987, 8973498787, 8734887877, 9798374877, 8786487687, 7275687263, 4379879847, 8943787876, 3874879874, 8978973987, 8978347878, 8839478768, 9378887774, 8467676764, 7246276874, 7478798743, 6576787877, 7328776876, 6648678833, 6378787878) ) # 提取唯一名字并随机打乱顺序 names_list <- unique(df$Name) set.seed(123) # 可选:设置随机种子,确保结果可复现 shuffled_names <- sample(names_list) # 生成无重复配对 pairings <- matrix(shuffled_names, ncol = 2, byrow = TRUE) colnames(pairings) <- c("成员A", "成员B") # 输出结果 print(pairings)
代码说明
unique(df$Name):确保名字无重复(原数据已唯一,此步骤可兼容有重复名字的场景)sample(names_list):随机打乱名字顺序,保证配对的随机性,同时避免自身配对(名字唯一时不可能出现自身配对)matrix(..., ncol=2, byrow=TRUE):将打乱后的名字按行分成两列,每个名字仅出现一次,完美满足「仅配对一次」的要求
处理奇数人数的情况
如果名字总数是奇数,会有一个名字无法配对,可添加以下逻辑处理:
if(length(shuffled_names) %% 2 != 0){ unpaired_name <- tail(shuffled_names, 1) shuffled_names <- head(shuffled_names, -1) pairings <- matrix(shuffled_names, ncol = 2, byrow = TRUE) cat("未配对的名字:", unpaired_name, "\n") }
内容的提问来源于stack exchange,提问作者Lincy
相关产品推荐
相关产品推荐

