如何按被试与条件均衡地将数据框随机拆分为两半?
解决方案
要同时满足被试内试次均衡和被试内条件分布均衡的拆分需求,我们可以通过按被试+条件分组后随机分配的方式实现,以下是具体代码:
基础均衡版本(近似50/50分配)
使用dplyr进行分组处理,确保每个被试的每个条件内部独立随机拆分:
library(dplyr) # 为每条数据分配子集标签 split_data <- my_data %>% group_by(sbj_no, condition) %>% mutate(subset = sample(c("subset1", "subset2"), n(), replace = TRUE, prob = c(0.5, 0.5))) %>% ungroup() # 拆分得到两个子集 subset1 <- split_data %>% filter(subset == "subset1") subset2 <- split_data %>% filter(subset == "subset2")
逻辑说明
group_by(sbj_no, condition):锁定每个被试的单个条件组,确保拆分不会跨被试或跨条件打乱分布sample(..., prob = c(0.5,0.5)):在每组内随机分配子集,保证试次近似均匀分布;若组内试次为奇数,两个子集的数量差仅为1,符合"近似相等"的要求
严格均衡版本(数量差≤1)
如果需要更精准的均衡(每个被试的每个条件在两个子集中的数量差不超过1),可以使用以下代码:
split_data_strict <- my_data %>% group_by(sbj_no, condition) %>% mutate( # 计算每组应分配到subset1的试次数量 n_half = floor(n()/2), # 随机选择对应数量的行分配到subset1,剩余到subset2 subset = ifelse(row_number() %in% sample(n(), n_half), "subset1", "subset2") ) %>% select(-n_half) %>% ungroup() subset1_strict <- split_data_strict %>% filter(subset == "subset1") subset2_strict <- split_data_strict %>% filter(subset == "subset2")
验证拆分效果
可以通过以下代码检查单个被试的条件分布是否均衡:
# 查看被试100在subset1中的条件数量 subset1 %>% filter(sbj_no == "100") %>% count(condition) # 查看被试100在subset2中的条件数量 subset2 %>% filter(sbj_no == "100") %>% count(condition)
内容的提问来源于stack exchange,提问作者Ada
相关产品推荐
相关产品推荐

