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

如何在R中实现患者单腿均衡随机抽样(最多偏差1)

按患者分层且腿数均衡的随机抽样方案

需求说明

现有N名患者,每名患者对应两条腿(0代表左腿,1代表右腿),需要为每位患者随机抽取一条腿,同时要求最终样本中左腿(0)和右腿(1)的数量尽可能均衡:

  • 当N为偶数时,0和1的数量完全相等(各N/2条)
  • 当N为奇数时,两类腿的数量最多相差1条

原代码的问题

原代码对每位患者独立随机抽取腿,结果是完全随机的,无法保证腿数的均衡性,会出现像测试案例中4条0、2条1的不均衡情况。

解决方案代码

library(janitor)

# 构造测试数据(6名患者,可替换为实际数据集)
df <- data.frame(
  x = rep(1:6, each = 2),  # x为患者ID
  y = rep(c(0, 1), times = 6)  # y为腿的标识(0=左腿,1=右腿)
)

# 核心抽样逻辑
total_patients <- length(unique(df$x))
# 计算需要抽取的0和1的数量
count_0 <- floor(total_patients / 2)
count_1 <- total_patients - count_0

# 随机选取对应数量的患者分配腿类型
set.seed(123)  # 设置随机种子保证可复现,可根据需要移除
shuffled_patients <- sample(unique(df$x), size = total_patients)
# 前count_0名患者分配0,剩下的分配1
leg_assignment <- data.frame(
  x = shuffled_patients,
  assigned_y = c(rep(0, count_0), rep(1, count_1))
)

# 匹配原数据,得到最终样本
df_HS <- merge(df, leg_assignment, by = "x")
df_HS <- df_HS[df_HS$y == df_HS$assigned_y, c("x", "y")]

# 查看结果分布
tabyl(df_HS$y)

代码解释

  1. 确定均衡数量:根据总患者数计算需要抽取的左腿和右腿的目标数量,确保最均衡的分配
  2. 随机分配患者:先打乱患者ID的顺序,再按目标数量为患者分配对应的腿类型,保证随机性的同时满足均衡要求
  3. 匹配生成样本:将分配结果与原数据合并,筛选出符合分配要求的腿记录,得到最终样本

不同规模测试验证

  • 6名患者(偶数):运行后tabyl结果会显示0和1各3条
  • 5名患者(奇数):修改测试数据为x = rep(1:5, each = 2),运行后会出现2条0+3条1,或3条0+2条1(取决于随机种子)
  • 33名患者(奇数):会自动分配16条0和17条1,或17条0和16条1,满足最多相差1条的要求

内容的提问来源于stack exchange,提问作者martijn van Hooff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:25:40