如何在R中编写函数:导入姓名列表并为每人随机分配3名人员
实现随机分配3名其他人员的R函数
现有代码的问题
- 循环中
student_1等变量会被持续覆盖,最终仅保留最后一次循环的结果,无法为每个学生生成独立分配 - 用
i+1这类索引是按顺序取数,并非随机分配,且当i接近数据集末尾时会触发索引越界错误 - 未排除学生自身,存在分配到自己的可能
- 输入数据仅单列,不符合你需求中「包含姓氏、名字两列」的场景
自定义函数实现
以下是满足需求的R函数,支持导入两列姓名数据,为每人随机分配3名不重复的其他人员:
assign_random_partners <- function(name_df, first_col, last_col) { # 合并姓氏与名字为完整姓名 name_df$full_name <- paste(name_df[[first_col]], name_df[[last_col]]) # 检查数据集人数是否足够(需排除自身后仍能选3人) if(nrow(name_df) < 4) { stop("数据集至少需要4名人员才能完成分配") } # 为每个人员生成随机分配结果 assigned_list <- lapply(name_df$full_name, function(person) { # 排除当前人员,从剩余列表中随机选3个不重复的人 candidates <- setdiff(name_df$full_name, person) sample(candidates, size = 3, replace = FALSE) }) # 将结果列表转换为数据框并命名列 assigned_df <- do.call(rbind, assigned_list) colnames(assigned_df) <- paste0("Partner_", 1:3) # 合并原数据与分配结果 result_df <- cbind(name_df, assigned_df) return(result_df) }
使用示例
# 构造包含姓氏、名字的测试数据 test_names <- data.frame( LastName = c("Smith", "Johnson", "Williams", "Brown", "Jones", "Miller"), FirstName = c("John", "Emily", "Michael", "Sarah", "David", "Lisa") ) # 调用函数完成分配 final_result <- assign_random_partners(test_names, first_col = "FirstName", last_col = "LastName") print(final_result)
补充说明
- 若你的输入数据已经是合并好的单列姓名,可简化函数:去掉合并姓名的步骤,直接传入单列数据处理
- 如果允许重复分配同一人员,可将
sample中的replace = FALSE改为TRUE
内容的提问来源于stack exchange,提问作者peeledpotato
相关产品推荐
相关产品推荐

