Fixed values not repeated over column and row

前端 未结 2 1318
夕颜
夕颜 2021-01-24 07:07

I want to create a matrix in R with a set number of variables (e.g. 1 to 10). Those variables should be randomly assigned over rows and columns BUT should not be repeated in eit

2条回答
  •  情深已故
    2021-01-24 07:36

    Unless I'm misunderstanding the problem, there's a much simpler way to create this shuffled matrix, without any loops or complicated conditional statements.

    # number of rows and columns
    n <- 10
    
    # create ordered rows and columns
    ordered.by.row <- matrix(1:n, n, n)
    ordered.by.col <- matrix(1:n, n, n, byrow = T)
    
    # offset the rows and columns relative to each other.
    # no row or column has a repeated value, but the values are still ordered
    offset <- (ordered.by.row + ordered.by.col) %% n + 1
    
    # shuffle the columns, then shuffle the rows, this produces a randomized matrix
    # 'shuffle.row' is the final, randomized matrix
    set.seed(1222) # change this to change randomization
    shuffle.col <- offset[,sample(1:n, n, replace = F)]
    shuffle.row <- shuffle.col[sample(1:n, n, replace = F), ]
    
    # verify solution
    any(apply(shuffle.row, 1, function(r)any(duplicated(r)))) # FALSE
    any(apply(shuffle.row, 2, function(r)any(duplicated(r)))) # FALSE
    
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]    1   10    6    9    2    8    3    5    7     4
     [2,]    3    2    8    1    4   10    5    7    9     6
     [3,]    7    6    2    5    8    4    9    1    3    10
     [4,]    9    8    4    7   10    6    1    3    5     2
     [5,]   10    9    5    8    1    7    2    4    6     3
     [6,]    2    1    7   10    3    9    4    6    8     5
     [7,]    8    7    3    6    9    5   10    2    4     1
     [8,]    6    5    1    4    7    3    8   10    2     9
     [9,]    5    4   10    3    6    2    7    9    1     8
    [10,]    4    3    9    2    5    1    6    8   10     7
    

提交回复
热议问题