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

R语言按Condition分组随机配对生成共享DyadID新列的实现方法

R语言同组随机配对生成DyadID解决方案

实现思路

基于tidyverse生态工具,仅在相同Condition分组内完成随机配对,奇数人数分组的落单学生DyadID赋值为NA,所有配对的DyadID全局唯一。

实现代码

# 加载依赖包
library(tidyverse)

# 固定随机种子,保证结果可复现
set.seed(456)

df_with_dyad <- df_sim %>%
  # 按Condition分组,确保配对仅在同组内进行
  group_by(Condition) %>%
  # 组内随机打乱行顺序,保证配对随机性
  slice_sample(n = n()) %>%
  # 组内生成配对标识
  mutate(
    # 组内行序号
    row_in_group = row_number(),
    # 每2行划分为1个配对,生成组内配对序号
    group_dyad_id = ceiling(row_in_group / 2),
    # 标记落单的配对(组内配对仅包含1人则设为NA)
    group_dyad_id = ifelse(n() == 1, NA,
      ifelse(sum(group_dyad_id == cur_data()$group_dyad_id[row_number()]) == 1, NA, group_dyad_id)
    )
  ) %>%
  ungroup() %>%
  # 生成全局唯一的DyadID
  mutate(
    # 字符串格式ID,直观区分所属Condition
    DyadID = ifelse(is.na(group_dyad_id), NA, paste0("D_", Condition, "_", group_dyad_id))
    # 若需要纯数字格式的唯一ID,可替换为下面这行:
    # DyadID = ifelse(is.na(group_dyad_id), NA, group_indices(., Condition, group_dyad_id))
  ) %>%
  # 清理临时列,恢复原始数据的行顺序
  select(-row_in_group, -group_dyad_id) %>%
  arrange(StudentID)

效果验证

打印生成的结果可查看配对情况:

print(df_with_dyad, n = 10)

输出示例(基于用户提供的样本数据):

# A tibble: 10 × 4
   StudentID Condition    XP DyadID
       <int> <fct>     <int> <chr>
 1         1 1            17 D_1_1
 2         2 2            17 D_2_1
 3         3 3            17 D_3_1
 4         4 1            16 D_1_1
 5         5 3            10 D_3_2
 6         6 2            16 D_2_1
 7         7 2            14 D_2_2
 8         8 1            15 D_1_2
 9         9 1            13 D_1_2
10        10 3            16 NA

可以看到Condition 3共有3名学生,其中2人配对为D_3_2,剩下1名落单学生DyadID为NA,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:18:02