如何将一组数字随机分配给R中的矩阵

问题描述 投票:1回答:1

我需要为矩阵随机分配固定数字,即“x”,“y”,“z”等。我怎样才能做到这一点?我确实搜索了它,但他们都解释了如何用随机数制作矩阵。但我的数字不是随机的。我知道在矩阵中我想要什么数字,我不知道如何将它们随机分配到我的矩阵中。我不能写任何代码行来把它放在这里来纠正它。

这是一个例子。假设我有数字1和1.2。我想生成一个20 * 10矩阵,其元素从1和1.2中随机选择。示例矩阵如下所示:

1    1     1.2  1
1.2  1     1.2  1.2
1    1.2   1    1.2
1    1.2   1    1

每个数字应至少在每行中出现一次。

非常感谢

r matrix
1个回答
4
投票

Solution

t(replicate(20, sample(c(1, 1.2, sample(c(1, 1.2), 8, replace = TRUE)))))

Explanation

sample(c(1, 1.2, sample(c(1, 1.2), 8, replace = TRUE)))

创建一个随机排序的10个样本,确保其中一个元素为1,其中一个元素为1.2,另外8个将从1和1.2中随机选择。

t(replicate(20, sample(c(1, 1.2, sample(c(1, 1.2), 8, replace = TRUE)))))

这样做了20次并将答案转换成你想要的尺寸。

UPDATE

在收到其他评论后,您似乎需要完成两件事:

  1. 创建一个随机填充x值的n×m矩阵,其约束条件是结果矩阵的每一行至少包含一次x的每个元素。
  2. 创建一个随机填充x值的n×m矩阵,其约束条件是结果矩阵的每一行都有多个唯一值。

所以,在这一点上,我建议创建函数:

f1 <- function(x, n, m) {
    N <- length(x)
    if ( N > m ) {
        stop('x is longer than the number of columns requested.', call. = FALSE)
    }
    return(t(replicate(n, sample(c(x, sample(x, m - N, replace = TRUE))))))
}

f2 <- function(x, n, m) {
    if ( length(unique(x)) == 1 ) {
        stop('x has only one unique element.', call. = FALSE)
    }
    result <- t(replicate(n, sample(x, m, replace = TRUE)))
    while ( any(apply(result, 1, function(x) length(unique(result)) == 1)) ) {
        result <- t(replicate(n, sample(x, m, replace = TRUE)))
    }
    return(result)
}

(如果我是你,我也会给那些功能更多信息的名字)。

f1()完成了我的原始答案(对应于上面的数字1)任意xnmf2()完成了新的请求(对应上面的第2条);然而,请注意,可能有更好的方法来完成这项任务,这种方法(一个while循环)可能需要任意数量的时间取决于xnm和机会的值。以下是函数的示例调用:

set.seed(1234)
x <- c(1, 1.2)
f1(x, 20, 10)

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]  1.2  1.2  1.2  1.2  1.2  1.0  1.2  1.0  1.0   1.0
 [2,]  1.0  1.0  1.0  1.0  1.0  1.2  1.0  1.0  1.0   1.2
 [3,]  1.0  1.2  1.2  1.2  1.2  1.2  1.0  1.0  1.2   1.0
 [4,]  1.2  1.0  1.2  1.0  1.2  1.0  1.2  1.2  1.0   1.0
 [5,]  1.2  1.0  1.2  1.2  1.0  1.0  1.2  1.0  1.0   1.0
 [6,]  1.2  1.0  1.0  1.0  1.2  1.0  1.2  1.0  1.0   1.0
 [7,]  1.2  1.0  1.0  1.0  1.2  1.2  1.0  1.0  1.0   1.2
 [8,]  1.0  1.0  1.2  1.0  1.2  1.2  1.0  1.0  1.0   1.2
 [9,]  1.0  1.2  1.2  1.2  1.2  1.2  1.0  1.2  1.0   1.0
[10,]  1.0  1.2  1.2  1.0  1.0  1.0  1.2  1.0  1.0   1.0
[11,]  1.0  1.2  1.0  1.2  1.0  1.2  1.2  1.0  1.2   1.0
[12,]  1.2  1.2  1.2  1.0  1.2  1.2  1.0  1.2  1.2   1.2
[13,]  1.2  1.0  1.0  1.2  1.2  1.0  1.2  1.0  1.0   1.0
[14,]  1.2  1.0  1.2  1.0  1.2  1.0  1.0  1.0  1.2   1.0
[15,]  1.2  1.0  1.0  1.2  1.2  1.2  1.0  1.0  1.0   1.0
[16,]  1.0  1.2  1.2  1.2  1.2  1.0  1.2  1.0  1.0   1.2
[17,]  1.2  1.2  1.0  1.2  1.2  1.2  1.0  1.2  1.2   1.0
[18,]  1.2  1.0  1.0  1.0  1.2  1.2  1.0  1.2  1.2   1.2
[19,]  1.2  1.2  1.0  1.0  1.2  1.0  1.2  1.2  1.0   1.0
[20,]  1.2  1.0  1.2  1.0  1.0  1.2  1.0  1.2  1.0   1.2

x <- c(1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.6, 2.8, 3)
f2(x, 20, 10)

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]  1.0  2.2  2.0  1.6  2.8  3.0  2.4  1.4  2.8   2.4
 [2,]  3.0  1.4  2.8  2.0  1.6  1.8  2.6  1.2  1.8   2.4
 [3,]  1.6  1.4  1.0  1.2  1.4  1.2  2.4  1.4  3.0   3.0
 [4,]  2.4  2.6  2.6  2.4  1.2  3.0  2.2  2.0  1.0   1.8
 [5,]  2.4  1.8  2.6  2.6  2.2  1.4  2.6  1.2  2.2   1.8
 [6,]  2.6  2.6  3.0  1.4  2.8  1.8  2.0  2.6  1.2   1.8
 [7,]  2.4  2.8  1.6  1.2  3.0  1.4  1.0  1.8  1.6   1.6
 [8,]  2.4  2.6  1.8  3.0  1.4  2.4  1.8  3.0  2.6   2.2
 [9,]  2.6  2.8  2.6  2.0  3.0  2.2  2.8  2.2  2.2   1.0
[10,]  1.4  2.6  3.0  3.0  2.6  2.4  1.4  2.2  2.2   1.0
[11,]  1.8  2.8  1.8  2.0  1.2  1.4  2.2  1.8  2.2   2.2
[12,]  1.2  1.6  1.0  3.0  1.8  3.0  2.0  2.0  2.4   1.2
[13,]  2.0  2.2  2.4  1.8  1.2  1.0  2.6  2.4  2.6   1.2
[14,]  2.2  2.6  3.0  1.6  2.4  1.6  2.2  1.0  2.2   2.2
[15,]  2.4  2.6  2.8  1.0  2.4  2.8  2.6  2.8  1.2   2.6
[16,]  1.6  3.0  3.0  2.2  1.2  2.6  2.2  1.0  2.4   1.6
[17,]  2.8  1.4  1.6  3.0  2.2  2.6  1.0  1.0  2.2   1.4
[18,]  1.4  2.2  1.8  2.6  1.2  3.0  2.4  2.4  2.6   2.0
[19,]  1.8  2.2  3.0  1.4  2.6  1.8  2.8  2.8  3.0   3.0
[20,]  1.4  1.4  2.6  1.2  2.8  3.0  2.0  1.0  2.2   2.8
© www.soinside.com 2019 - 2024. All rights reserved.