【问题标题】:How to assign a set of numbers randomly to a matrix in R如何将一组数字随机分配给R中的矩阵
【发布时间】:2018-06-04 02:14:20
【问题描述】:

我需要为矩阵随机分配固定数字,比如“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

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

非常感谢

【问题讨论】:

  • matrix(sample(c(1, 1.2), 20*10, replace=TRUE), ncol=10) ?
  • 它有效。非常感谢。我需要每个数字在每一行中至少出现一次。代码能做到吗?
  • @Fate 为了确保每个数字在每一行中至少出现一次,您需要更像t(replicate(20, sample(c(1, 1.2), 10, replace = TRUE)))
  • @duckmayr 请修改您的答案。你的说法不正确。例如 set.seed(7) 给出第 14 行仅包含 1.2
  • @nadizan 够公平的;很快就会做

标签: r matrix


【解决方案1】:

解决方案

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

说明

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 次,然后将答案转换为您想要的尺寸。

更新

在额外的 cmets 之后,您似乎需要能够完成两件不同的事情:

  1. 创建一个 n × m 矩阵,随机填充 x 的值,但要满足以下条件:结果矩阵的每一行至少包含一次 x 的每个元素。
  2. 创建一个 n x m 矩阵,其中随机填充 x 的值,但要满足结果矩阵的每一行具有多个唯一值的约束。

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

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() 完成了我对任意xnm 的原始答案(对应于上面的数字1)。 f2() 完成新的请求(对应上面的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

【讨论】:

  • 非常感谢您的全面解释。有用。但是,当我有一组 15 个数字并且我想制作一个随机的 20*10 矩阵,每行至少有一个不同的元素时,可以使用它吗?我的意思是我想制作一个没有所有相同元素的行的矩阵。我希望我的行至少有一个不同的元素。
  • 这行得通吗? t(replicate(20, sample(c(1, sample(c(1, 1.2,1.4,1.6,1.8,2,2.2,2.4,2.6,2.8,3,3.2,3.4,3.6,3.8), 9, 替换=真))))))。但不是。在这里,我告诉 R 每行至少有 1 次。这不是我想要的。
  • @Fate 我已经更新了我的答案,以考虑这个问题的新转折。
  • 非常感谢。是的,我有两个不同的问题:1-如何制作一个矩阵,其中每个数字在每行中至少出现一次 2-如何制作一个矩阵,其中每一行都有多个值。在问题 2 中,我不希望每个数字在每一行中至少出现一次。您的功能运行良好。非常感谢。你太有见识了你能推荐一些我可以学习R编程的书吗?非常感谢
  • @Fate 使用(伪)随机数生成时,设置随机数生成器使用的种子可确保其他人在运行您的代码时获得完全相同的结果,尽管代码中的步骤是随机的.阅读此内容的好来源是 this SO questionWikipedia for pseudo-random number generation,当然还有在 R 中运行 help("set.seed")
猜你喜欢
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多