在这里得到很好的帮助以随机化矩阵而不重复行和列(Fixed values not repeated over column and row)我有另一个关于修改的问题。
所以,首先从已经完成的事情开始:我想要一个矩阵,其中随机行和列没有重复(行和列)。再次感谢这里的帮助,这是jdobres的代码(https://stackoverflow.com/users/6436545/jdobres)我最终使用了:
# 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
> # 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
但是我现在遇到的问题是我希望我的第一行(比如第1,2,3行)按特定顺序修复。然而,我需要新的第4到10行再次随机化,没有重复(也没有重复的行1-3)!
例如,我有3行,如下所示:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 8 7 3 6 9 5 10 2 4 1
[2,] 6 5 1 4 7 3 8 10 2 9
[3,] 5 4 10 3 6 2 7 9 1 8
但接下来的7行我想要随机但不重复(在任何行或列中)值而不改变第一行......
有什么想法吗?我无法弄清楚如何排除我想留下的那些(第1-3行),但在其余的行和列中仍然没有重复......
再次感谢您的帮助!
编辑:
非常感谢 Moody_Mudskipper 为您提供帮助!这就是使用我的(假)数据的解决方案:
mat<-as.matrix(first.rows)
nkeep <- 3
mat_shuffled <- mat[c(1:nkeep,sample((nkeep+1):nrow(mat),replace=FALSE)),]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
row1 1 4 7 6 5 3 2 8 9 10
row2 10 7 3 2 1 4 5 9 8 6
row3 9 2 4 3 5 7 10 1 6 5
10 7 9 6 8 2 5 4 3 1
1 10 8 4 7 3 5 2 6 9
10 6 4 1 8 3 7 2 5 9
2 5 7 8 9 6 1 3 4 10
2 1 10 4 8 9 3 6 5 7
8 5 3 2 4 1 10 7 6 9
6 1 5 4 2 10 3 8 7 9
谢谢你!!
查看Constructing a randomised matrix with no duplicates but fixed partial input以获得费尔南多的解决方案,这也解决了专栏中的价值
答案 0 :(得分:0)
这会有用吗?
mat <- matrix(1:100,10)
nkeep <- 3
mat_shuffled <- mat[c(1:nkeep,sample((nkeep+1):nrow(mat),replace=FALSE)),]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 1 11 21 31 41 51 61 71 81 91
# [2,] 2 12 22 32 42 52 62 72 82 92
# [3,] 3 13 23 33 43 53 63 73 83 93
# [4,] 6 16 26 36 46 56 66 76 86 96
# [5,] 10 20 30 40 50 60 70 80 90 100
# [6,] 7 17 27 37 47 57 67 77 87 97
# [7,] 4 14 24 34 44 54 64 74 84 94
# [8,] 5 15 25 35 45 55 65 75 85 95
# [9,] 9 19 29 39 49 59 69 79 89 99
# [10,] 8 18 28 38 48 58 68 78 88 98