2016-11-22 59 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