【发布时间】:2020-03-14 03:04:50
【问题描述】:
我正在尝试用 R 解决这个问题:在所有可能的字母组合中,我想随机选择 13 对的样本,条件是不重复任何字母。
我正在尝试以下方法:
x<- LETTERS
combi <- combn(x, 2, FUN = NULL, simplify = FALSE) #combines by 2
fulltable <- data.frame(Reduce(rbind, combi)) #Convert list to dataframe of 2 columns
它给了我 323 种可能的组合:
...
X.316 V Y
X.317 V Z
X.318 W X
X.319 W Y
X.320 W Z
X.321 X Y
X.322 X Z
X.323 Y Z
我想选择一个样本 - 让我们称之为 SET1 - 13 对字母(总共有 26 个字母),其中没有重复的字母。 然后,一旦创建了这些对,我想提取另一个具有相同条件的样本,但在这种情况下,不包括 SET1。
期望的结果:
X.1 A E
X.2 C H
X.3 B X
X.4 W Y
X.5 F K
…..
直到 X.13 并且没有字母在行或列中重复。
在第二个样本提取中,再次组合具有唯一字母的对,但在这种情况下,不允许以前的组合(即 A E / C H)。 它还应该排除排列,例如 E A / H C。
谢谢 AJS
编辑--------- 这个解决方案对我有用:
test <- LETTERS
ctest <- combn(test, 2, FUN = NULL, simplify = FALSE)
ctabl <- data.frame(Reduce(rbind,ctest))
ctabl$row <- 1:nrow(ctabl)
for (i in 1:nrow(ctabl)){
sname <- ctabl%>% sample_n(13)
ctabl <- ctabl %>% subset(!row %in% sname$row)
print(sname)
}
【问题讨论】:
-
嗨,欢迎来到 SO!如果您添加了一些您想要的输出的描述,我会很有帮助。例如,您可以发布一个额外的代码面板,显示 SET1 的外观。这会让其他人更容易为您提供帮助。
-
是的,你是对的,输出应该是一个有 2 列的数据框,每一行都有一个唯一的 par。在行或列中不应重复任何字母。例如:A B / C D / E F ...。等将是一个有效的结果。对于上下文:我正在尝试随机配对我公司中的 + 300 位同事进行网络活动,:)。此活动将每周重复一次,因此我需要排除以前的组合,并且每个同事应该只计算一次。