如何在R中按条件重复代码:24名参与者的平衡设计需求
解决方案:为24名参与者生成符合Random列一致性要求的实验数据
我来帮你搞定这个需求!核心是要先统一全局的Random列规则,再给每个参与者生成对应的数据,这样就能保证Target == 0时,每个(Trial, Route, Scene2)组合下所有参与者的1和0总数完全一致,不用手动重复执行24次代码还得对齐数据。
步骤1:定义基础实验参数
先把实验的固定参数明确下来,你可以根据实际需求调整数值:
# 基础配置参数 num_participants <- 24 # 参与者总数 scene2_vals <- 1:10 # Scene2的取值范围 trial_vals <- 1:9 # Trial的取值范围 route_vals <- 1:3 # 假设Route的取值是1-3,可替换为你的实际取值 random_count_target0 <- c(8, 16) # Target=0时,每个组合下24个参与者的1和0数量(例:8个1,16个0)
步骤2:创建全局Random映射表
这是保证一致性的关键步骤——我们先为所有Target == 0的(Trial, Route, Scene2)组合预生成24个Random值,确保每个组合的1/0数量固定。对于Target == 1的场景(比如Scene2=7),你可以自定义Random规则:
# 生成所有可能的(Trial, Route, Scene2)组合 all_combinations <- expand.grid( Trial = trial_vals, Route = route_vals, Scene2 = scene2_vals ) # 为每个组合生成对应24个参与者的Random值 all_combinations$Random_list <- lapply(1:nrow(all_combinations), function(i) { current_scene2 <- all_combinations$Scene2[i] if (current_scene2 == 7) { # Target=1的场景,自定义Random规则(示例:全1,可按需修改) rep(1, num_participants) } else { # Target=0的场景,生成固定数量的1和0后打乱顺序 c(rep(1, random_count_target0[1]), rep(0, random_count_target0[2])) %>% sample() # 打乱顺序避免参与者的Random值固定排序 } })
步骤3:为每个参与者生成数据并合并
现在循环为每个参与者生成专属数据框,从全局映射表中取出对应的Random值:
# 初始化空列表存储每个参与者的数据 participant_dfs <- list() for (part_num in 1:num_participants) { # 生成基础数据结构并排序(和映射表顺序对齐) part_df <- expand.grid( Trial = trial_vals, Route = route_vals, Scene2 = scene2_vals ) %>% arrange(Trial, Route, Scene2) # 添加Target列 part_df$Target <- ifelse(part_df$Scene2 == 7, 1, 0) # 从全局映射表中取出当前参与者的Random值 part_df$Random <- sapply(all_combinations$Random_list, function(x) x[part_num]) # 添加参与者标识 part_df$Participant <- paste0("Part.", part_num) # 存入列表 participant_dfs[[part_num]] <- part_df } # 合并所有参与者的数据为最终数据框 final_df <- do.call(rbind, participant_dfs)
验证一致性是否达标
你可以用下面的代码检查是否满足需求:
# 检查Target=0时,每个(Trial, Route, Scene2)组合的Random列1的总数 final_df %>% filter(Target == 0) %>% group_by(Trial, Route, Scene2) %>% summarise(total_ones = sum(Random), .groups = "drop") %>% pull(total_ones) %>% unique() # 如果输出是单一值(比如示例中的8),说明所有组合的1数量完全一致,符合要求
这个方案不用手动重复执行24次代码,通过全局映射表严格保证了Random列的数量一致性,你只需要调整基础参数就能适配你的实际实验设置。
内容的提问来源于stack exchange,提问作者dede
相关产品推荐
相关产品推荐

