如何在R中实现测试与层级双随机化并重复生成序列?
解决方案
针对你的需求,需要同时实现测试序列的随机全排列(每组9个测试无重复)和层级的随机打乱,以下分两种常见的数据结构给出修改后的R代码:
情况1:原始数据为宽格式(4列对应4个层级,每列是9个测试)
如果你的原始DataFrame是4列(每个层级一列),每列包含完整的9个测试,当前代码仅打乱了列的顺序(层级)但未打乱每列内的测试顺序,修改方式如下:
# 示例原始数据 original_df <- data.frame( Level1 = paste0("Test_", 1:9), Level2 = paste0("Test_", 1:9), Level3 = paste0("Test_", 1:9), Level4 = paste0("Test_", 1:9) ) set.seed(123) # 可选,设置种子保证结果可复现 n_repeats <- 14 # 生成14组随机序列 result_list <- lapply(1:n_repeats, function(x) { # 第一步:随机打乱层级(列)的顺序 shuffled_level_cols <- sample(ncol(original_df)) temp_df <- original_df[, shuffled_level_cols] # 第二步:对每个层级列单独随机打乱测试顺序(全排列,保证无重复) temp_df[] <- lapply(temp_df, sample) temp_df }) # 可选:将14组合并为带组标识的DataFrame library(dplyr) final_df <- bind_rows(result_list, .id = "Repeat_Group")
这段代码会让每组的层级顺序随机,且每个层级列内的测试都是9个不重复的随机排列,每组的测试序列相互独立。
情况2:原始数据为长格式(每行是一个测试+对应层级)
如果你的原始DataFrame是长格式(比如共36行:9个测试×4个层级),需要生成14组,每组包含9个不重复的测试,同时层级也随机分配,修改方式如下:
# 示例原始数据 original_long_df <- data.frame( test = rep(paste0("Test_", 1:9), 4), level = rep(c("Level1", "Level2", "Level3", "Level4"), each = 9) ) set.seed(123) n_repeats <- 14 result_list <- lapply(1:n_repeats, function(x) { # 随机生成9个测试的全排列(无重复) shuffled_tests <- sample(unique(original_long_df$test)) # 随机分配层级(若需保持原始层级出现次数,可替换为sample(original_long_df$level, 9)) shuffled_levels <- sample(c("Level1", "Level2", "Level3", "Level4"), 9, replace = TRUE) data.frame(Repeat_Group = x, Test = shuffled_tests, Level = shuffled_levels) }) final_df <- bind_rows(result_list)
如果需要严格保持每个层级在每组中的出现次数与原始数据一致,只需将shuffled_levels的生成代码替换为:
shuffled_levels <- sample(original_long_df$level, 9)
内容的提问来源于stack exchange,提问作者Melissa Peignier
相关产品推荐
相关产品推荐

