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
相关产品推荐
相关产品推荐

