2016-11-22 30 views
1

说我有一个载体,排列的矩阵为独特的行和列

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)) 

我布置成矩阵的6×6。

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 
+0

这实际上是一个R编码问题,而不是一个统计问题。这里的话题不在话下,而应该在[SO]的话题上。如果您稍等,我们可以为您迁移。 – gung

+0

有趣。我发布在SO上。它被低估了很多,说这个问题不明确,不是编程问题等,也不适合SO。所以我把它发布到CrossValidated上,现在它又被迁移到了SO。 – rmf

+1

人们的观点有一些奇怪的怪癖。'如何让R给出排列'和'如何重新排列矩阵',显然是编码问题,并且根本不是关于统计的,海事组织。 – gung

回答

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 

从这里获得实际的排列,我们将使用permute库在R。由于置换的总数较大,我们将不得不设置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()比所有元素使用较少。这是一个简单的kludge来解决这个问题:

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 
+0

这令人印象深刻。但是,“out”是一个8x6矩阵,而它应该是一个6x6矩阵。 'table(as.vector(out))'每个返回1:9。它必须是每个1:9 4。无论如何,这是我开始摆弄的好地方。非常感谢。 – rmf

+0

嗯,好点,我没有仔细看。当我有机会时,我会再看一次。我现在很忙。 – gung