如何在R中为Control T0行随机分配T1的Treat1/Treat2重复样本?
解决方案
步骤思路
我们需要按城市分组独立处理,确保每个城市内T1时间点的Treat1、Treat2样本(各3个)被随机分配到同城市的Control T0行中,下面提供两种贴合不同需求的实现方式:
方式一:修改原Control T0样本的处理类型(保留样本名,调整分组)
适合需要保留原T0样本条目,仅随机替换部分样本的处理标签的场景:
library(dplyr) set.seed(123) # 固定随机种子,保证结果可复现 metadata_processed <- metadata %>% group_by(city) %>% mutate( # 对Control T0的9个样本,随机分配3个Control、3个Treat1、3个Treat2 treatment = if_else( time == "T0" & treatment == "Control", sample( c(rep("Control", 3), rep("Treat1", 3), rep("Treat2", 3)), size = sum(time == "T0" & treatment == "Control"), replace = FALSE ), treatment ) ) %>% ungroup() # 验证分组数量是否符合预期 table(metadata_processed$city, metadata_processed$treatment, metadata_processed$time)
方式二:迁移T1组的Treat样本到T0组(保留样本原始处理标签,调整时间)
适合需要将原T1的Treat样本直接转移到T0组,同时移除原T1组对应条目的场景:
library(dplyr) set.seed(123) # 提取需要迁移的样本,将时间改为T0 treat_to_move <- metadata %>% filter(time == "T1", treatment %in% c("Treat1", "Treat2")) %>% mutate(time = "T0") # 保留除迁移样本外的其他条目 remaining_data <- metadata %>% filter(!(time == "T1" & treatment %in% c("Treat1", "Treat2"))) # 合并数据并随机打乱T0组的顺序 metadata_processed <- bind_rows(remaining_data, treat_to_move) %>% arrange(city, time, sample(row_number())) # 验证结果 table(metadata_processed$city, metadata_processed$treatment, metadata_processed$time)
补充说明
- 移除
set.seed(123)可获得每次不同的随机分配结果 - 两种方式的核心差异:方式一修改原T0样本的分组标签,方式二迁移原T1样本到T0组
- 可通过
table()函数快速确认处理后各城市、时间、处理组的样本数量是否符合要求
内容的提问来源于stack exchange,提问作者i.b
相关产品推荐
相关产品推荐

