【问题标题】:Getting paired permutations in R在 R 中获得配对排列
【发布时间】:2015-06-25 19:39:39
【问题描述】:

上下文:我有一个名为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”

我从阅读其他问题中得到的最接近的是使用 gtools 包中的 permutations 函数,如下所示: permutations(length(teamNames), 2, teamNames) 这会生成所有可能的匹配,但它不会将它们分成组/周。 combinations(length(teamNames), 4, teamNames 只给了我一组对局。

【问题讨论】:

标签: r combinations permutation random-sample


【解决方案1】:

如果我理解正确的话,如果从 4 支球队中选出 2 支球队,剩下的两支球队必须匹配。然后它从 4 个中选择 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" 

让我检查一下是否可以轻松删除重复项。

【讨论】:

  • OP 提供了一个只有四个团队的玩具示例。他/她正在寻找一个可以推广到超过四个团队的解决方案。
  • @ Buckminster (1) 我不确定为什么你的第一个和第二个 cmets 不一致。为了回复您的第一条评论,我刚刚提到正在进行更新,但没有提及 # 个团队。 (2) 对于 4 支球队,确定 2 支球队就足以确定 4 支球队。 (3)偶数队的情况不会有太大的不同(例如,在6支球队中确定2支球队必须确定4支球队)。 (4) 是的,我添加的代码不完整,可能没有帮助。但是我不认为应该给出-1,因为至少我花了一些时间。
  • @JaehyeonKim 虽然这不是我想要的,但我感谢您的帮助。我赞成您的回答以取消否定的回答。
猜你喜欢
  • 1970-01-01
  • 2022-07-15
  • 2018-03-24
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多