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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:35:43