根据条件重复随机化列

问题描述 投票:0回答:1

我有 9 个测试,4 个级别。我的目标是打乱测试和关卡顺序,确保每个 9 个测试序列仅包含一次测试。我想重复几次(例如 14 次)。

这是我的数据框的示例:

测试 级别
C 1
V 1
OB 1
1
国标 1
总经理 1
SA 1
SG 1
T 1
C 2
V 2
OB 2
2
国标 2
总经理 2
SA 2
SG 2
T 2
C 3
V 3
OB 3
3
国标 3
总经理 3
SA 3
SG 3
T 3
C 4
V 4
OB 4
4
国标 4
总经理 4
SA 4
SG 4
T 4

这是我要创建的数据框的示例:

7548
序列 重复1 重复2
1 C2 OB2
1 GB4 T2
1 GM1 SA2
1 OB1 V1
1 OM1 OM2
1 SA4 GM3
1 SG4 SG2
1 T4 GB4
1 V4 C1
2 C1 C4
2 GB3 GB2
2 GM4 OM3
2 OB4 SG1
2 OM3 V2
2 SA1 OB4
2 SG3 SA4
2 T2 GM2
2 V2 T1
3 C4 T3
3 GB2 C3
3 GM2 OB3
3 OB2 GM1
3 OM2 SA1
3 SA2 OM2
3 SG2 GB1
3 T1 V3
3 V1 SG4
4 C3 OM1
4 GB1 V4
4 GM3 OB1
4 OB3 C2
4 OM4 GB3
4 SA3 T4
4 SG1 SG3
4 T3 SA3
4 V3 GM4

我尝试了以下操作,使用 df 作为我的数据框(基于之前的 stackoverflow 答案:根据使用 R 的条件对数据框中的行进行随机排列):

df$code<-paste(df$test,df$level) set.seed(123) H1 <- df %>% split(f = as.factor(.$test)) %>% map_dfr(~sample(.x$code)) %>% pivot_longer(everything(), names_to = "test", values_to = "code") def <- H1$code repetition = 1 while (repetition < 15){ tempo <- df %>% split(f = as.factor(.$test)) %>% map_dfr(~sample(.x$code)) %>% pivot_longer(everything(), names_to = "test", values_to = "code") def <- cbind(def, tempo$code) repetition = repetition + 1 } def <- as.data.frame(def) def['sequence'] <- NA def[c(1:9), 15] = "1" def[c(10:18), 15] = "2" def[c(19:27), 15] = "3" def[c(28:36), 15] = "4"
忘记了它可能不是很优雅这一事实,这段代码只能部分工作。我确实得到了一个包含 15 列的数据框。对于 9 个测试的每个序列,我没有重复相同的测试,并且列内和列之间的级别顺序得到了很好的洗牌。但是,所有列都具有相同的测试顺序。这是我获得的数据框的示例:

序列重复1重复21C2C11GB4GB41GM1GM31OB1OB21OM1OM21SA4SA21SG4SG21T4T21V4V12C1C42GB3GB22GM4GM22OB4OB42OM3OM32SA1SA42SG3SG12T2T12V2V2
我应该在代码中更改哪些内容,以便在我的列中随机化级别和测试顺序?

非常感谢您的帮助!

r random conditional-statements repeat shuffle
1个回答
0
投票
也许是这样的

library(dplyr) set.seed(42) df %>% mutate(repetition := replicate(14, paste0(sample(test[level==1]), sample(level))))
输出

test level repetition.1 repetition.2 repetition.3 repetition.4 repetition.5 1 C 1 C3 OB1 OM3 SG4 C4 2 V 1 GB1 SG1 C4 SA4 GB2 3 OB 1 T3 SA3 T2 OB4 OB3 4 OM 1 SA3 C4 V4 GM4 GM4 5 GB 1 V3 GB3 GM2 GB1 V3 6 GM 1 OM2 V1 OB2 OM3 SA1 7 SA 1 SG2 OM3 SG1 C4 OM4 8 SG 1 OB1 T2 SA3 V4 T2 9 T 1 GM1 GM1 GB3 T3 SG4 10 C 2 C4 OB1 OM2 SG2 C1 11 V 2 GB1 SG1 C4 SA1 GB4 12 OB 2 T1 SA2 T4 OB2 OB2 13 OM 2 SA2 C1 V1 GM3 GM3 14 GB 2 V3 GB1 GM3 GB2 V4 15 GM 2 OM4 V2 OB1 OM1 SA1 16 SA 2 SG1 OM4 SG1 C1 OM3 17 SG 2 OB1 T1 SA2 V3 T3 18 T 2 GM4 GM2 GB2 T4 SG1 ... etc
    
© www.soinside.com 2019 - 2024. All rights reserved.