在R中获得成对排列

时间:2015-04-19 01:35:55

标签: r combinations permutation random-sample

背景信息:我有一个名为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只给了我一组对决。

1 个答案:

答案 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" 

让我检查是否可以轻易删除重复。