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

如何按被试与条件均衡地将数据框随机拆分为两半?

解决方案

要同时满足被试内试次均衡和被试内条件分布均衡的拆分需求,我们可以通过按被试+条件分组后随机分配的方式实现,以下是具体代码:

基础均衡版本(近似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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:35:26