背景信息:我有一个名为teamNames
的运动队名单,我希望每周都能产生比赛。我不确定排列是否是正确的方法,但我觉得它们会是。我理想的是将团队名称的向量传递给一个函数,然后让它给我一个矩阵,其中每一行都有不同顺序的团队名称向量,这样如果我成对地遍历它们,我我会为每一行获得一组独特的对决。
例如,如果我的输入是teamNames <- c("a", "b", "c", "d")
,我希望输出是一个矩阵,表示:
a b c d
a c b d
a d c b
编辑:进一步澄清:在这种情况下,矩阵给了我三个“周”的对决。第一周:“a”与“b”和“c”与“d” 第二周:“a”与“c”和“b”与“d” 第三周:“a”与“d”和“b”与“c”
我从阅读其他问题中得到的最接近的是使用permutations
包中的gtools
函数,如下所示:
permutations(length(teamNames), 2, teamNames)
这会产生所有可能的匹配,但它没有做的是将它们分成几组/周。 combinations(length(teamNames), 4, teamNames
只给了我一组对决。
答案 0 :(得分:0)
如果我理解正确,如果从4支球队中选出2支球队,其余两支球队必须配对。然后选择2中的2个。排列可能不会被应用为'a vs b'=='b vs a'。不需要额外的包,因为utils包有combn()。
> combn(teamNames, 2)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a" "a" "a" "b" "b" "c"
[2,] "b" "c" "d" "c" "d" "d"
上图显示从4中选择2个队伍并且有一些重复 - 选择a和b等于选择c和d。如果其中一个重复案例被取消,那么可以设置一个时间表。
@ Buckminster - 我不断更新代码。在此更新中,其余两个更新,但仍有重复。此外,在4中,如果确定2,则必须能够确定其余两个(如何求解线性代数中的方程组是类似的想法)。换句话说,我不确定为什么-1可能是由你给出的。
# Update
teamNames <- c("a", "b", "c", "d")
first <- combn(teamNames, 2, simplify = FALSE)
second <- lapply(first, function(x) teamNames[!teamNames %in% x])
bind <- rbind(do.call(cbind, first), do.call(cbind, second))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a" "a" "a" "b" "b" "c"
[2,] "b" "c" "d" "c" "d" "d"
[3,] "c" "b" "b" "a" "a" "a"
[4,] "d" "d" "c" "d" "c" "b"
让我检查是否可以轻易删除重复。