在R中生成矩阵的所有排列

5

我有一个矩阵M,如下所示:

M <- matrix(1:6, nrow=2, byrow=TRUE)

1 2 3
4 5 6

我希望能够将这个矩阵的所有可能排列生成为一个列表。在阅读了在R中生成所有不同排列的列表之后,我尝试使用以下代码:

library(combinat)
permn(M)

但是这样只会给我所有的排列方式,而不是我最初期望的2 x 3矩阵。

因此我得到的结果类似于

[[1]]
[1] 1 4 2 5 3 6

[[2]]
[1] 1 4 2 5 6 3

[[3]]
[1] 1 4 2 6 5 3
 ...
[[720]]
[1] 4 1 2 5 3 6

但我想让第一行和第二行相互区分,所以列表应该像以下这样:
[[1]]
1 2 3
4 5 6

[[2]]
1 3 2
4 5 6

[[3]]
2 3 1
5 4 6
...

我需要获取M的所有可能组合。有没有在R中实现这个目标的方法?

谢谢!


2
lapply(permn(ncol(M)), function(x) M[, x]) 或类似的代码。 - Frank
1
弗兰克,这样对吗?第一行的每个排列不应该与第二行的每个排列配对吗?(即查看解决方案的前两个条目) - user20650
哦,我明白了,你是独立地对行进行排列?对于一个中等大小的矩阵来说,这是很多组合...嗯,不确定该怎么做。 - Frank
lapply(permn(M),matrix,nrow=2) - Ben Bolker
@Frank - 是的,我正在尝试独立地对每一行进行排列,以获得M的所有可能排列。 - Nel Lau
如果您想独立地对每一行进行排列,这意味着数字1永远不会出现在第二行,数字4永远不会出现在第一行。这意味着您将无法获得M的所有可能排列,因为交换1和4是其中一种可能的排列。 - perfectlyGoodInk
1个回答

1
这样怎么样,使用 expand.grid 来获取所有组合的可能性?
M <- matrix(1:6, nrow=2, byrow=TRUE)

pcM <- permn(ncol(M))
expP <- expand.grid(1:length(pcM), 1:length(pcM))

Map(
  function(a,b) rbind( M[1, pcM[[a]]], M[2, pcM[[a]]] ),
  expP[,1],
  expP[,2]
)

#[[1]]
#     [,1] [,2] [,3]
#[1,]    1    2    3
#[2,]    4    5    6
#
#...
#
#[[36]]
#     [,1] [,2] [,3]
#[1,]    2    1    3
#[2,]    5    4    6

如何扩展到更多行? - Frank
1
@Frank - 我会把这个留给 OP 处理 - expP <- do.call(expand.grid, rep(list(1:length(pcM)), nrow(M)) ) 这段代码可以涵盖第一部分。 - thelatemail
@thelatemail - 当我尝试了你的实现后,我发现它似乎是对每一列进行排列,但我想要独立地对每一行中的数字进行排列,以获得M的所有可能组合。 - Nel Lau
1
@NelLau 这对我有效,也许尝试运行这个答案中的代码,看看是否符合您的期望。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接