【问题标题】:Ordering R to restart a function命令 R 重新启动函数
【发布时间】:2015-03-06 05:41:15
【问题描述】:

我猜我的问题很奇怪。 我正在尝试为我大学的排球队制定时间表,我决定通过 R 来做。我有 21 支球队,其中 16 支球队每周都在比赛。如果一些球队有不同数量的比赛并不重要,因为我们要看看平均结果。

所以我创建了一个非常简单的函数:

play<-function(group){ for (i in 1:1){ playing<-sample(group,16) in1<-sort(playing) in2<-sample(playing) if( sum(in1==in2)==0 ){ games<-rbind(in1,in2) } if( sum(in1==in2)!=0 ){ i<-i-1 } } return(games) }

我的问题是什么? R没有帮助我!如果两个向量 in1 和 in2 在至少一个位置上彼此相等,则不再运行该函数。你们知道为什么吗?你知道我该如何解决这个问题吗?

比赛是本周比赛的球队。 (只有 16 人玩) group 将是一个带有团队名称的向量...(您可以使用 A、B、C、D 作为示例) sample(playing) 只是用 16 个选定的团队随机化向量。当 in1 和 in2 在任何空间都不匹配时,我们可以制作对子进行播放。在检查这一点时,问题来了。 :/

谁能帮帮我?谢谢

【问题讨论】:

  • for (i in 1:1) 永远只会运行一次。您可能想要while,但我确信总体上有更好的方法。
  • 您是否要制定 16 场比赛的时间表,其中 16 支球队中的每支球队打两场比赛。在一场比赛中,球队出现在第一列(主场比赛?),而在另一场比赛中,球队出现在第二列(客场比赛?)?因此,您想生成 (1:16) 的排列,使得排列的 n-th 元素不是 n?

标签: r function if-statement sample


【解决方案1】:

您的函数通常非常复杂。先对16支球队进行采样,然后让他们互相比赛还不够吗?试试这个:

play <- function(group){
  playing <- sample(group, 16)
  # if you have 16 teams, you really just have 8 games...
  games <- rbind(playing[1:8], 
                 playing[9:16])
  return(games)
}
play(LETTERS[1:21])

【讨论】:

    【解决方案2】:

    1:n 的排列使得没有一个排列在同一个位置被称为“错位”:http://mathworld.wolfram.com/Derangement.html

    因此,如果您有 16 支球队,并且想要安排 16 场比赛,每支球队在主场和客场比赛一次,并且自己不参加比赛,那么您需要计算一个错位。

    所以在 rdocumentation.org 上搜索,PerMallow 包中有一个函数。

    install.packages("PerMallow")
    require(PerMallow)
    

    然后你可以生成一个紊乱(这里大小为 6),因此,作为一个单行矩阵:

    r.derangement(1,6)
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    4    1    5    3    6    2
    

    所以对于名为 A 到 E 的五个团队:

    > teams = LETTERS[1:5]
    > teams
    [1] "A" "B" "C" "D" "E"
    

    您将团队名称与从 1 行矩阵的第一行获得的混乱排序的团队名称绑定:

    > cbind(teams, teams[r.derangement(1,5)[1,]])
         teams    
    [1,] "A"   "E"
    [2,] "B"   "C"
    [3,] "C"   "A"
    [4,] "D"   "B"
    [5,] "E"   "D"
    

    【讨论】:

      猜你喜欢
      • 2014-10-13
      • 1970-01-01
      • 2018-04-26
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      相关资源
      最近更新 更多