创建没有一个数字的随机矩阵

时间:2019-01-16 14:15:06

标签: r random

我想生成一个大小为n-1 xn的矩阵,以便第i列包含从1到n的所有数字,而不包含i,即第一列应该包含2到n的所有数字,第二列应该包含1,3,4,...,第三个应包含1,2,4,...,依此类推。 任何想法都将受到欢迎。

3 个答案:

答案 0 :(得分:5)

使用./sdkmanager --licenses(虽然不是真正随机的)。

combn

如有必要,请对每一列进行洗牌

n <- 5
out <- combn(n:1, n - 1)
out
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    5    5    5    5    4
#[2,]    4    4    4    3    3
#[3,]    3    3    2    2    2
#[4,]    2    1    1    1    1

如果您要提高效率,请使用我发布的解决方案;)

set.seed(1)
apply(combn(n:1, n - 1), 2, sample)

enter image description here

library(microbenchmark)
n <- 1000
set.seed(1)
benchmark <- microbenchmark(
  akrun = vapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)), numeric(n-1)),
  markus = apply(combn(n:1, n - 1), 2, sample),
  A_Stam = create_matrix(n),
  times = 30L
)

答案 1 :(得分:3)

我们遍历序列'n',获得序列的sample,除了循环数(setdiff

sapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)))
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    2    3    1    3    2    2
#[2,]    5    1    5    6    1    5
#[3,]    6    4    6    2    3    4
#[4,]    3    5    4    1    4    1
#[5,]    4    6    2    5    6    3

如果我们使用vapply

,可以使速度更快一些
vapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)), numeric(n-1))

注意:OP在帖子中提到了random矩阵

数据

n <- 6

答案 2 :(得分:2)

这可能不是最优雅的解决方案,但它可以起作用:

create_matrix <- function(n) {
  m <- c()
  for (i in 1:n) {
    new <- setdiff(1:n, i)
    m <- c(m, new)
  }
  matrix(m, ncol = n, byrow = FALSE)
}

create_matrix(4)

#>      [,1] [,2] [,3] [,4]
#> [1,]    2    1    1    1
#> [2,]    3    3    2    2
#> [3,]    4    4    4    3