我有4支球队(A-D)和4场比赛(1-4)。
目标:我想生成一个dataframe(4,4):
- 四排四轮
- 有四个栏目,四场比赛
- 我想在这4行/轮中为每列/游戏分配一个不同的团队
- 并且我不希望行或列中有重复项
我知道如何进行排列,我知道如何避免每行中的重复,但当我试图避免行和列中的重复时,我被卡住了。
最后,我想得到一个像这样的 Dataframe (没有水平或垂直重复):
A B C D
B D A C
D C B A
C A D B
显然,在现实中,我有更多的游戏和团队!
有人能帮我吗?
谢谢你,谢谢!
编辑:
感谢你们所有人!超级有用。
我也希望能够在我得到的输出中修复一些位置(最后一个是12场比赛和12支球队)。
例如,我希望能够指定几个固定位置,例如:B必须在位置(1,2)***AND**D必须在位置(4,3),ANDetc*.
你知道如何得到满足这些条件的拉丁方吗?
4条答案
按热度按时间13z8s7eq1#
我认为你的问题相当于在向量中循环。即,从ABCD开始,移动一个BCDA,等等。我们可以这样做,例如。像这样:
7vux5j2d2#
行或列中没有重复对我来说听起来像Latin square。
magic
软件包可能对此有所帮助对于您的示例,我们可以使用现有的带有字母或团队名称的
x
,然后转换为 Dataframe 。这取决于用例,如果你想需要一个完整的其他包,特别是当一个很好的答案,如何做到这一点,在基地R已经提交。
7z5jn7bk3#
随机一个示例
如果你只需要一个随机的拉丁方阵,你可以定义一个函数如下
或更轻(* 更高效 *)的
embed
版本你可以得到一个矩阵
所有有效矩阵
如果你没有大量的团队,你绝对可以使用蛮力方法来枚举所有的拉丁方块。因为你只有**
4
**队,所以我不认为所有排列都会消耗太多时间,即choose(prod(1:4), 4) * prod(1:4) = 255024
排列。例如,我们可以运行下面的代码
或基于
RandLatinSqr2
的***更高效的***版本(由于所有拉丁方在行/列排列的意义上都是均匀可变的)***或者你可以定义一个自定义函数(base R),如下所示
标杆管理
给
iszxjhcz4#
关于你最近编辑的带有约束的问题,例如,
B
和D
分别固定在(1,2)
和(4,3)
的位置,你可以有以下两个基于AllLatinSqrtConstr2
和AllLatinSqrtConstr3
的变体。请注意,类似的想法可以应用于
RandLatinSqr
,因此在此答案中跳过。代码
或
输出
给定输入数据
v <- LETTERS[1:4]
和