【问题标题】:Arrange a matrix into unique rows and columns将矩阵排列成唯一的行和列
【发布时间】:2016-11-22 09:14:28
【问题描述】:

假设我有一个向量,

vec <- c(rep(1,4),rep(2,4),rep(3,4),rep(4,4),rep(5,4),rep(6,4),rep(7,4),rep(8,4),rep(9,4))

我排列成一个 6x6 的矩阵。

mat <- matrix(vec,6,byrow=T)

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    1    2    2
[2,]    2    2    3    3    3    3
[3,]    4    4    4    4    5    5
[4,]    5    5    6    6    6    6
[5,]    7    7    7    7    8    8
[6,]    8    8    9    9    9    9

我希望将数字随机排列,以使它们对于每一行和每一列都是唯一的。或者换句话说,任何行或列中都不能有重复的数字。

向量的长度,向量的元素,矩阵的行数和列数都是固定的。唯一可以改变的是数字的位置。

我将如何通过计算解决这个问题?

以下是一种可能的正确结果(手动完成)。请注意,没有行或列有任何重复的数字。

res <- matrix(c(3,1,2,5,7,8,6,8,5,2,9,4,8,6,7,4,3,5,2,9,3,1,6,7,1,4,9,7,5,6,4,2,1,9,8,3),nrow=6,byrow=T)

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    3    1    2    5    7    8
[2,]    6    8    5    2    9    4
[3,]    8    6    7    4    3    5
[4,]    2    9    3    1    6    7
[5,]    1    4    9    7    5    6
[6,]    4    2    1    9    8    3

table(res)

res
1 2 3 4 5 6 7 8 9 
4 4 4 4 4 4 4 4 4

【问题讨论】:

  • 这实际上更像是一个 R 编码问题,而不是一个关于统计的问题。这里不在主题范围内,但应该在 Stack Overflow 上讨论主题。如果您稍等片刻,我们可以为您迁移。
  • 有趣。我在SO上发布了这个。很多人反对说这个问题不清楚,不是编程问题等,不适合 SO。于是我在 CrossValidated 上发布了,现在又迁移到 SO 了。
  • 人们的看法有些奇怪。 “如何让 R 给出排列”和“如何重新排列矩阵”显然是编码问题,而不是关于统计数据,IMO。

标签: r matrix combinatorics


【解决方案1】:

首先,有一个更好的方法来获取你的向量。这将需要更少的输入并使您的代码更清晰:

vec <- rep(1:8, each=4)
mat <- matrix(vec, ncol=6, byrow=T)

接下来,请注意您要求按行对元素进行唯一排序。也就是说,您想要元素的permutationsN 元素的唯一排列数为 N!。我们可以在R 中计算这个数字:

factorial(length(unique(vec)))
# [1] 40320

这比您需要的数量要多得多。 (看来您只想要 6 个。)假设您想绘制一些随机排序,让我们从可能的 40320 中抽取 6 个数字:

set.seed(3931)  # this makes the example exactly reproducible
rows <- sample.int(40320, 6)
rows
# [1] 36601 24136  5713 23405 25328 32973

为了得到实际的排列,我们将使用R 中的permute 库。因为排列的总数很大,我们必须将maxperm 参数设置为大于其默认值(9999,我收集):

library(permute)
out <- allPerms(unique(vec), control=how(maxperm=41000))[rows,]
out
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,]    8    2    7    1    3    4    6    5
# [2,]    5    7    4    1    6    8    2    3
# [3,]    2    1    8    6    3    4    7    5
# [4,]    5    6    4    1    2    8    7    3
# [5,]    6    1    3    2    5    7    4    8
# [6,]    7    4    6    5    8    2    3    1

我很抱歉误读了这个问题。 N 元素的排列数,当你只使用它们中的r 时,是N!/r!。这是一个简单的计算:

factorial(length(unique(vec))) / factorial(length(unique(vec))-6)
# [1] 20160

我不清楚如何让allPerms() 使用少于所有元素。这是一个简单的解决方法:

library(permute)
out <- allPerms(unique(vec), control=how(maxperm=41000))[rows,1:6]
out
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    8    2    7    1    3    4
# [2,]    5    7    4    1    6    8
# [3,]    2    1    8    6    3    4
# [4,]    5    6    4    1    2    8
# [5,]    6    1    3    2    5    7
# [6,]    7    4    6    5    8    2

【讨论】:

  • 这令人印象深刻。但是,out 是一个 8x6 矩阵,而它应该是一个 6x6 矩阵。 table(as.vector(out)) 也返回 1:9 6 每个。必须是 1:9 4 每个。无论如何,这是我开始摆弄的好地方。非常感谢。
  • 嗯,好点,我看的不够仔细。有机会我再看看。我现在很忙。
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多